diff --git a/.gn b/.gn
index 9dc1fd1..ddf99d1d 100644
--- a/.gn
+++ b/.gn
@@ -66,7 +66,6 @@
   "//extensions:*",  # 28 errors
   "//headless:*",  # 107 errors
   "//ppapi/proxy:ipc_sources",  # 13 errors
-  "//remoting/host/security_key:*",  # 10 errors
 
   "//third_party/icu/*",
   "//third_party/libwebp:*",  # 7 errors, https://crbug.com/800762
diff --git a/DEPS b/DEPS
index 46483c5..a0ff6d8d 100644
--- a/DEPS
+++ b/DEPS
@@ -232,7 +232,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '97d3cf7155699a542d204a1627b44e0a5d4d6700',
+  'v8_revision': '76d48acb02956cbee98234f32e7167a7750a0497',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -240,7 +240,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': '17d4ff96ce5c3de106056ccb6a77b0ea6247a865',
+  'angle_revision': 'd25c9d7f5bb02ec22e6b9f519e69dc84c4bb2150',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -263,7 +263,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling googletest
   # and whatever else without interference from each other.
-  'googletest_revision': 'aefb45469ee7e6bde0cd1d2c18412046c30e7bb6',
+  'googletest_revision': '47f819c3ca54fb602f432904443e00a0a1fe2f42',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lighttpd
   # and whatever else without interference from each other.
@@ -307,7 +307,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': 'b2e972040c77a12d84f8c62615ba339ddec31d55',
+  'devtools_frontend_revision': '4fbcf694489cacb3afc5e8d8094bf33cdee3adb6',
   # 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.
@@ -347,7 +347,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '27e17a6aad1f80786baa413b67e054a40e119ab2',
+  'dawn_revision': 'ebbbcc7ecb1cbbaf4c5c12b701c650244dfc7e20',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -395,7 +395,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'libunwind_revision':    'b79b97c1f6adf97270247f8cc8dfafa19b971453',
+  'libunwind_revision':    'b825591df326b2725e6b88bdf74fdc88fefdf460',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -680,7 +680,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'amVpB5q-1q110LLJIIICa9SDmZizR4n11Voq4Cn1lS4C',
+          'version': 'dCOUi-Tw09Tp8zpf2DN5xByU5-gclQFP49fVXVGQhu4C',
         },
       ],
       'dep_type': 'cipd',
@@ -691,7 +691,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'Gr6PBXgVPpEE-GR9d1NMYLS2tDmY5g7RDA9oWYXdNeIC',
+          'version': 'uYQzpz0XiYksg5Kn-PkN6qQujpNxtNpEPwZ0-rSgidIC',
         },
       ],
       'dep_type': 'cipd',
@@ -702,7 +702,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'KU_lZNMQnNYPCEIMjpjZ4SrP-wIRO2kYpjzMICRZdAMC',
+          'version': 'tFk3EuOjNVHFHHAqlDlbHDXn7rt2uU_72h899JDqGUMC',
         },
       ],
       'dep_type': 'cipd',
@@ -767,7 +767,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'eX56cS56N9qCnvqydGMdLomSzdAsiZCC3_miMAh-K_wC',
+          'version': '2x0RaVwBwxRoEqsOfKvBqGyoI_asDh5FLRC5F_o9PiYC',
       },
     ],
     'condition': 'checkout_android',
@@ -932,7 +932,7 @@
   },
 
   'src/third_party/breakpad/breakpad':
-    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'b95c4868b10f69e642666742233aede1eb653012',
+    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'bc7ddae23425cee8999e4e8ed61f77a62f058cbf',
 
   'src/third_party/byte_buddy': {
       'packages': [
@@ -998,12 +998,12 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '551c3b33fd5e15ccb1546dc42a7baca8c8c778fd',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'bb5fb34c30997db4768ffd673f7b436cd9a7414d',
       'condition': 'checkout_linux',
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '24dc2c782364e30b9ba3bf2914502c6dfd3d7c3f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4f3583d6d585894cc99481e7ab850c65e864f968',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1247,7 +1247,7 @@
   },
 
   'src/third_party/libjpeg_turbo':
-    Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + 'ad8b3b0f84baf155f3bde5626c3bf9d20535bcae',
+    Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + 'ff19e5b2e176c61d552f68768e0e051867745321',
 
   'src/third_party/liblouis/src': {
       'url': Var('chromium_git') + '/external/liblouis-github.git' + '@' + '03d7d72d983d47c17f7de95bbeae89fe33e41943',
@@ -1389,7 +1389,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'bb09784511ef291082ade44a2d3d05dd3e45d30d',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '3f8fabd85f1c3c15a2a98a40fe71e3eb165fba5e',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1497,7 +1497,7 @@
   },
 
   'src/third_party/re2/src':
-    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'f275e378b27baad9da568a026d73a02e40628936',
+    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'b25b8bb5c0e3b4717418279a1a764a6b20ade26b',
 
   'src/third_party/r8': {
       'packages': [
@@ -1618,7 +1618,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'ad1419557298bfa2829818c12ae3bca2795a7c8f',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0e845f4383ecdee114e9011ba2e903a061b9adff',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'b46ab16f9798d2cb78e7f9f34f76d4f2470ba48a',
 
   'src/third_party/webrtc':
     Var('webrtc_git') + '/src.git' + '@' + 'cfea2182f8e41c3d8293d4e26b291ef2abf23257',
@@ -1682,7 +1682,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0f82339b7e2653030bd70cfe9c33c5876dddc7ad',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0e8a492cf58f73346ac71ef2fceb7a94580f9b32',
     'condition': 'checkout_src_internal',
   },
 
@@ -1701,7 +1701,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'JlJpuj6Ro65BFkAoQOPvIsrhMJEugNDa5Ysl8NvdHZMC',
+        'version': 'xSFkgMwQL8pMScB1g6mTu2VU6pdi4SgmYe_IMmRsflIC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 7260789..fcb44ba 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -18,6 +18,7 @@
 #include "android_webview/browser/aw_devtools_manager_delegate.h"
 #include "android_webview/browser/aw_feature_list_creator.h"
 #include "android_webview/browser/aw_http_auth_handler.h"
+#include "android_webview/browser/aw_print_manager.h"
 #include "android_webview/browser/aw_quota_permission_context.h"
 #include "android_webview/browser/aw_resource_context.h"
 #include "android_webview/browser/aw_settings.h"
@@ -645,6 +646,13 @@
         render_frame_host);
     return true;
   }
+  if (interface_name == printing::mojom::PrintManagerHost::Name_) {
+    AwPrintManager::BindPrintManagerHost(
+        mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>(
+            std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
   if (interface_name ==
       security_interstitials::mojom::InterstitialCommands::Name_) {
     security_interstitials::SecurityInterstitialTabHelper::
diff --git a/android_webview/browser/aw_print_manager.cc b/android_webview/browser/aw_print_manager.cc
index 8d0c874..af8577fa 100644
--- a/android_webview/browser/aw_print_manager.cc
+++ b/android_webview/browser/aw_print_manager.cc
@@ -41,6 +41,19 @@
 
 AwPrintManager::~AwPrintManager() = default;
 
+// static
+void AwPrintManager::BindPrintManagerHost(
+    mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* print_manager = AwPrintManager::FromWebContents(web_contents);
+  if (!print_manager)
+    return;
+  print_manager->BindReceiver(std::move(receiver), rfh);
+}
+
 void AwPrintManager::PdfWritingDone(int page_count) {
   pdf_writing_done_callback().Run(page_count);
   // Invalidate the file descriptor so it doesn't get reused.
diff --git a/android_webview/browser/aw_print_manager.h b/android_webview/browser/aw_print_manager.h
index 1a0ddc1..c11ac76 100644
--- a/android_webview/browser/aw_print_manager.h
+++ b/android_webview/browser/aw_print_manager.h
@@ -20,6 +20,11 @@
  public:
   ~AwPrintManager() override;
 
+  static void BindPrintManagerHost(
+      mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>
+          receiver,
+      content::RenderFrameHost* rfh);
+
   // printing::PrintManager:
   void PdfWritingDone(int page_count) override;
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
index 8aba31a..689ee2a 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -46,6 +46,13 @@
 
     private static final String TAG = "AwSettings";
 
+    // These values are persisted to logs. Entries should not be renumbered and
+    // numeric values should never be reused.
+    private static final int OS_NIGHT_MODE_UNDEFINED = 0 * AwSettings.FORCE_DARK_MODES_COUNT;
+    private static final int OS_NIGHT_MODE_NO = 1 * AwSettings.FORCE_DARK_MODES_COUNT;
+    private static final int OS_NIGHT_MODE_YES = 2 * AwSettings.FORCE_DARK_MODES_COUNT;
+    private static final int UMA_FORCE_DARK_MODE_MAX_VALUE = 3 * AwSettings.FORCE_DARK_MODES_COUNT;
+
     /* See {@link android.webkit.WebSettings}. */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({LAYOUT_ALGORITHM_NORMAL,
@@ -306,10 +313,6 @@
         // Defer initializing the native side until a native WebContents instance is set.
     }
 
-    public int getUiModeNight() {
-        return mContext.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
-    }
-
     @CalledByNative
     private void nativeAwSettingsGone(long nativeAwSettings) {
         assert mNativeAwSettings != 0 && mNativeAwSettings == nativeAwSettings;
@@ -1740,6 +1743,7 @@
     }
 
     public void setForceDarkMode(@ForceDarkMode int forceDarkMode) {
+        recordForceDarkMode(forceDarkMode);
         synchronized (mAwSettingsLock) {
             if (mForceDarkMode != forceDarkMode) {
                 mForceDarkMode = forceDarkMode;
@@ -1748,6 +1752,26 @@
         }
     }
 
+    private int getOsNightMode() {
+        int osNightMode = mContext.getResources().getConfiguration().uiMode
+                & Configuration.UI_MODE_NIGHT_MASK;
+        switch (osNightMode) {
+            case Configuration.UI_MODE_NIGHT_NO:
+                return OS_NIGHT_MODE_NO;
+            case Configuration.UI_MODE_NIGHT_YES:
+                return OS_NIGHT_MODE_YES;
+            case Configuration.UI_MODE_NIGHT_UNDEFINED:
+            default:
+                return OS_NIGHT_MODE_UNDEFINED;
+        }
+    }
+
+    private void recordForceDarkMode(int forceDarkMode) {
+        int value = getOsNightMode() + forceDarkMode;
+        RecordHistogram.recordEnumeratedHistogram(
+                "Android.WebView.ForceDarkMode", value, UMA_FORCE_DARK_MODE_MAX_VALUE);
+    }
+
     public boolean isDarkMode() {
         synchronized (mAwSettingsLock) {
             assert mNativeAwSettings != 0;
@@ -1770,6 +1794,7 @@
     }
 
     public void setForceDarkBehavior(@ForceDarkBehavior int forceDarkBehavior) {
+        recordForceDarkBehavior(forceDarkBehavior);
         synchronized (mAwSettingsLock) {
             if (mForceDarkBehavior != forceDarkBehavior) {
                 mForceDarkBehavior = forceDarkBehavior;
@@ -1778,6 +1803,11 @@
         }
     }
 
+    private void recordForceDarkBehavior(@ForceDarkBehavior int forceDarkBehavior) {
+        RecordHistogram.recordEnumeratedHistogram("Android.WebView.ForceDarkBehavior",
+                forceDarkBehavior, AwSettings.FORCE_DARK_STRATEGY_COUNT);
+    }
+
     @CalledByNative
     private boolean getAllowRunningInsecureContentLocked() {
         assert Thread.holdsLock(mAwSettingsLock);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
index 8c2f363..0013c31 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
@@ -48,7 +48,6 @@
 import androidx.test.espresso.DataInteraction;
 import androidx.test.espresso.intent.Intents;
 import androidx.test.espresso.intent.matcher.IntentMatchers;
-import androidx.test.espresso.intent.rule.IntentsTestRule;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
 
@@ -75,10 +74,11 @@
 import org.chromium.android_webview.devui.util.WebViewPackageHelper;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
 import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.FileUtils;
+import org.chromium.base.test.BaseActivityTestRule;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.components.minidump_uploader.CrashFileManager;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -104,26 +104,30 @@
     private static final String CRASH_UPLOAD_BUTTON_TEXT = "Upload this crash report";
 
     @Rule
-    public IntentsTestRule mRule =
-            new IntentsTestRule<MainActivity>(MainActivity.class, false, false);
+    public BaseActivityTestRule mRule = new BaseActivityTestRule<MainActivity>(MainActivity.class);
 
     @After
     public void tearDown() {
         FileUtils.recursivelyDeleteFile(SystemWideCrashDirectories.getWebViewCrashDir(), null);
         FileUtils.recursivelyDeleteFile(SystemWideCrashDirectories.getWebViewCrashLogDir(), null);
+
         // Activity is launched, i.e the test is not skipped.
         if (mRule.getActivity() != null) {
             // Tests are responsible for verifying every Intent they trigger.
             assertNoUnverifiedIntents();
+            Intents.release();
         }
     }
 
     private void launchCrashesFragment() {
-        Intent intent = new Intent();
+        Intent intent = new Intent(ContextUtils.getApplicationContext(), MainActivity.class);
         intent.putExtra(MainActivity.FRAGMENT_ID_INTENT_EXTRA, MainActivity.FRAGMENT_ID_CRASHES);
         mRule.launchActivity(intent);
         onView(withId(R.id.fragment_crashes_list)).check(matches(isDisplayed()));
 
+        // Only start recording intents after launching the MainActivity.
+        Intents.init();
+
         // Stub all external intents, to avoid launching other apps (ex. system browser), has to be
         // done after launching the activity.
         intending(not(IntentMatchers.isInternal()))
@@ -1050,7 +1054,6 @@
     @Test
     @MediumTest
     @Feature({"AndroidWebView"})
-    @DisabledTest(message = "https://crbug.com/1231595")
     public void testConsentErrorMessage_shown_canUseGms() throws Throwable {
         Context context = InstrumentationRegistry.getTargetContext();
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java
index 081151c..b799beb9 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java
@@ -31,13 +31,12 @@
 import android.provider.Settings;
 import android.support.test.InstrumentationRegistry;
 
+import androidx.test.espresso.intent.Intents;
 import androidx.test.espresso.intent.matcher.IntentMatchers;
-import androidx.test.espresso.intent.rule.IntentsTestRule;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
 import org.junit.Assume;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,6 +44,7 @@
 import org.chromium.android_webview.devui.MainActivity;
 import org.chromium.android_webview.devui.R;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
+import org.chromium.base.test.BaseActivityTestRule;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 
@@ -61,25 +61,36 @@
     public static final String TEST_WEBVIEW_APPLICATION_LABEL = "AwShellApplication";
 
     @Rule
-    public IntentsTestRule mRule = new IntentsTestRule<MainActivity>(MainActivity.class);
+    public BaseActivityTestRule mRule = new BaseActivityTestRule<MainActivity>(MainActivity.class);
 
-    @Before
-    public void setUp() throws Exception {
-        // Stub all external intents, to avoid launching other apps (ex. system browser).
+    private void launchHomeFragment() {
+        mRule.launchActivity(null);
+
+        // Only start recording intents after launching the MainActivity.
+        Intents.init();
+
+        // Stub all external intents, to avoid launching other apps (ex. system browser), has to be
+        // done after launching the activity.
         intending(not(IntentMatchers.isInternal()))
                 .respondWith(new ActivityResult(Activity.RESULT_OK, null));
     }
 
     @After
     public void tearDown() throws Exception {
-        // Tests are responsible for verifyhing every Intent they trigger.
-        assertNoUnverifiedIntents();
+        // Activity is launched, i.e the test is not skipped.
+        if (mRule.getActivity() != null) {
+            // Tests are responsible for verifying every Intent they trigger.
+            assertNoUnverifiedIntents();
+            Intents.release();
+        }
     }
 
     @Test
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testOpensHomeFragmentByDefault() throws Throwable {
+        launchHomeFragment();
+
         onView(withId(R.id.fragment_home)).check(matches(isDisplayed()));
         onView(withId(R.id.navigation_home))
                 .check(matches(hasTextColor(R.color.navigation_selected)));
@@ -93,6 +104,8 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testNavigateBetweenFragments() throws Throwable {
+        launchHomeFragment();
+
         // HomeFragment -> CrashesListFragment
         onView(withId(R.id.navigation_crash_ui)).perform(click());
         onView(withId(R.id.fragment_home)).check(doesNotExist());
@@ -134,6 +147,8 @@
         Assume.assumeTrue("This test verifies behavior introduced in Nougat and above",
                 Build.VERSION.SDK_INT >= Build.VERSION_CODES.N);
 
+        launchHomeFragment();
+
         openActionBarOverflowOrOptionsMenu(
                 InstrumentationRegistry.getInstrumentation().getTargetContext());
         onView(withText("Change WebView Provider")).check(matches(isDisplayed()));
@@ -147,6 +162,9 @@
     public void testMenuOptions_switchProvider_notShown() throws Throwable {
         Assume.assumeTrue("This test verifies pre-Nougat behavior",
                 Build.VERSION.SDK_INT < Build.VERSION_CODES.N);
+
+        launchHomeFragment();
+
         openActionBarOverflowOrOptionsMenu(
                 InstrumentationRegistry.getInstrumentation().getTargetContext());
         onView(withId(R.id.options_menu_switch_provider)).check(doesNotExist());
@@ -156,6 +174,8 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testMenuOptions_reportBug() throws Throwable {
+        launchHomeFragment();
+
         openActionBarOverflowOrOptionsMenu(
                 InstrumentationRegistry.getInstrumentation().getTargetContext());
 
@@ -174,6 +194,8 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testMenuOptions_checkUpdates_withPlayStore() throws Throwable {
+        launchHomeFragment();
+
         // Stub out the Intent to the Play Store, to verify the case where the Play Store Intent
         // resolves.
         // TODO(ntfschr): figure out how to stub startActivity to throw an exception, to verify the
@@ -200,6 +222,8 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testMenuOptions_aboutDevTools() throws Throwable {
+        launchHomeFragment();
+
         openActionBarOverflowOrOptionsMenu(
                 InstrumentationRegistry.getInstrumentation().getTargetContext());
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
index 556ddc5..23a40f0 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
@@ -28,7 +28,6 @@
 import android.app.Activity;
 import android.app.Instrumentation.ActivityResult;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.os.Build;
 import android.provider.Settings;
@@ -36,7 +35,6 @@
 
 import androidx.test.espresso.intent.Intents;
 import androidx.test.espresso.intent.matcher.IntentMatchers;
-import androidx.test.espresso.intent.rule.IntentsTestRule;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
@@ -50,6 +48,7 @@
 import org.chromium.android_webview.devui.WebViewPackageError;
 import org.chromium.android_webview.devui.util.WebViewPackageHelper;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
+import org.chromium.base.test.BaseActivityTestRule;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 
@@ -69,8 +68,7 @@
     }
 
     @Rule
-    public IntentsTestRule mRule =
-            new IntentsTestRule<MainActivity>(MainActivity.class, false, false);
+    public BaseActivityTestRule mRule = new BaseActivityTestRule<MainActivity>(MainActivity.class);
 
     @After
     public void tearDown() {
@@ -78,17 +76,15 @@
         if (mRule.getActivity() != null) {
             // Tests are responsible for verifying every Intent they trigger.
             assertNoUnverifiedIntents();
-        } else {
-            // IntentsTestRule assumes the Activity was started when tearing down the rule, so we
-            // need to work around that.
-            Intents.init();
+            Intents.release();
         }
     }
 
     private void launchHomeFragment() {
-        Intent intent = new Intent();
-        intent.putExtra(MainActivity.FRAGMENT_ID_INTENT_EXTRA, MainActivity.FRAGMENT_ID_HOME);
-        mRule.launchActivity(intent);
+        mRule.launchActivity(null);
+
+        // Only start recording intents after launching the MainActivity.
+        Intents.init();
 
         // Stub all external intents, to avoid launching other apps (ex. system browser), has to be
         // done after launching the activity.
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
index aaf9d44..14c40f2 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
@@ -6,10 +6,7 @@
 
 import static org.chromium.support_lib_glue.SupportLibWebViewChromiumFactory.recordApiCall;
 
-import android.content.res.Configuration;
-
 import org.chromium.android_webview.AwSettings;
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.support_lib_boundary.WebSettingsBoundaryInterface;
 import org.chromium.support_lib_glue.SupportLibWebViewChromiumFactory.ApiCall;
 
@@ -19,13 +16,6 @@
 class SupportLibWebSettingsAdapter implements WebSettingsBoundaryInterface {
     private final AwSettings mAwSettings;
 
-    // These values are persisted to logs. Entries should not be renumbered and
-    // numeric values should never be reused.
-    private static final int OS_NIGHT_MODE_UNDEFINED = 0 * AwSettings.FORCE_DARK_MODES_COUNT;
-    private static final int OS_NIGHT_MODE_NO = 1 * AwSettings.FORCE_DARK_MODES_COUNT;
-    private static final int OS_NIGHT_MODE_YES = 2 * AwSettings.FORCE_DARK_MODES_COUNT;
-    private static final int UMA_FORCE_DARK_MODE_MAX_VALUE = 3 * AwSettings.FORCE_DARK_MODES_COUNT;
-
     public SupportLibWebSettingsAdapter(AwSettings awSettings) {
         mAwSettings = awSettings;
     }
@@ -81,7 +71,6 @@
     @Override
     public void setForceDark(int forceDarkMode) {
         recordApiCall(ApiCall.WEB_SETTINGS_SET_FORCE_DARK);
-        recordForceDarkMode(forceDarkMode);
         mAwSettings.setForceDarkMode(forceDarkMode);
     }
 
@@ -94,7 +83,6 @@
     @Override
     public void setForceDarkBehavior(int forceDarkBehavior) {
         recordApiCall(ApiCall.WEB_SETTINGS_SET_FORCE_DARK_BEHAVIOR);
-        recordForceDarkBehavior(forceDarkBehavior);
         switch (forceDarkBehavior) {
             case ForceDarkBehavior.FORCE_DARK_ONLY:
                 mAwSettings.setForceDarkBehavior(AwSettings.FORCE_DARK_ONLY);
@@ -121,28 +109,4 @@
         }
         return ForceDarkBehavior.PREFER_MEDIA_QUERY_OVER_FORCE_DARK;
     }
-
-    private void recordForceDarkMode(int forceDarkMode) {
-        int value = getOsNightMode() + forceDarkMode;
-        RecordHistogram.recordEnumeratedHistogram(
-                "Android.WebView.ForceDarkMode", value, UMA_FORCE_DARK_MODE_MAX_VALUE);
-    }
-
-    private void recordForceDarkBehavior(int forceDarkBehavior) {
-        RecordHistogram.recordEnumeratedHistogram("Android.WebView.ForceDarkBehavior",
-                forceDarkBehavior, AwSettings.FORCE_DARK_STRATEGY_COUNT);
-    }
-
-    private int getOsNightMode() {
-        int osNightMode = mAwSettings.getUiModeNight();
-        switch (osNightMode) {
-            case Configuration.UI_MODE_NIGHT_NO:
-                return OS_NIGHT_MODE_NO;
-            case Configuration.UI_MODE_NIGHT_YES:
-                return OS_NIGHT_MODE_YES;
-            case Configuration.UI_MODE_NIGHT_UNDEFINED:
-            default:
-                return OS_NIGHT_MODE_UNDEFINED;
-        }
-    }
 }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 80e1cd4..155708e 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -947,8 +947,8 @@
     "system/audio/unified_volume_view.h",
     "system/bluetooth/bluetooth_detailed_view_legacy.cc",
     "system/bluetooth/bluetooth_detailed_view_legacy.h",
-    "system/bluetooth/bluetooth_feature_pod_controller.cc",
-    "system/bluetooth/bluetooth_feature_pod_controller.h",
+    "system/bluetooth/bluetooth_feature_pod_controller_legacy.cc",
+    "system/bluetooth/bluetooth_feature_pod_controller_legacy.h",
     "system/bluetooth/bluetooth_notification_controller.cc",
     "system/bluetooth/bluetooth_notification_controller.h",
     "system/bluetooth/bluetooth_power_controller.cc",
diff --git a/ash/accessibility/accessibility_controller_impl.cc b/ash/accessibility/accessibility_controller_impl.cc
index 1f97b0a..4f2ec98 100644
--- a/ash/accessibility/accessibility_controller_impl.cc
+++ b/ash/accessibility/accessibility_controller_impl.cc
@@ -290,22 +290,6 @@
   }
 }
 
-// Used to indicate which accessibility notification should be shown.
-enum class A11yNotificationType {
-  // No accessibility notification.
-  kNone,
-  // Shown when spoken feedback is set enabled with A11Y_NOTIFICATION_SHOW.
-  kSpokenFeedbackEnabled,
-  // Shown when braille display is connected while spoken feedback is enabled.
-  kBrailleDisplayConnected,
-  // Shown when braille display is connected while spoken feedback is not
-  // enabled yet. Note: in this case braille display connected would enable
-  // spoken feeback.
-  kSpokenFeedbackBrailleEnabled,
-  // Shown when Switch Access is enabled.
-  kSwitchAccessEnabled,
-};
-
 // Returns notification icon based on the A11yNotificationType.
 const gfx::VectorIcon& GetNotificationIcon(A11yNotificationType type) {
   switch (type) {
@@ -315,12 +299,18 @@
       return kNotificationAccessibilityBrailleIcon;
     case A11yNotificationType::kSwitchAccessEnabled:
       return kSwitchAccessIcon;
+    case A11yNotificationType::kSpeechRecognitionFilesDownloaded:
+    case A11yNotificationType::kSpeechRecognitionFilesFailed:
+      return kDictationMenuIcon;
     default:
       return kNotificationChromevoxIcon;
   }
 }
 
-void ShowAccessibilityNotification(A11yNotificationType type) {
+void ShowAccessibilityNotification(
+    const AccessibilityControllerImpl::A11yNotificationWrapper& wrapper) {
+  A11yNotificationType type = wrapper.type;
+  const auto& replacements = wrapper.replacements;
   message_center::MessageCenter* message_center =
       message_center::MessageCenter::Get();
   message_center->RemoveNotification(kNotificationId, false /* by_user */);
@@ -330,6 +320,9 @@
 
   std::u16string text;
   std::u16string title;
+  message_center::SystemNotificationWarningLevel warning =
+      message_center::SystemNotificationWarningLevel::NORMAL;
+  std::u16string display_source;
   if (type == A11yNotificationType::kBrailleDisplayConnected) {
     text = l10n_util::GetStringUTF16(
         IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED);
@@ -337,6 +330,24 @@
     title = l10n_util::GetStringUTF16(
         IDS_ASH_STATUS_TRAY_SWITCH_ACCESS_ENABLED_TITLE);
     text = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SWITCH_ACCESS_ENABLED);
+  } else if (type == A11yNotificationType::kSpeechRecognitionFilesDownloaded) {
+    display_source =
+        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_DICTATION);
+    title = l10n_util::GetStringFUTF16(
+        IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_TITLE,
+        replacements, nullptr);
+    text = l10n_util::GetStringUTF16(
+        IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_DESC);
+  } else if (type == A11yNotificationType::kSpeechRecognitionFilesFailed) {
+    display_source =
+        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_DICTATION);
+    title = l10n_util::GetStringFUTF16(
+        IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_TITLE,
+        replacements, nullptr);
+    text = l10n_util::GetStringUTF16(
+        IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_DESC);
+    // Use CRITICAL_WARNING to force the notification color to red.
+    warning = message_center::SystemNotificationWarningLevel::CRITICAL_WARNING;
   } else {
     bool is_tablet = Shell::Get()->tablet_mode_controller()->InTabletMode();
 
@@ -353,16 +364,21 @@
   std::unique_ptr<message_center::Notification> notification =
       ash::CreateSystemNotification(
           message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, title,
-          text, std::u16string(), GURL(),
+          text, display_source, GURL(),
           message_center::NotifierId(
               message_center::NotifierType::SYSTEM_COMPONENT,
               kNotifierAccessibility),
-          options, nullptr, GetNotificationIcon(type),
-          message_center::SystemNotificationWarningLevel::NORMAL);
+          options, nullptr, GetNotificationIcon(type), warning);
   notification->set_pinned(true);
   message_center->AddNotification(std::move(notification));
 }
 
+void RemoveAccessibilityNotification() {
+  ShowAccessibilityNotification(
+      AccessibilityControllerImpl::A11yNotificationWrapper(
+          A11yNotificationType::kNone, std::vector<std::u16string>()));
+}
+
 AccessibilityPanelLayoutManager* GetLayoutManager() {
   // The accessibility panel is only shown on the primary display.
   aura::Window* root = Shell::GetPrimaryRootWindow();
@@ -642,8 +658,8 @@
       prefs::kAccessibilityTabletModeShelfNavigationButtonsEnabled, false);
 
   // Not syncable because it might change depending on application locale,
-  // user settings, and because different languages can cause SODA
-  // speech recognition download.
+  // user settings, and because different languages can cause speech recognition
+  // files to download.
   registry->RegisterStringPref(prefs::kAccessibilityDictationLocale,
                                std::string());
   registry->RegisterDictionaryPref(
@@ -998,7 +1014,8 @@
   A11yNotificationType type = A11yNotificationType::kNone;
   if (enabled && actual_enabled && notify == A11Y_NOTIFICATION_SHOW)
     type = A11yNotificationType::kSpokenFeedbackEnabled;
-  ShowAccessibilityNotification(type);
+  ShowAccessibilityNotification(
+      A11yNotificationWrapper(type, std::vector<std::u16string>()));
 }
 
 bool AccessibilityControllerImpl::IsSpokenFeedbackSettingVisibleInTray() {
@@ -1325,7 +1342,8 @@
     SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_NONE);
   NotifyAccessibilityStatusChanged();
 
-  ShowAccessibilityNotification(type);
+  ShowAccessibilityNotification(
+      A11yNotificationWrapper(type, std::vector<std::u16string>()));
 }
 
 void AccessibilityControllerImpl::SetFocusHighlightRect(
@@ -1403,12 +1421,16 @@
 
 void AccessibilityControllerImpl::OnTabletModeStarted() {
   if (spoken_feedback().enabled())
-    ShowAccessibilityNotification(A11yNotificationType::kSpokenFeedbackEnabled);
+    ShowAccessibilityNotification(
+        A11yNotificationWrapper(A11yNotificationType::kSpokenFeedbackEnabled,
+                                std::vector<std::u16string>()));
 }
 
 void AccessibilityControllerImpl::OnTabletModeEnded() {
   if (spoken_feedback().enabled())
-    ShowAccessibilityNotification(A11yNotificationType::kSpokenFeedbackEnabled);
+    ShowAccessibilityNotification(
+        A11yNotificationWrapper(A11yNotificationType::kSpokenFeedbackEnabled,
+                                std::vector<std::u16string>()));
 }
 
 void AccessibilityControllerImpl::ObservePrefs(PrefService* prefs) {
@@ -1882,7 +1904,9 @@
     return;
   }
 
-  ShowAccessibilityNotification(A11yNotificationType::kSwitchAccessEnabled);
+  ShowAccessibilityNotification(
+      A11yNotificationWrapper(A11yNotificationType::kSwitchAccessEnabled,
+                              std::vector<std::u16string>()));
 }
 
 void AccessibilityControllerImpl::DeactivateSwitchAccess() {
@@ -2007,15 +2031,38 @@
   confirmation_dialog_ = dialog->GetWeakPtr();
 }
 
-void AccessibilityControllerImpl::UpdateDictationButtonOnSodaChanged(
-    bool soda_download_in_progress) {
+void AccessibilityControllerImpl::
+    UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+        bool download_in_progress) {
   Shell::Get()
       ->GetPrimaryRootWindowController()
       ->GetStatusAreaWidget()
       ->dictation_button_tray()
-      ->UpdateOnSodaChanged(soda_download_in_progress);
+      ->UpdateOnSpeechRecognitionDownloadChanged(download_in_progress);
 }
 
+void AccessibilityControllerImpl::
+    ShowSpeechRecognitionDownloadNotificationForDictation(
+        bool succeeded,
+        const std::u16string& display_language) {
+  A11yNotificationType type =
+      succeeded ? A11yNotificationType::kSpeechRecognitionFilesDownloaded
+                : A11yNotificationType::kSpeechRecognitionFilesFailed;
+  ShowAccessibilityNotification(A11yNotificationWrapper(
+      type, std::vector<std::u16string>{display_language}));
+}
+
+AccessibilityControllerImpl::A11yNotificationWrapper::
+    A11yNotificationWrapper() = default;
+AccessibilityControllerImpl::A11yNotificationWrapper::A11yNotificationWrapper(
+    A11yNotificationType type_in,
+    std::vector<std::u16string> replacements_in)
+    : type(type_in), replacements(replacements_in) {}
+AccessibilityControllerImpl::A11yNotificationWrapper::
+    ~A11yNotificationWrapper() = default;
+AccessibilityControllerImpl::A11yNotificationWrapper::A11yNotificationWrapper(
+    const A11yNotificationWrapper&) = default;
+
 void AccessibilityControllerImpl::UpdateFeatureFromPref(FeatureType feature) {
   bool enabled = features_[feature]->enabled();
 
@@ -2087,7 +2134,7 @@
       break;
     case FeatureType::kSwitchAccess:
       if (!enabled) {
-        ShowAccessibilityNotification(A11yNotificationType::kNone);
+        RemoveAccessibilityNotification();
         if (no_switch_access_disable_confirmation_dialog_for_testing_) {
           SwitchAccessDisableDialogClosed(true);
         } else {
diff --git a/ash/accessibility/accessibility_controller_impl.h b/ash/accessibility/accessibility_controller_impl.h
index 0ab6e770..193d836 100644
--- a/ash/accessibility/accessibility_controller_impl.h
+++ b/ash/accessibility/accessibility_controller_impl.h
@@ -58,6 +58,26 @@
   A11Y_NOTIFICATION_SHOW,
 };
 
+// Used to indicate which accessibility notification should be shown.
+enum class A11yNotificationType {
+  // No accessibility notification.
+  kNone,
+  // Shown when spoken feedback is set enabled with A11Y_NOTIFICATION_SHOW.
+  kSpokenFeedbackEnabled,
+  // Shown when braille display is connected while spoken feedback is enabled.
+  kBrailleDisplayConnected,
+  // Shown when braille display is connected while spoken feedback is not
+  // enabled yet. Note: in this case braille display connected would enable
+  // spoken feedback.
+  kSpokenFeedbackBrailleEnabled,
+  // Shown when Switch Access is enabled.
+  kSwitchAccessEnabled,
+  // Shown when speech recognition files download successfully.
+  kSpeechRecognitionFilesDownloaded,
+  // Shown when speech recognition files download fails.
+  kSpeechRecognitionFilesFailed,
+};
+
 // The controller for accessibility features in ash. Features can be enabled
 // in chrome's webui settings or the system tray menu (see TrayAccessibility).
 // Uses preferences to communicate with chrome to support mash.
@@ -162,6 +182,18 @@
     Dialog dialog_;
   };
 
+  // Contains data used to give an accessibility-related notification.
+  struct A11yNotificationWrapper {
+    A11yNotificationWrapper();
+    A11yNotificationWrapper(A11yNotificationType type_in,
+                            std::vector<std::u16string> replacements_in);
+    ~A11yNotificationWrapper();
+    A11yNotificationWrapper(const A11yNotificationWrapper&);
+
+    A11yNotificationType type = A11yNotificationType::kNone;
+    std::vector<std::u16string> replacements;
+  };
+
   AccessibilityControllerImpl();
   ~AccessibilityControllerImpl() override;
 
@@ -402,8 +434,11 @@
                               base::OnceClosure on_accept_callback,
                               base::OnceClosure on_cancel_callback,
                               base::OnceClosure on_close_callback) override;
-  void UpdateDictationButtonOnSodaChanged(
-      bool soda_download_in_progress) override;
+  void UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+      bool download_in_progress) override;
+  void ShowSpeechRecognitionDownloadNotificationForDictation(
+      bool succeeded,
+      const std::u16string& display_language) override;
 
   // SessionObserver:
   void OnSigninScreenPrefServiceInitialized(PrefService* prefs) override;
diff --git a/ash/accessibility/accessibility_controller_unittest.cc b/ash/accessibility/accessibility_controller_unittest.cc
index 6550a14..322f2f9 100644
--- a/ash/accessibility/accessibility_controller_unittest.cc
+++ b/ash/accessibility/accessibility_controller_unittest.cc
@@ -1008,6 +1008,47 @@
   controller->RemoveObserver(&observer);
 }
 
+TEST_F(AccessibilityControllerTest,
+       SpeechRecognitionDownloadSucceededNotification) {
+  const std::u16string kSucceededTitle = u"English speech files downloaded";
+  const std::u16string kSucceededDescription =
+      u"Speech is now processed locally and Dictation works offline";
+  AccessibilityControllerImpl* controller =
+      Shell::Get()->accessibility_controller();
+
+  controller->ShowSpeechRecognitionDownloadNotificationForDictation(true,
+                                                                    u"English");
+  message_center::NotificationList::Notifications notifications =
+      MessageCenter::Get()->GetVisibleNotifications();
+  ASSERT_EQ(1u, notifications.size());
+  EXPECT_EQ(kSucceededTitle, (*notifications.begin())->title());
+  EXPECT_EQ(kSucceededDescription, (*notifications.begin())->message());
+  EXPECT_EQ(u"Dictation", (*notifications.begin())->display_source());
+  EXPECT_EQ(message_center::SystemNotificationWarningLevel::NORMAL,
+            (*notifications.begin())->system_notification_warning_level());
+}
+
+TEST_F(AccessibilityControllerTest,
+       SpeechRecognitionDownloadFailedNotification) {
+  const std::u16string kFailedTitle = u"Couldn't download English speech files";
+  const std::u16string kFailedDescription =
+      u"Download will be attempted later. Speech will be sent to Google for "
+      u"processing for now.";
+  AccessibilityControllerImpl* controller =
+      Shell::Get()->accessibility_controller();
+
+  controller->ShowSpeechRecognitionDownloadNotificationForDictation(false,
+                                                                    u"English");
+  message_center::NotificationList::Notifications notifications =
+      MessageCenter::Get()->GetVisibleNotifications();
+  ASSERT_EQ(1u, notifications.size());
+  EXPECT_EQ(kFailedTitle, (*notifications.begin())->title());
+  EXPECT_EQ(kFailedDescription, (*notifications.begin())->message());
+  EXPECT_EQ(u"Dictation", (*notifications.begin())->display_source());
+  EXPECT_EQ(message_center::SystemNotificationWarningLevel::CRITICAL_WARNING,
+            (*notifications.begin())->system_notification_warning_level());
+}
+
 namespace {
 
 enum class TestUserLoginType {
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 9bccfd93..f7f9f6f5 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -3790,6 +3790,18 @@
       <message name="IDS_ASH_ACCESSIBILITY_DICTATION_BUTTON_TOOLTIP_SODA_DOWNLOADING" desc="A tooltip explaining that speech recognition files are downloading." >
         Downloading speech files
       </message>
+      <message name="IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_TITLE" desc="The title for a notification that is shown when speech recognition files download successfully.">
+        <ph name="Language">$1<ex>English</ex></ph> speech files downloaded
+      </message>
+      <message name="IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_DESC" desc="The text for a notification that is shown when speech recognition files download successfully.">
+        Speech is now processed locally and Dictation works offline
+      </message>
+      <message name="IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_TITLE" desc="The title for a notification that is shown when speech recognition files fail to download.">
+        Couldn't download <ph name="Language">$1<ex>English</ex></ph> speech files
+      </message>
+      <message name="IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_DESC" desc="The text for a notification that is shown when speech recognition files fail to download.">
+        Download will be attempted later. Speech will be sent to Google for processing for now.
+      </message>
 
       <!-- Strings for persistent desks bar-->
       <message name="IDS_ASH_PERSISTENT_DESKS_BAR_CONTEXT_MENU_FEEDBACK" desc="Title of the menu item in the context menu to send feedback.">
diff --git a/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_DESC.png.sha1 b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_DESC.png.sha1
new file mode 100644
index 0000000..869033f
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_DESC.png.sha1
@@ -0,0 +1 @@
+3cc8b3db0fe17cce62761440b2fcc58d1596e543
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_TITLE.png.sha1
new file mode 100644
index 0000000..869033f
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_FAILED_TITLE.png.sha1
@@ -0,0 +1 @@
+3cc8b3db0fe17cce62761440b2fcc58d1596e543
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_DESC.png.sha1 b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_DESC.png.sha1
new file mode 100644
index 0000000..939ed24
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_DESC.png.sha1
@@ -0,0 +1 @@
+96a5bc112508020ed4764f19a922437b1f9a0c86
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_TITLE.png.sha1
new file mode 100644
index 0000000..939ed24
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_A11Y_DICTATION_NOTIFICATION_SODA_DOWNLOAD_SUCCEEDED_TITLE.png.sha1
@@ -0,0 +1 @@
+96a5bc112508020ed4764f19a922437b1f9a0c86
\ No newline at end of file
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index ba085d9..4abf8f85 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1040,10 +1040,6 @@
 const base::Feature kTrilinearFiltering{"TrilinearFiltering",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables the updated cellular activation UI; see go/cros-cellular-design.
-const base::Feature kUpdatedCellularActivationUi{
-    "UpdatedCellularActivationUi", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables using the BluetoothSystem Mojo interface for Bluetooth operations.
 const base::Feature kUseBluetoothSystemInAsh{"UseBluetoothSystemInAsh",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
@@ -1231,10 +1227,6 @@
   return base::FeatureList::IsEnabled(kCalendarView);
 }
 
-bool IsCellularActivationUiEnabled() {
-  return base::FeatureList::IsEnabled(kUpdatedCellularActivationUi);
-}
-
 bool IsClipboardHistoryContextMenuNudgeEnabled() {
   return base::FeatureList::IsEnabled(kClipboardHistoryContextMenuNudge);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index f30ab6e..1970aed 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -391,8 +391,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kTelemetryExtension;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kTrilinearFiltering;
 COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const base::Feature kUpdatedCellularActivationUi;
-COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kUseBluetoothSystemInAsh;
 // Visible for testing. Call UseBrowserSyncConsent() to check the flag.
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -449,7 +447,6 @@
 bool IsBluetoothAdvertisementMonitoringEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsBluetoothRevampEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCalendarViewEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCellularActivationUiEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsClipboardHistoryContextMenuNudgeEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsClipboardHistoryEnabled();
diff --git a/ash/public/cpp/accessibility_controller.h b/ash/public/cpp/accessibility_controller.h
index 5784aba8..7b147dd 100644
--- a/ash/public/cpp/accessibility_controller.h
+++ b/ash/public/cpp/accessibility_controller.h
@@ -168,9 +168,16 @@
                                       base::OnceClosure on_close_callback) {}
 
   // Updates the enabled state and tooltip of the dictation button in the status
-  // tray when SODA download state changes.
-  virtual void UpdateDictationButtonOnSodaChanged(
-      bool soda_download_in_progress) = 0;
+  // tray when speech recognition file download state changes.
+  virtual void UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+      bool download_in_progress) = 0;
+
+  // Shows a notification card in the message center informing the user that
+  // speech recognition files have either downloaded successfully or failed.
+  // Specific to the Dictation feature.
+  virtual void ShowSpeechRecognitionDownloadNotificationForDictation(
+      bool succeeded,
+      const std::u16string& display_language) = 0;
 
  protected:
   AccessibilityController();
diff --git a/ash/shelf/scrollable_shelf_view_unittest.cc b/ash/shelf/scrollable_shelf_view_unittest.cc
index ea15833..0d31b77 100644
--- a/ash/shelf/scrollable_shelf_view_unittest.cc
+++ b/ash/shelf/scrollable_shelf_view_unittest.cc
@@ -606,10 +606,9 @@
   EXPECT_EQ(0, secondary_scrollable_shelf_view->first_tappable_app_index());
 }
 
-// TODO(crbug.com/1236067): This test is flaky. Re-enable once fixed.
 // Verifies that the scrollable shelf in oveflow mode has the correct layout
 // after switching to tablet mode (https://crbug.com/1017979).
-TEST_P(ScrollableShelfViewRTLTest, DISABLED_CorrectUIAfterSwitchingToTablet) {
+TEST_P(ScrollableShelfViewRTLTest, CorrectUIAfterSwitchingToTablet) {
   // Add enough app shortcuts to ensure that at least three pages of icons show.
   for (int i = 0; i < 25; i++)
     AddAppShortcut();
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb
index 9074f65..89bdd3ca 100644
--- a/ash/strings/ash_strings_af.xtb
+++ b/ash/strings/ash_strings_af.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Ontsluit toestel met ouerkode</translation>
 <translation id="4702647871202761252">Privaatheidskerm is af</translation>
 <translation id="4705716602320768426">Dien terugvoer in</translation>
-<translation id="4730258224256997107">Help ons om dit te verbeter!</translation>
 <translation id="4731797938093519117">Ouertoegang</translation>
 <translation id="4734965478015604180">Horisontaal</translation>
 <translation id="4735498845456076464">Die kortpadsleutel <ph name="LAUNCHER_KEY_NAME" /> + syfer het verander. Om funksiesleutels te gebruik, moet jy die <ph name="LAUNCHER_KEY_NAME" />-sleutel + 'n sleutel in die boonste ry druk.</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 5a3bfd2..3cf70db1 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">በወላጅ ኮድ መሣሪያን ክፈት</translation>
 <translation id="4702647871202761252">የግላዊነት ማያ ገጽ ጠፍቷል</translation>
 <translation id="4705716602320768426">የፋይል ግብረመልስ</translation>
-<translation id="4730258224256997107">ይህንን እንድናሻሽል ይርዱን!</translation>
 <translation id="4731797938093519117">የወላጅ መዳረሻ</translation>
 <translation id="4734965478015604180">አግድማዊ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + የቁጥር የቁልፍ ሰሌዳ አቋራጭ ተለውጧል። የተግባር ቁልፎችን ለመጠቀም በላይኛው ረድፍ ላይ የ<ph name="LAUNCHER_KEY_NAME" /> ቁልፍ + አንድ ቁልፍ ይጫኑ።</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index f2c2f8c..411b1a6 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">فتح قفل الجهاز باستخدام رمز الوالدين</translation>
 <translation id="4702647871202761252">تم إيقاف شاشة الخصوصية.</translation>
 <translation id="4705716602320768426">تقديم تعليقات</translation>
-<translation id="4730258224256997107">المساعدة في تحسين هذه الميزة</translation>
 <translation id="4731797938093519117">وصول أحد الوالدين</translation>
 <translation id="4734965478015604180">أفقي</translation>
 <translation id="4735498845456076464">تم تغيير اختصارات لوحة المفاتيح "<ph name="LAUNCHER_KEY_NAME" /> + رقم". لاستخدام مفاتيح الوظائف، اضغط على المفتاح <ph name="LAUNCHER_KEY_NAME" /> مع الضغط على مفتاح في الصف العلوي.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index 491a2338..19d1ac0 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -483,7 +483,6 @@
 <translation id="4696813013609194136">অভিভাৱকৰ প্ৰৱেশ ক'ডৰ সহায়ত ডিভাইচ আনলক কৰক</translation>
 <translation id="4702647871202761252">গোপনীয়তাৰ স্ক্ৰীনখন অফ আছে</translation>
 <translation id="4705716602320768426">মতামত ফাইল কৰক</translation>
-<translation id="4730258224256997107">আমাক এইটো উন্নত কৰাত সহায় কৰক!</translation>
 <translation id="4731797938093519117">অভিভাৱকৰ এক্সেছ</translation>
 <translation id="4734965478015604180">আনুভূমিক</translation>
 <translation id="4735498845456076464">কীব’ৰ্ডৰ শ্বৰ্টকাট <ph name="LAUNCHER_KEY_NAME" /> + নাম্বাৰটো সলনি হৈছে। ফাংশ্বন কীসমূহ ব্যৱহাৰ কৰিবলৈ, <ph name="LAUNCHER_KEY_NAME" /> কীটো + ওপৰৰ শাৰীৰ এটা কী টিপক।</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index 3184601..b492932 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Cihazı valideyn kodu ilə kiliddən çıxarın</translation>
 <translation id="4702647871202761252">Məxfilik ekranı deaktivdir</translation>
 <translation id="4705716602320768426">Rəy göndərin</translation>
-<translation id="4730258224256997107">Bunu təkmilləşdirməyə yardım edin!</translation>
 <translation id="4731797938093519117">Valideyn girişi</translation>
 <translation id="4734965478015604180">Üfüqi</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Rəqəm klaviaturası qısayolu dəyişib. Funksiya düymələrindən istifadə etmək üçün <ph name="LAUNCHER_KEY_NAME" /> + üst sıradakı bir düyməyə basın.</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb
index d2931f1..84ac34b 100644
--- a/ash/strings/ash_strings_be.xtb
+++ b/ash/strings/ash_strings_be.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Разблакіруйце прыладу бацькоўскім кодам</translation>
 <translation id="4702647871202761252">Экран прыватнасці выключаны</translation>
 <translation id="4705716602320768426">Пакінуць водгук</translation>
-<translation id="4730258224256997107">Дапамажыце палепшыць гэты вынік!</translation>
 <translation id="4731797938093519117">Бацькоўскі доступ</translation>
 <translation id="4734965478015604180">Гарызантальна</translation>
 <translation id="4735498845456076464">Змянілася прызначэнне спалучэння клавіш <ph name="LAUNCHER_KEY_NAME" /> + лічба. Каб выканаць дзеянне функцыянальнай клавішы, націсніце <ph name="LAUNCHER_KEY_NAME" /> + адну з клавіш верхняга рада.</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index a1cb518..c2621a1 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Отключване на устройството с код на родител</translation>
 <translation id="4702647871202761252">Екранът за поверителност е изключен</translation>
 <translation id="4705716602320768426">Изпращане на отзиви</translation>
-<translation id="4730258224256997107">Помогнете ни да подобрим това!</translation>
 <translation id="4731797938093519117">Достъп на родител</translation>
 <translation id="4734965478015604180">Хоризонтално</translation>
 <translation id="4735498845456076464">Клавишната комбинация клавиш „<ph name="LAUNCHER_KEY_NAME" />“ + цифра се промени. За да използвате функционалните клавиши, натиснете „<ph name="LAUNCHER_KEY_NAME" />“ + клавиш от най-горния ред.</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 76744c8..972180c7 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">অভিভাবকীয় কোড দিয়ে ডিভাইস আনলক করুন</translation>
 <translation id="4702647871202761252">গোপনীয়তা স্ক্রিন বন্ধ করা আছে</translation>
 <translation id="4705716602320768426">ফাইলের ব্যাপারে নিজের মতামত জানান</translation>
-<translation id="4730258224256997107">এটা উন্নত করতে আমাদের সাহায্য করুন!</translation>
 <translation id="4731797938093519117">অভিভাবকীয় অ্যাক্সেস</translation>
 <translation id="4734965478015604180">অনুভূমিক</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number কীবোর্ড শর্ককার্ট পরিবর্তন করা হয়েছে। ফাংশান কী ব্যবহার করতে, <ph name="LAUNCHER_KEY_NAME" /> কী + কীবোর্ডের উপরের সারির যেকোনও একটি কী প্রেস করুন।</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index fdfcc02..3281c56 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Otključajte uređaj pomoću koda roditelja</translation>
 <translation id="4702647871202761252">Ekran za privatnost je isključen</translation>
 <translation id="4705716602320768426">Pošaljite povratne informacije</translation>
-<translation id="4730258224256997107">Pomozite nam da poboljšamo ovo!</translation>
 <translation id="4731797938093519117">Pristup roditelja</translation>
 <translation id="4734965478015604180">Horizontalno</translation>
 <translation id="4735498845456076464">Prečica na tastaturi <ph name="LAUNCHER_KEY_NAME" /> + broj je promijenjena. Da koristite funkcijske tipke, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index c8cce34..9c46be6 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Desbloqueja el dispositiu amb el codi parental</translation>
 <translation id="4702647871202761252">La pantalla de privadesa està desactivada</translation>
 <translation id="4705716602320768426">Envia suggeriments</translation>
-<translation id="4730258224256997107">Ajuda'ns a millorar-ho!</translation>
 <translation id="4731797938093519117">Accés parental</translation>
 <translation id="4734965478015604180">Horitzontal</translation>
 <translation id="4735498845456076464">La tecla de drecera <ph name="LAUNCHER_KEY_NAME" />+número ha canviat. Per fer servir les tecles de funció, prem la tecla <ph name="LAUNCHER_KEY_NAME" />+una tecla de la fila superior.</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index e2c2c18..13a5d0f 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Odemkněte zařízení rodičovským kódem</translation>
 <translation id="4702647871202761252">Obrazovka ochrany soukromí je vypnutá</translation>
 <translation id="4705716602320768426">Poslat zpětnou vazbu</translation>
-<translation id="4730258224256997107">Pomozte nám s vylepšením!</translation>
 <translation id="4731797938093519117">Rodičovský přístup</translation>
 <translation id="4734965478015604180">Na šířku</translation>
 <translation id="4735498845456076464">Klávesová zkratka <ph name="LAUNCHER_KEY_NAME" /> + číslo se změnila. Pokud chcete použít funkční klávesy, stiskněte <ph name="LAUNCHER_KEY_NAME" /> + klávesu na horním řádku.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 0eac0d8..c0d1a4f 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Lås enheden op med forældrekode</translation>
 <translation id="4702647871202761252">Privatlivsskærmen er slået fra</translation>
 <translation id="4705716602320768426">Giv feedback</translation>
-<translation id="4730258224256997107">Hjælp os med at forbedre dette</translation>
 <translation id="4731797938093519117">Forældreadgang</translation>
 <translation id="4734965478015604180">Vandret</translation>
 <translation id="4735498845456076464">Tastaturgenvejen <ph name="LAUNCHER_KEY_NAME" />+numerisk tast er blevet ændret. Hvis du vil bruge funktionstaster, skal du trykke på tasten <ph name="LAUNCHER_KEY_NAME" />+en tast i øverste række.</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 06c5d52..f58863c90 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">Gerät mit Elterncode entsperren</translation>
 <translation id="4702647871202761252">Der Datenschutzbildschirm ist momentan deaktiviert</translation>
 <translation id="4705716602320768426">Feedback geben</translation>
-<translation id="4730258224256997107">Helfen Sie uns, diese Funktion zu verbessern!</translation>
 <translation id="4731797938093519117">Elternzugang</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Die Tastenkombination <ph name="LAUNCHER_KEY_NAME" /> + Ziffer hat sich geändert. Wenn Sie jetzt eine Funktionstaste benötigen, drücken Sie die <ph name="LAUNCHER_KEY_NAME" />-Taste + eine Taste in der oberen Reihe.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 64219510..9f9cbdb 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Ξεκλείδωμα συσκευής με κωδικό γονέα</translation>
 <translation id="4702647871202761252">Η οθόνη απορρήτου είναι απενεργοποιημένη.</translation>
 <translation id="4705716602320768426">Υποβολή σχολίων</translation>
-<translation id="4730258224256997107">Συμβάλετε στη βελτίωση της απάντησης!</translation>
 <translation id="4731797938093519117">Γονική πρόσβαση</translation>
 <translation id="4734965478015604180">Οριζόντια περιστροφή</translation>
 <translation id="4735498845456076464">Η συντόμευση πληκτρολογίου <ph name="LAUNCHER_KEY_NAME" /> + Αριθμός άλλαξε. Για να χρησιμοποιήσετε τα πλήκτρα λειτουργιών, πατήστε το πλήκτρο <ph name="LAUNCHER_KEY_NAME" /> + ένα πλήκτρο στην επάνω σειρά.</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index b8da8a4..c9f2e81 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Unlock device with parent code</translation>
 <translation id="4702647871202761252">Privacy screen is off</translation>
 <translation id="4705716602320768426">File feedback</translation>
-<translation id="4730258224256997107">Help us improve this!</translation>
 <translation id="4731797938093519117">Parent access</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">The <ph name="LAUNCHER_KEY_NAME" /> + number keyboard shortcut has changed. To use function keys, press the <ph name="LAUNCHER_KEY_NAME" /> key + a key on the top row.</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index c1e2bd0..d0bcf96 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Desbloquea el dispositivo con el código parental</translation>
 <translation id="4702647871202761252">La pantalla de privacidad está desactivada</translation>
 <translation id="4705716602320768426">Enviar comentarios</translation>
-<translation id="4730258224256997107">¡Ayúdanos a mejorar esta respuesta!</translation>
 <translation id="4731797938093519117">Acceso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Se modificó la combinación de teclas <ph name="LAUNCHER_KEY_NAME" /> + un número. Para usar las teclas de función, presiona la tecla <ph name="LAUNCHER_KEY_NAME" /> + una tecla de la fila superior.</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 27064f8..1c4a0d80 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Desbloquear con código parental</translation>
 <translation id="4702647871202761252">La pantalla de privacidad está desactivada</translation>
 <translation id="4705716602320768426">Comentarios sobre el archivo</translation>
-<translation id="4730258224256997107">Ayúdanos a mejorar.</translation>
 <translation id="4731797938093519117">Acceso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">La combinación de teclas <ph name="LAUNCHER_KEY_NAME" /> + número ha cambiado. Para usar las teclas de funciones, pulsa la tecla <ph name="LAUNCHER_KEY_NAME" /> + una tecla de la fila superior.</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 36b087f..bd8de02 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Avage seade lapsevanema koodiga</translation>
 <translation id="4702647871202761252">Privaatsuskuva on väljas</translation>
 <translation id="4705716602320768426">Tagasiside esitamine</translation>
-<translation id="4730258224256997107">Aidake meil seda paremaks muuta.</translation>
 <translation id="4731797938093519117">Vanema juurdepääs</translation>
 <translation id="4734965478015604180">Horisontaalne</translation>
 <translation id="4735498845456076464">Klaviatuuri otseteed <ph name="LAUNCHER_KEY_NAME" /> + numbriklahv on muudetud. Funktsiooniklahvide kasutamiseks vajutage klahvi <ph name="LAUNCHER_KEY_NAME" /> + ülemise rea klahvi.</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index 08eec1c..49a547b 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Desblokeatu gailua gurasoen kodearekin</translation>
 <translation id="4702647871202761252">Desaktibatuta dago pribatutasun-pantaila</translation>
 <translation id="4705716602320768426">Bidali oharrak</translation>
-<translation id="4730258224256997107">Lagun iezaguzu hau hobetzen</translation>
 <translation id="4731797938093519117">Gurasoen sarbidea</translation>
 <translation id="4734965478015604180">Horizontala</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + zenbakia lasterbidea aldatu egin da. Funtzio-teklak erabiltzeko, sakatu <ph name="LAUNCHER_KEY_NAME" /> tekla + goiko errenkadako tekla bat.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 98a95b4..9676047 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">باز کردن قفل دستگاه با کد والدین</translation>
 <translation id="4702647871202761252">صفحه حریم‌خصوصی خاموش است</translation>
 <translation id="4705716602320768426">ثبت بازخورد</translation>
-<translation id="4730258224256997107">کمک کنید این مورد را بهبود ببخشیم!</translation>
 <translation id="4731797938093519117">دسترسی ولی</translation>
 <translation id="4734965478015604180">افقی</translation>
 <translation id="4735498845456076464">میان‌بر صفحه‌کلید «<ph name="LAUNCHER_KEY_NAME" /> + عدد» تغییر کرده است. برای استفاده از کلیدهای عملکرد، کلید <ph name="LAUNCHER_KEY_NAME" /> + یکی از کلیدهای ردیف بالا را فشار دهید.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 00687fa..8787b95 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Avaa lukitus vanhemman koodilla</translation>
 <translation id="4702647871202761252">Näytönsuoja on pois päältä</translation>
 <translation id="4705716602320768426">Tiedostopalaute</translation>
-<translation id="4730258224256997107">Auta meitä parantamaan tätä!</translation>
 <translation id="4731797938093519117">Avaus vanhemmille</translation>
 <translation id="4734965478015604180">Vaakasuora</translation>
 <translation id="4735498845456076464">Pikanäppäinyhdistelmä <ph name="LAUNCHER_KEY_NAME" /> + numeronäppäin on muuttunut. Jos haluat käyttää toimintonäppäimiä, paina <ph name="LAUNCHER_KEY_NAME" /> + ylärivin näppäin.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 34825c17..2790697 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">I-unlock ang device gamit ang parent code</translation>
 <translation id="4702647871202761252">Naka-off ang privacy screen</translation>
 <translation id="4705716602320768426">Magbigay ng feedback</translation>
-<translation id="4730258224256997107">Tulungan kaming pahusayin ito!</translation>
 <translation id="4731797938093519117">Pangunahing access</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Nagbago ang keyboard shortcut na <ph name="LAUNCHER_KEY_NAME" /> + Numero. Para magamit ang mga function key, pindutin ang <ph name="LAUNCHER_KEY_NAME" /> key + isang key sa itaas na row.</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb
index 659a749e..737b42b 100644
--- a/ash/strings/ash_strings_fr-CA.xtb
+++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Déverrouiller l'appareil avec le code parental</translation>
 <translation id="4702647871202761252">L'écran de confidentialité est désactivé</translation>
 <translation id="4705716602320768426">Classer le commentaire</translation>
-<translation id="4730258224256997107">Aidez-nous à améliorer ceci!</translation>
 <translation id="4731797938093519117">Accès parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Le raccourci-clavier <ph name="LAUNCHER_KEY_NAME" />+Chiffre a été modifié. Pour utiliser les touches de fonction, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" /> ainsi que sur une touche de la rangée du haut.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 197e579..e921594a 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Déverrouiller l'appareil avec le code parental</translation>
 <translation id="4702647871202761252">L'écran de confidentialité est désactivé</translation>
 <translation id="4705716602320768426">Classer le commentaire</translation>
-<translation id="4730258224256997107">Aidez-nous à nous améliorer !</translation>
 <translation id="4731797938093519117">Accès parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Le raccourci clavier <ph name="LAUNCHER_KEY_NAME" />+Chiffre a été modifié. Pour utiliser les touches de fonction, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" /> et sur une touche de la rangée supérieure.</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb
index f037b4b..868dec9 100644
--- a/ash/strings/ash_strings_gl.xtb
+++ b/ash/strings/ash_strings_gl.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">Configurar</translation>
 <translation id="3573179567135747900">Volver cambiar a "<ph name="FROM_LOCALE" />" (é necesario reiniciar)</translation>
 <translation id="3576141592585647168">Cambiar fuso horario</translation>
+<translation id="3580650856351781466">Descargando ficheiros de voz</translation>
 <translation id="3593039967545720377">Para acceder ao historial do teu portapapeis, preme <ph name="SHORTCUT_KEY_NAME" /> + V. Copia un elemento para comezar.</translation>
 <translation id="3593646411856133110">Pasa o dedo cara arriba e mantén premida a pantalla para ver as aplicacións abertas</translation>
 <translation id="3595596368722241419">Batería completa</translation>
@@ -485,7 +486,6 @@
 <translation id="4696813013609194136">Desbloquea o dispositivo co código parental</translation>
 <translation id="4702647871202761252">A pantalla de privacidade está desactivada</translation>
 <translation id="4705716602320768426">Enviar comentarios</translation>
-<translation id="4730258224256997107">Axudar a mellorar esta función</translation>
 <translation id="4731797938093519117">Acceso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">O atallo de teclado <ph name="LAUNCHER_KEY_NAME" /> + número cambiou. Para usar as teclas de función, preme <ph name="LAUNCHER_KEY_NAME" /> + unha das teclas da fila superior.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 8f56cfc..debf1df 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">માતાપિતાના કોડ વડે ડિવાઇસને અનલૉક કરો</translation>
 <translation id="4702647871202761252">પ્રાઇવસી સ્ક્રીન બંધ છે</translation>
 <translation id="4705716602320768426">પ્રતિસાદ ફાઇલ કરો</translation>
-<translation id="4730258224256997107">આને બહેતર બનાવવામાં અમારી સહાય કરો!</translation>
 <translation id="4731797938093519117">માતાપિતા માટે ઍક્સેસ</translation>
 <translation id="4734965478015604180">હોરિઝોન્ટલ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number કીબોર્ડ શૉર્ટકટ બદલવામાં આવ્યો છે. ફંક્શન કીનો ઉપયોગ કરવા માટે, <ph name="LAUNCHER_KEY_NAME" /> કી + ઉપરની પંક્તિ પરની કોઈ એક કી દબાવો.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index aaf8a0f05..8147ede 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">माता-पिता के कोड से डिवाइस अनलॉक करें</translation>
 <translation id="4702647871202761252">निजता स्क्रीन बंद है</translation>
 <translation id="4705716602320768426">सुझाव/शिकायत/राय दें</translation>
-<translation id="4730258224256997107">इसे बेहतर बनाने में हमारी मदद करें!</translation>
 <translation id="4731797938093519117">अभिभावक ऐक्सेस</translation>
 <translation id="4734965478015604180">हॉरिजेंटल व्यू</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number कीबोर्ड शॉर्टकट बदल गया है. फ़ंक्शन बटन इस्तेमाल करने के लिए, <ph name="LAUNCHER_KEY_NAME" /> बटन + सबसे ऊपर की लाइन का कोई एक बटन दबाएं.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index efbc1c05..450ab5f 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Otključajte uređaj roditeljskim kodom</translation>
 <translation id="4702647871202761252">Zaslon privatnosti je isključen</translation>
 <translation id="4705716602320768426">Pošaljite povratne informacije</translation>
-<translation id="4730258224256997107">Pomozite nam da to poboljšamo!</translation>
 <translation id="4731797938093519117">Roditeljski pristup</translation>
 <translation id="4734965478015604180">Vodoravno</translation>
 <translation id="4735498845456076464">Promijenjen je tipkovni prečac <ph name="LAUNCHER_KEY_NAME" /> + broj. Da biste upotrijebili tipke funkcija, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 7c57730..2249fdb 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Zárolás feloldása szülői kóddal</translation>
 <translation id="4702647871202761252">Az adatvédelmi képernyő ki van kapcsolva</translation>
 <translation id="4705716602320768426">Visszajelzés küldése</translation>
-<translation id="4730258224256997107">Segítsen nekünk ennek fejlesztésében!</translation>
 <translation id="4731797938093519117">Szülői hozzáférés</translation>
 <translation id="4734965478015604180">Vízszintes</translation>
 <translation id="4735498845456076464">A(z) <ph name="LAUNCHER_KEY_NAME" /> + szám billentyűparancs módosult. A funkcióbillentyűk használatához nyomja le a következő billentyűparancsot: <ph name="LAUNCHER_KEY_NAME" /> + a kívánt billentyű a felső soron.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb
index 91f96dce..45bd35d 100644
--- a/ash/strings/ash_strings_hy.xtb
+++ b/ash/strings/ash_strings_hy.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">Տեղակայել</translation>
 <translation id="3573179567135747900">Վերադառնալ «<ph name="FROM_LOCALE" />»-ին (հարկավոր է վերագործարկում)</translation>
 <translation id="3576141592585647168">Փոխեք ժամային գոտին</translation>
+<translation id="3580650856351781466">Խոսքի ճանաչման ֆայլերը ներբեռնվում են</translation>
 <translation id="3593039967545720377">Սեղմեք <ph name="SHORTCUT_KEY_NAME" /> + V՝ սեղմատախտակի պատմությունը տեսնելու համար։ Սկսելու համար պատճենեք որևէ տարր։</translation>
 <translation id="3593646411856133110">Մատը սահեցրեք վեր և պահեք՝ բացված հավելվածները տեսնելու համար</translation>
 <translation id="3595596368722241419">Մարտկոցը լրիվ լիցքավորված է</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">Մուտքագրեք ծնողի մուտքի կոդը</translation>
 <translation id="4702647871202761252">Գաղտնիության էկրանն անջատված է</translation>
 <translation id="4705716602320768426">Հաղորդել վրիպակի մասին</translation>
-<translation id="4730258224256997107">Օգնել մեզ բարելավել այս արդյունքը</translation>
 <translation id="4731797938093519117">Ծնողի մուտք</translation>
 <translation id="4734965478015604180">Հորիզոնական</translation>
 <translation id="4735498845456076464">«<ph name="LAUNCHER_KEY_NAME" /> + թիվ» ստեղնային դյուրանցումը փոփոխվել է։ Գործառույթային ստեղների գործողություններն օգտագործելու համար սեղմեք «<ph name="LAUNCHER_KEY_NAME" /> + ստեղն» դյուրանցումը վերևի շարքում։</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 876a3dc6..70fcf17 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Buka kunci perangkat dengan kode orang tua</translation>
 <translation id="4702647871202761252">Layar privasi nonaktif</translation>
 <translation id="4705716602320768426">Kirim masukan</translation>
-<translation id="4730258224256997107">Bantu kami meningkatkannya</translation>
 <translation id="4731797938093519117">Akses orang tua</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Pintasan keyboard <ph name="LAUNCHER_KEY_NAME" /> + Angka telah diubah. Untuk menggunakan tombol fungsi, tekan tombol <ph name="LAUNCHER_KEY_NAME" /> + tombol di baris atas.</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index f3d7670c..b6df4c6 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Opna tæki með kóða foreldris</translation>
 <translation id="4702647871202761252">Slökkt er á persónuverndarskjá</translation>
 <translation id="4705716602320768426">Skrá ábendingu</translation>
-<translation id="4730258224256997107">Hjálpaðu okkur að bæta þetta!</translation>
 <translation id="4731797938093519117">Foreldraaðgangur</translation>
 <translation id="4734965478015604180">Lárétt</translation>
 <translation id="4735498845456076464">Flýtilyklinum „<ph name="LAUNCHER_KEY_NAME" /> + tölustafur“ hefur verið breytt. Ýttu á <ph name="LAUNCHER_KEY_NAME" />-lykilinn + lykil í efstu röð til að nota aðgerðalyklana.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index fadaa23..32f7c91d 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Sblocca con codice genitore</translation>
 <translation id="4702647871202761252">Schermata sulla privacy non attiva</translation>
 <translation id="4705716602320768426">Invia feedback</translation>
-<translation id="4730258224256997107">Aiutaci a migliorare</translation>
 <translation id="4731797938093519117">Accesso genitore</translation>
 <translation id="4734965478015604180">Orizzontale</translation>
 <translation id="4735498845456076464">La scorciatoia da tastiera <ph name="LAUNCHER_KEY_NAME" /> + Numero è cambiata. Per usare i tasti funzione, premi il tasto <ph name="LAUNCHER_KEY_NAME" /> + un tasto nella fila superiore.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index cceca421..5d72b71 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">ביטול נעילת המכשיר באמצעות קוד הורה</translation>
 <translation id="4702647871202761252">מסך הפרטיות כבוי</translation>
 <translation id="4705716602320768426">מילוי משוב</translation>
-<translation id="4730258224256997107">רוצה לעזור לנו לשפר את התוצאה הזו?</translation>
 <translation id="4731797938093519117">גישת הורים</translation>
 <translation id="4734965478015604180">אופקי</translation>
 <translation id="4735498845456076464">מקשי הקיצור <ph name="LAUNCHER_KEY_NAME" /> + ספרה הוחלפו. כדי לדמות את הפעולה של מקשי הפונקציה, יש להקיש על המקש <ph name="LAUNCHER_KEY_NAME" /> + מקש כלשהו בשורה העליונה של המקלדת.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 83942a7..2d774d8 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">保護者のコードでデバイスをロック解除</translation>
 <translation id="4702647871202761252">プライバシー スクリーンはオフになっています</translation>
 <translation id="4705716602320768426">フィードバックを送信</translation>
-<translation id="4730258224256997107">機能の改善にご協力ください</translation>
 <translation id="4731797938093519117">保護者によるアクセス</translation>
 <translation id="4734965478015604180">横</translation>
 <translation id="4735498845456076464">キーボード ショートカット「<ph name="LAUNCHER_KEY_NAME" />+数字」が変更されました。ファンクション キーを使用するには、<ph name="LAUNCHER_KEY_NAME" />+最上列のキーを押してください。</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index dd2bc5e..59852c1 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">დაყენება</translation>
 <translation id="3573179567135747900">„<ph name="FROM_LOCALE" />“-ში დაბრუნება (საჭიროებს გადატვირთვას)</translation>
 <translation id="3576141592585647168">სასაათო სარტყლის შეცვლა</translation>
+<translation id="3580650856351781466">მიმდინარეობს მეტყველების ფაილების ჩამოტვირთვა</translation>
 <translation id="3593039967545720377">თქვენი გაცვლის ბუფერის ისტორიაზე წვდომისთვის და გაცვლის ბუფერის სანახავად დააჭირეთ კლავიშთა კომბინაციას <ph name="SHORTCUT_KEY_NAME" /> + V. დასაწყებად დააკოპირეთ ერთეული.</translation>
 <translation id="3593646411856133110">გახსნილი აპების სანახავად გადაფურცლეთ ზემოთ და არ აუშვათ</translation>
 <translation id="3595596368722241419">ბატარეა სავსეა</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">განბლოკეთ მოწყობილობა მშობლის კოდით</translation>
 <translation id="4702647871202761252">კონფიდენციალურობის ეკრანი გამორთულია</translation>
 <translation id="4705716602320768426">გამოხმაურება</translation>
-<translation id="4730258224256997107">დაგვეხმარეთ ამის გაუმჯობესებაში!</translation>
 <translation id="4731797938093519117">მშობლის წვდომა</translation>
 <translation id="4734965478015604180">ჰორიზონტალური</translation>
 <translation id="4735498845456076464">კლავიატურის მალსახმობი „<ph name="LAUNCHER_KEY_NAME" /> + ციფრი“ შეიცვალა. ფუნქციების კლავიშებით სარგებლობისთვის დააჭირეთ კლავიშს <ph name="LAUNCHER_KEY_NAME" /> + კლავიშს ზედა მწკრივში.</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 59de686..62d9217 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Құрылғының құлпын ата-ана кодымен ашыңыз</translation>
 <translation id="4702647871202761252">Құпиялылық экраны өшірулі.</translation>
 <translation id="4705716602320768426">Пікір жіберу</translation>
-<translation id="4730258224256997107">Осыны жақсартуға көмектесіңіз.</translation>
 <translation id="4731797938093519117">Ата-ананың кіру рұқсаты</translation>
 <translation id="4734965478015604180">Көлденең</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + сан пернелер тіркесімінің функциясы өзгерді. Функциялық пернелерді пайдалану үшін <ph name="LAUNCHER_KEY_NAME" /> пернесі + жоғарғы қатар пернесі тіркесімін басыңыз.</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index 48dfa0d..5056ae3 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">ដោះ​សោ​ឧបករណ៍​ដោយ​ប្រើ​កូដ​សម្រាប់​មាតា​បិតា</translation>
 <translation id="4702647871202761252">អេក្រង់​ឯកជនភាព​ត្រូវបានបិទ</translation>
 <translation id="4705716602320768426">ដាក់បញ្ជូនមតិកែលម្អ</translation>
-<translation id="4730258224256997107">ជួយយើង​កែលម្អ​ចំណុចនេះ!</translation>
 <translation id="4731797938093519117">សិទ្ធិចូលប្រើប្រាស់​សម្រាប់មាតាបិតា</translation>
 <translation id="4734965478015604180">ផ្ដេក​</translation>
 <translation id="4735498845456076464">បានប្ដូរ​ផ្លូវកាត់ក្ដារចុចលេខ + <ph name="LAUNCHER_KEY_NAME" />។ ដើម្បីប្រើគ្រាប់ចុចមុខងារ សូមចុចគ្រាប់ចុច <ph name="LAUNCHER_KEY_NAME" /> + គ្រាប់ចុចនៅជួរខាងលើ។</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index a5c5a17..1c8a3bb 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">ಪೋಷಕ ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಸಾಧನವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ</translation>
 <translation id="4702647871202761252">ಗೌಪ್ಯತೆ ಸ್ಕ್ರೀನ್ ಆಫ್ ಆಗಿದೆ</translation>
 <translation id="4705716602320768426">ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ</translation>
-<translation id="4730258224256997107">ಇದನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ!</translation>
 <translation id="4731797938093519117">ಪೋಷಕ ಪ್ರವೇಶ ಬಟನ್‌</translation>
 <translation id="4734965478015604180">ಅಡ್ಡ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ಸಂಖ್ಯೆ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಬದಲಿಸಲಾಗಿದೆ. ಫಂಕ್ಷನ್-ಕೀಗಳನ್ನು ಬಳಸಲು, <ph name="LAUNCHER_KEY_NAME" /> ಕೀ + ಮೇಲಿನ ಸಾಲಿನಲ್ಲಿರುವ ಒಂದು ಕೀ ಅನ್ನು ಒತ್ತಿ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index e4f5be1..97b108b 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">부모 코드로 기기 잠금 해제</translation>
 <translation id="4702647871202761252">개인정보 보호 화면이 꺼져 있습니다</translation>
 <translation id="4705716602320768426">의견 보내기</translation>
-<translation id="4730258224256997107">서비스 개선에 참여</translation>
 <translation id="4731797938093519117">부모 액세스</translation>
 <translation id="4734965478015604180">가로</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + 숫자 단축키가 변경되었습니다. 기능 키를 사용하려면 <ph name="LAUNCHER_KEY_NAME" /> 키 + 맨 윗줄의 키를 누르세요.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index 5e0e8d3..0b16190e 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Түзмөктүн кулпусун ата-эненин коду менен ачуу</translation>
 <translation id="4702647871202761252">Купуялык экраны өчүк</translation>
 <translation id="4705716602320768426">Пикир билдирүү</translation>
-<translation id="4730258224256997107">Муну жакшыртууга жардам бериңиз!</translation>
 <translation id="4731797938093519117">Ата-эненин кирүү уруксаты</translation>
 <translation id="4734965478015604180">Туурасынан</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Номер ыкчам баскычы өзгөртүлдү. Функциялык баскычтарды колдонуу үчүн <ph name="LAUNCHER_KEY_NAME" /> баскычын + жогорку саптагы баскычты басыңыз.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb
index d815861..50f6fb8 100644
--- a/ash/strings/ash_strings_lo.xtb
+++ b/ash/strings/ash_strings_lo.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">ປົດລັອກອຸປະກອນດ້ວຍລະຫັດພໍ່ແມ່</translation>
 <translation id="4702647871202761252">ໜ້າຈໍຄວາມເປັນສ່ວນຕົວປິດຢູ່</translation>
 <translation id="4705716602320768426">ຄຳຕິຊົມໄຟລ໌</translation>
-<translation id="4730258224256997107">ຊ່ວຍພວກເຮົາປັບປຸງສິ່ງນີ້ໃຫ້ດີຂຶ້ນ!</translation>
 <translation id="4731797938093519117">ສິດເຂົ້າເຖິງຂອງພໍ່ແມ່</translation>
 <translation id="4734965478015604180">ລວງນອນ</translation>
 <translation id="4735498845456076464">ມີການປ່ຽນຄີລັດ <ph name="LAUNCHER_KEY_NAME" /> + ຕົວເລກ. ເພື່ອໃຊ້ປຸ່ມຟັງຊັນ, ໃຫ້ກົດປຸ່ມ <ph name="LAUNCHER_KEY_NAME" /> + ປຸ່ມໃດໜຶ່ງຢູ່ແຖວເທິງສຸດ.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index e20e2dd..a53a11f2 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Atrakinkite įrenginį naudodami tėvų kodą</translation>
 <translation id="4702647871202761252">Privatumo ekranas išjungtas</translation>
 <translation id="4705716602320768426">Pateikti atsiliepimų</translation>
-<translation id="4730258224256997107">Padėkite tai patobulinti!</translation>
 <translation id="4731797938093519117">Tėvų prieiga</translation>
 <translation id="4734965478015604180">Horizontaliai</translation>
 <translation id="4735498845456076464">Pakeistas spartusis klavišas <ph name="LAUNCHER_KEY_NAME" /> + skaičiaus klavišas. Jei norite naudoti funkcijų klavišus, paspauskite <ph name="LAUNCHER_KEY_NAME" /> klavišą + klavišą viršutinėje eilutėje.</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 2351bb2..d7ebc67 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">Iestatīt</translation>
 <translation id="3573179567135747900">Mainīt atpakaļ uz <ph name="FROM_LOCALE" /> (nepieciešama restartēšana)</translation>
 <translation id="3576141592585647168">Mainīt laika joslu</translation>
+<translation id="3580650856351781466">Notiek subtitru failu lejupielāde</translation>
 <translation id="3593039967545720377">Lai skatītu starpliktuvi un piekļūtu starpliktuves vēsturei, nospiediet taustiņu kombināciju <ph name="SHORTCUT_KEY_NAME" />+V. Lai sāktu darbu, kopējiet kādu vienumu.</translation>
 <translation id="3593646411856133110">Velciet augšup un turiet, lai skatītu atvērtās lietotnes.</translation>
 <translation id="3595596368722241419">Akumulators pilns</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">Ierīces atbloķēšana, ievadot vecāku kodu</translation>
 <translation id="4702647871202761252">Konfidencialitātes ekrāns ir izslēgts</translation>
 <translation id="4705716602320768426">Iesniegt atsauksmi</translation>
-<translation id="4730258224256997107">Palīdziet mums to uzlabot!</translation>
 <translation id="4731797938093519117">Vecāku piekļuve</translation>
 <translation id="4734965478015604180">Horizontāli</translation>
 <translation id="4735498845456076464">Šis īsinājumtaustiņš ir mainījies: <ph name="LAUNCHER_KEY_NAME" /> + cipars. Lai izmantotu funkciju taustiņus, nospiediet šos taustiņus: <ph name="LAUNCHER_KEY_NAME" /> + jebkurš augšējās rindas taustiņš.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb
index 933652e2..6e61d16 100644
--- a/ash/strings/ash_strings_mk.xtb
+++ b/ash/strings/ash_strings_mk.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Отклучете го уредот со код на родител</translation>
 <translation id="4702647871202761252">Исклучен е екранот за приватност</translation>
 <translation id="4705716602320768426">Испратете повратни информации</translation>
-<translation id="4730258224256997107">Помогнете ни да го подобриме ова!</translation>
 <translation id="4731797938093519117">Пристап за родители</translation>
 <translation id="4734965478015604180">Хоризонтално</translation>
 <translation id="4735498845456076464">Кратенката од тастатура <ph name="LAUNCHER_KEY_NAME" /> + Број се промени. За да ги користите копчињата за функции, притиснете го копчето <ph name="LAUNCHER_KEY_NAME" /> + Копче од горниот ред.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index c6185b6..503bd153 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">രക്ഷാകർതൃ കോഡ് ഉപയോഗിച്ച് ഉപകരണം അൺലോക്ക് ചെയ്യുക</translation>
 <translation id="4702647871202761252">സ്വകാര്യതാ സ്‌ക്രീൻ ഓഫാണ്</translation>
 <translation id="4705716602320768426">ഫീഡ്‌ബാക്ക് നൽകുക</translation>
-<translation id="4730258224256997107">ഇത് മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കുക!</translation>
 <translation id="4731797938093519117">രക്ഷാകർതൃ ആക്‌സസ്</translation>
 <translation id="4734965478015604180">സമാന്തരം</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + നമ്പർ' കീബോഡ് കുറുക്കുവഴി മാറിയിട്ടുണ്ട്. ഫംഗ്ഷന്‍ കീകൾ ഉപയോഗിക്കാൻ, <ph name="LAUNCHER_KEY_NAME" /> + ഏറ്റവും മുകളിലെ വരിയിലുള്ള കീ അമർത്തുക.</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index 5fecb5a..ce669b3 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Төхөөрөмжийн түгжээг эцэг эхийн кодоор тайлна уу</translation>
 <translation id="4702647871202761252">Нууцлалын дэлгэц унтраалттай байна</translation>
 <translation id="4705716602320768426">Cанал хүсэлт илгээх</translation>
-<translation id="4730258224256997107">Бидэнд үүнийг сайжруулахад тусална уу!</translation>
 <translation id="4731797938093519117">Эцэг эхийн хандалт</translation>
 <translation id="4734965478015604180">Хөндлөн</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Тоон товчлуурын шууд холбоосыг өөрчилсөн байна. Функцийн товчлууруудыг ашиглахын тулд <ph name="LAUNCHER_KEY_NAME" /> товчлуур + дээд мөрд байх товчлуурыг дарна уу.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 2891471..9f19f6e 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">पालक कोडने डिव्हाइस अनलॉक करा</translation>
 <translation id="4702647871202761252">गोपनीयता स्क्रीन बंद आहे</translation>
 <translation id="4705716602320768426">फाइल फीडबॅक</translation>
-<translation id="4730258224256997107">यामध्ये सुधारणा करण्यासाठी आम्हाला मदत करा!</translation>
 <translation id="4731797938093519117">पालक अ‍ॅक्सेस</translation>
 <translation id="4734965478015604180">आडवा</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + नंबर कीबोर्ड शॉर्टकट बदलला आहे. फंक्शन की वापरण्यासाठी, <ph name="LAUNCHER_KEY_NAME" /> की + सर्वात वरच्या पंक्तीमधील की दाबा.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index f90b73b..6e67cbc 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -486,7 +486,6 @@
 <translation id="4696813013609194136">Buka kunci peranti menggunakan kod ibu bapa</translation>
 <translation id="4702647871202761252">Skrin privasi dimatikan</translation>
 <translation id="4705716602320768426">Failkan maklum balas</translation>
-<translation id="4730258224256997107">Bantu kami memperbaik jawapan ini!</translation>
 <translation id="4731797938093519117">Akses ibu bapa</translation>
 <translation id="4734965478015604180">Mendatar</translation>
 <translation id="4735498845456076464">Pintasan papan kekunci <ph name="LAUNCHER_KEY_NAME" /> + Nombor telah berubah. Untuk menggunakan kekunci fungsi, tekan kekunci <ph name="LAUNCHER_KEY_NAME" /> + salah satu kekunci di baris atas.</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb
index b5c9bf3..02644222 100644
--- a/ash/strings/ash_strings_my.xtb
+++ b/ash/strings/ash_strings_my.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">စက်ပစ္စည်းကို မိဘသုံးကုဒ်ဖြင့် ဖွင့်ပါ</translation>
 <translation id="4702647871202761252">ပုဂ္ဂိုလ်ရေးလုံခြုံမှု ဖန်သားပြင်ကို ပိတ်ထားသည်</translation>
 <translation id="4705716602320768426">ဖိုင်အကြံပြုချက်</translation>
-<translation id="4730258224256997107">၎င်းပိုမိုကောင်းမွန်လာစေရန် ကူညီပေးပါ။</translation>
 <translation id="4731797938093519117">မိဘ သုံးခွင့်</translation>
 <translation id="4734965478015604180">အလျားလိုက်</translation>
 <translation id="4735498845456076464">‘<ph name="LAUNCHER_KEY_NAME" /> + နံပါတ်’ လက်ကွက်ဖြတ်လမ်းများကို ပြောင်းထားသည်။ လုပ်ဆောင်ချက်ကီးများ သုံးလိုပါက <ph name="LAUNCHER_KEY_NAME" /> ကီး + ထိပ်ဆုံးအတန်းရှိ ကီးကို နှိပ်ပါ။</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index 0174be7..b912aaa 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">अभिभावकको कोडमार्फत डिभाइस अनलक गर्नुहोस्</translation>
 <translation id="4702647871202761252">गोपनीयताको स्क्रिन निष्क्रिय छ</translation>
 <translation id="4705716602320768426">प्रतिक्रिया दिनुहोस्</translation>
-<translation id="4730258224256997107">हामीलाई यसको गुणस्तर सुधार गर्न सघाउनुहोस्!</translation>
 <translation id="4731797938093519117">अभिभावकको पहुँच</translation>
 <translation id="4734965478015604180">तेर्सो</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number किबोर्डका सर्टकट परिवर्तन गरिएको छ। फङ्सन की प्रयोग गर्न <ph name="LAUNCHER_KEY_NAME" /> की + माथिल्लो रोमा भएको कुनै की थिच्नुहोस्।</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 4c2a02c2..e11b67d 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Apparaat ontgrendelen met oudercode</translation>
 <translation id="4702647871202761252">Privacyscherm staat uit</translation>
 <translation id="4705716602320768426">Feedback geven</translation>
-<translation id="4730258224256997107">Help ons om dit te verbeteren.</translation>
 <translation id="4731797938093519117">Toegang door ouders</translation>
 <translation id="4734965478015604180">Horizontaal</translation>
 <translation id="4735498845456076464">De sneltoets <ph name="LAUNCHER_KEY_NAME" /> + cijfer is veranderd. Als je functietoetsen wilt gebruiken, druk je op de <ph name="LAUNCHER_KEY_NAME" />-toets + een toets op de bovenste rij.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 5be117b..4e328d5 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Lås opp enheten med foreldrekode</translation>
 <translation id="4702647871202761252">Personvernskjermen er av</translation>
 <translation id="4705716602320768426">Send tilbakemelding</translation>
-<translation id="4730258224256997107">Hjelp oss med å forbedre dette!</translation>
 <translation id="4731797938093519117">Foreldretilgang</translation>
 <translation id="4734965478015604180">Horisontal</translation>
 <translation id="4735498845456076464">Hurtigtasten <ph name="LAUNCHER_KEY_NAME" /> + tall er endret. For å bruke funksjonstastene, trykk på <ph name="LAUNCHER_KEY_NAME" />-tasten + en tast på øverste rad.</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index 920f5b69..cb5fb3e 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">ମାତାପିତାଙ୍କ କୋଡ୍‌ରେ ଡିଭାଇସ୍ ଅନଲକ୍ କରନ୍ତୁ</translation>
 <translation id="4702647871202761252">ଗୋପନୀୟତା ସ୍କ୍ରିନ୍ ବନ୍ଦ ଅଛି</translation>
 <translation id="4705716602320768426">ମତାମତ ଦାଖଲ କରନ୍ତୁ</translation>
-<translation id="4730258224256997107">ଏହାକୁ ଉନ୍ନତ କରିବାରେ ଆମକୁ ସାହାଯ୍ୟ କରନ୍ତୁ!</translation>
 <translation id="4731797938093519117">ମାତା-ପିତାଙ୍କର ଆକ୍ସେସ୍</translation>
 <translation id="4734965478015604180">ଭୂସମାନ୍ତର</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number କୀବୋର୍ଡ ସର୍ଟକଟ୍ ବଦଳି ଯାଇଛି। ଫଙ୍କସନ୍ କୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବା ପାଇଁ, <ph name="LAUNCHER_KEY_NAME" /> କୀ + ଶୀର୍ଷ ଧାଡ଼ିରେ ଥିବା ଏକ କୀକୁ ଦବାନ୍ତୁ।</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 2be14eb..c29cdd20 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">ਮਾਂ-ਪਿਓ ਦੇ ਕੋਡ ਨਾਲ ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰੋ</translation>
 <translation id="4702647871202761252">ਪਰਦੇਦਾਰੀ ਸਕ੍ਰੀਨ ਬੰਦ ਹੈ</translation>
 <translation id="4705716602320768426">ਫ਼ਾਈਲ ਬਾਰੇ ਵਿਚਾਰ</translation>
-<translation id="4730258224256997107">ਇਸਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰੋ!</translation>
 <translation id="4731797938093519117">ਮਾਂ-ਪਿਓ ਲਈ ਪਹੁੰਚ</translation>
 <translation id="4734965478015604180">ਲੇਟਵਾਂ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ਨੰਬਰ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਦਲ ਗਿਆ ਹੈ। ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਵਰਤਣ ਲਈ, <ph name="LAUNCHER_KEY_NAME" /> ਕੁੰਜੀ + ਉੱਪਰਲੀ ਕਤਾਰ 'ਤੇ ਦਿੱਤੀ ਕੋਈ ਵੀ ਕੁੰਜੀ ਦਬਾਓ।</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index c91d5f8..5f8e98a 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Odblokuj urządzenie kodem rodzica</translation>
 <translation id="4702647871202761252">Ekran chroniący prywatność jest wyłączony</translation>
 <translation id="4705716602320768426">Zgłoś opinię</translation>
-<translation id="4730258224256997107">Pomóż nam to ulepszyć.</translation>
 <translation id="4731797938093519117">Dostęp rodzica</translation>
 <translation id="4734965478015604180">Poziomo</translation>
 <translation id="4735498845456076464">Skrót klawiszowy <ph name="LAUNCHER_KEY_NAME" /> + cyfra został zmieniony. Aby użyć klawiszy funkcyjnych, naciśnij klawisz <ph name="LAUNCHER_KEY_NAME" /> + klawisz w górnym rzędzie.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 3c6d240c..0bd70df6 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Desbloquear dispositivo usando o código de pai/mãe</translation>
 <translation id="4702647871202761252">A tela de privacidade está desativada</translation>
 <translation id="4705716602320768426">Enviar feedback</translation>
-<translation id="4730258224256997107">Ajude a melhorar este recurso</translation>
 <translation id="4731797938093519117">Acesso de pai/mãe</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">O atalho de teclado <ph name="LAUNCHER_KEY_NAME" /> + tecla numérica mudou. Para usar as teclas de função, pressione <ph name="LAUNCHER_KEY_NAME" /> + uma tecla na linha superior.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index bf14673..e9c7b505 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Desbloquear o dispositivo com o código parental</translation>
 <translation id="4702647871202761252">O ecrã de privacidade está desligado</translation>
 <translation id="4705716602320768426">Envie comentários</translation>
-<translation id="4730258224256997107">Ajude-nos a melhorar isto!</translation>
 <translation id="4731797938093519117">Acesso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">O atalho de teclado <ph name="LAUNCHER_KEY_NAME" /> + número foi alterado. Para utilizar teclas de função, prima a tecla <ph name="LAUNCHER_KEY_NAME" /> + uma tecla na linha superior.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index b49a4d9..d4190b45 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Deblochează dispozitivul cu codul părintelui</translation>
 <translation id="4702647871202761252">Ecranul de confidențialitate este dezactivat</translation>
 <translation id="4705716602320768426">Feedback pentru fișiere</translation>
-<translation id="4730258224256997107">Ajută-ne să îmbunătățim!</translation>
 <translation id="4731797938093519117">Acces pentru părinți</translation>
 <translation id="4734965478015604180">Orizontal</translation>
 <translation id="4735498845456076464">Comanda rapidă de la tastatură <ph name="LAUNCHER_KEY_NAME" /> + număr s-a schimbat. Pentru a folosi tastele pentru funcții, apasă tasta <ph name="LAUNCHER_KEY_NAME" /> + o tastă de pe rândul de sus.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 76aa372..8e3db0e 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Требуется родительский код доступа</translation>
 <translation id="4702647871202761252">Экран конфиденциальности отключен</translation>
 <translation id="4705716602320768426">Отправить отзыв</translation>
-<translation id="4730258224256997107">Помочь нам улучшить этот результат</translation>
 <translation id="4731797938093519117">Родительский доступ</translation>
 <translation id="4734965478015604180">Горизонтально</translation>
 <translation id="4735498845456076464">Функция сочетания клавиш "<ph name="LAUNCHER_KEY_NAME" /> + цифра" изменилась. Чтобы выполнить действие функциональной клавиши, нажмите <ph name="LAUNCHER_KEY_NAME" /> + клавиша верхнего ряда.</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index 3877e2f..37039ab 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">මාපිය කේතය සමඟ උපාංගය අඟුලු අරින්න</translation>
 <translation id="4702647871202761252">පෞද්ගලිකත්ව තිරය අක්‍රියයි</translation>
 <translation id="4705716602320768426">ප්‍රතිපෝෂණය ගොනු කරන්න</translation>
-<translation id="4730258224256997107">මෙය වැඩි දියුණු කිරීමට අපට උදවු වන්න!</translation>
 <translation id="4731797938093519117">මාපිය ප්‍රවේශය</translation>
 <translation id="4734965478015604180">තිරස්</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + අංකය යතුරු පුවරු කෙටි මග වෙනස් වී ඇත. කාර්ය යතුරු භාවිත කිරීමට, <ph name="LAUNCHER_KEY_NAME" /> යතුර + ඉහළම පේළියේ ඇති යතුරක් ඔබන්න.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 44c30bd9..d7d8c48 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Odomknutie zariadenia kódom rodiča</translation>
 <translation id="4702647871202761252">Obrazovka ochrany súkromia je vypnutá</translation>
 <translation id="4705716602320768426">Odoslať spätnú väzbu</translation>
-<translation id="4730258224256997107">Pomôžte nám to zlepšiť</translation>
 <translation id="4731797938093519117">Rodičovský prístup</translation>
 <translation id="4734965478015604180">Na šírku</translation>
 <translation id="4735498845456076464">Klávesová skratka <ph name="LAUNCHER_KEY_NAME" /> + číslo bola zmenená. Ak chcete použiť klávesy s funkciami, stlačte kláves <ph name="LAUNCHER_KEY_NAME" /> + kláves v hornom rade.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 6c51f97..ca64731 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Odklepanje naprave s kodo starša</translation>
 <translation id="4702647871202761252">Zaslon za zasebnost je izklopljen</translation>
 <translation id="4705716602320768426">Pošiljanje povratnih informacij</translation>
-<translation id="4730258224256997107">Pomagajte nam izboljšati to!</translation>
 <translation id="4731797938093519117">Starševski dostop</translation>
 <translation id="4734965478015604180">Vodoravno</translation>
 <translation id="4735498845456076464">Bližnjica na tipkovnici <ph name="LAUNCHER_KEY_NAME" /> + številka je spremenjena. Če želite uporabljati funkcijske tipke, pritisnite tipko za <ph name="LAUNCHER_KEY_NAME" /> in tipko v vrhnji vrstici.</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb
index 502b11b..0ea8f2e 100644
--- a/ash/strings/ash_strings_sq.xtb
+++ b/ash/strings/ash_strings_sq.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">Konfigurimi</translation>
 <translation id="3573179567135747900">Ndryshoje përsëri te "<ph name="FROM_LOCALE" />" (kërkohet rinisja)</translation>
 <translation id="3576141592585647168">Ndrysho brezin orar</translation>
+<translation id="3580650856351781466">Po shkarkon skedarët e ligjërimit</translation>
 <translation id="3593039967545720377">Qasu në historikun e kujtesës së fragmenteve duke shtypur <ph name="SHORTCUT_KEY_NAME" /> + V për të parë kujtesën tënde të fragmenteve. Kopjo një artikull për të filluar.</translation>
 <translation id="3593646411856133110">Rrëshqit shpejt larg dhe mbaj shtypur për të parë aplikacionet e hapura</translation>
 <translation id="3595596368722241419">Bateria është plot</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">Shkyç pajisjen me kodin e prindit</translation>
 <translation id="4702647871202761252">Ekrani i privatësisë është joaktiv</translation>
 <translation id="4705716602320768426">Dërgo komente</translation>
-<translation id="4730258224256997107">Na ndihmo ta përmirësojmë këtë!</translation>
 <translation id="4731797938093519117">Qasja e prindit</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Shkurtorja e tastierës për <ph name="LAUNCHER_KEY_NAME" /> + Numri është ndryshuar. Për të përdorur tastet e funksioneve, shtyp tastin <ph name="LAUNCHER_KEY_NAME" /> + një tast në rreshtin e sipërm.</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb
index 5ba7350..61c22cc 100644
--- a/ash/strings/ash_strings_sr-Latn.xtb
+++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Otključajte uređaj pomoću koda roditelja</translation>
 <translation id="4702647871202761252">Ekran za privatnost je isključen</translation>
 <translation id="4705716602320768426">Pošaljite povratne informacije</translation>
-<translation id="4730258224256997107">Pomozite nam da ovo poboljšamo!</translation>
 <translation id="4731797938093519117">Roditeljski pristup</translation>
 <translation id="4734965478015604180">Horizontalno</translation>
 <translation id="4735498845456076464">Tasterska prečica <ph name="LAUNCHER_KEY_NAME" /> + broj je promenjena. Da biste koristili funkcijske tastere, pritisnite taster <ph name="LAUNCHER_KEY_NAME" /> + taster u gornjem redu.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 01a5e98..31ef547 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Откључајте уређај помоћу кода родитеља</translation>
 <translation id="4702647871202761252">Екран за приватност је искључен</translation>
 <translation id="4705716602320768426">Пошаљите повратне информације</translation>
-<translation id="4730258224256997107">Помозите нам да ово побољшамо!</translation>
 <translation id="4731797938093519117">Родитељски приступ</translation>
 <translation id="4734965478015604180">Хоризонтално</translation>
 <translation id="4735498845456076464">Тастерска пречица <ph name="LAUNCHER_KEY_NAME" /> + број је промењена. Да бисте користили функцијске тастере, притисните тастер <ph name="LAUNCHER_KEY_NAME" /> + тастер у горњем реду.</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 8e777a5..bee1550 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Lås upp enheten med föräldrakod</translation>
 <translation id="4702647871202761252">Sekretesskärmen är inaktiverad</translation>
 <translation id="4705716602320768426">Skicka feedback</translation>
-<translation id="4730258224256997107">Hjälp oss att förbättra detta.</translation>
 <translation id="4731797938093519117">Föräldraåtkomst</translation>
 <translation id="4734965478015604180">Horisontell</translation>
 <translation id="4735498845456076464">Kortkommandot <ph name="LAUNCHER_KEY_NAME" /> + siffra har ändrats. Nu används <ph name="LAUNCHER_KEY_NAME" />-tangenten + en tangent i översta raden som funktionstangenter.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index a75e64e..f533d9f 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Fungua kifaa ukitumia msimbo wa mzazi</translation>
 <translation id="4702647871202761252">Skrini ya faragha imezimwa</translation>
 <translation id="4705716602320768426">Tuma maoni</translation>
-<translation id="4730258224256997107">Tusaidie kuboresha kipengele hiki!</translation>
 <translation id="4731797938093519117">Idhini ya mzazi</translation>
 <translation id="4734965478015604180">Kimlalo</translation>
 <translation id="4735498845456076464">Mikato ya kibodi ya <ph name="LAUNCHER_KEY_NAME" /> + Nambari imebadilika. Ili utumie vitufe vya kukokotoa, bonyeza kitufe cha <ph name="LAUNCHER_KEY_NAME" /> pamoja na kitufe kwenye safu mlalo ya juu.</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 29a51aa9..fb9b387 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">பெற்றோர் குறியீட்டின் மூலம் சாதனத்தை அன்லாக் செய்தல்</translation>
 <translation id="4702647871202761252">தனிப்பட்ட திரை முடக்கப்பட்டுள்ளது</translation>
 <translation id="4705716602320768426">கருத்தைப் பதிவுசெய்க</translation>
-<translation id="4730258224256997107">இதை மேம்படுத்த உதவுங்கள்!</translation>
 <translation id="4731797938093519117">பெற்றோர் அணுகல்</translation>
 <translation id="4734965478015604180">கிடைமட்டம்</translation>
 <translation id="4735498845456076464">இந்தக் கீபோர்டு ஷார்ட்கட் மாற்றப்பட்டுள்ளது: <ph name="LAUNCHER_KEY_NAME" /> + எண். செயல்பாட்டு பட்டன்களைப் பயன்படுத்த, <ph name="LAUNCHER_KEY_NAME" /> பட்டன் + மேல் வரிசையில் உள்ள ஒரு பட்டனை அழுத்தவும்.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index c8384cf..30ad0d5 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">తల్లి/తండ్రి కోడ్‌తో పరికరాన్ని అన్‌లాక్ చేయండి</translation>
 <translation id="4702647871202761252">గోప్యతా స్క్రీన్ ఆఫ్‌లో ఉంది</translation>
 <translation id="4705716602320768426">ఫైల్ ఫీడ్‌బ్యాక్</translation>
-<translation id="4730258224256997107">దీనిని మెరుగుపరచడంలో మాకు సహాయపడండి!</translation>
 <translation id="4731797938093519117">తల్లి/తండ్రి యాక్సెస్</translation>
 <translation id="4734965478015604180">అడ్డంగా ఉంది</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + నంబర్ కీబోర్డ్ షార్ట్‌కట్ మార్చబడింది. ఫంక్షన్ కీలను ఉపయోగించడానికి, <ph name="LAUNCHER_KEY_NAME" /> కీ + ఎగువ అడ్డు వరుసలోని కీను నొక్కండి.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 2d29466..b8cbbe6 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">ปลดล็อกอุปกรณ์ด้วยรหัสของผู้ปกครอง</translation>
 <translation id="4702647871202761252">หน้าจอส่วนตัวปิดอยู่</translation>
 <translation id="4705716602320768426">ความคิดเห็นเกี่ยวกับไฟล์</translation>
-<translation id="4730258224256997107">ช่วยเราปรับปรุงการค้นหานี้</translation>
 <translation id="4731797938093519117">การเข้าถึงของผู้ปกครอง</translation>
 <translation id="4734965478015604180">แนวนอน</translation>
 <translation id="4735498845456076464">มีการเปลี่ยนแปลงแป้นพิมพ์ลัด <ph name="LAUNCHER_KEY_NAME" /> + ตัวเลข หากต้องการใช้แป้นฟังก์ชัน ให้กดแป้น <ph name="LAUNCHER_KEY_NAME" /> + แป้นแถวบนสุด</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 9694042b..7ef416f3 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Kilidi ebeveyn koduyla açın</translation>
 <translation id="4702647871202761252">Gizlilik ekranı kapalı</translation>
 <translation id="4705716602320768426">Geri bildirim gönder</translation>
-<translation id="4730258224256997107">Bu özelliği iyileştirmemize yardımcı olun.</translation>
 <translation id="4731797938093519117">Ebeveyn erişimi</translation>
 <translation id="4734965478015604180">Yatay</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Sayı klavye kısayolu değişti. İşlev tuşlarını kullanmak için <ph name="LAUNCHER_KEY_NAME" /> tuşu + üst sıradaki tuşlardan birine basın.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 80dd85f2..b97b1507 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Введіть код доступу батьків</translation>
 <translation id="4702647871202761252">Екран конфіденційності вимкнено</translation>
 <translation id="4705716602320768426">Надіслати відгук</translation>
-<translation id="4730258224256997107">Допоможіть нам покращити цю функцію.</translation>
 <translation id="4731797938093519117">Батьківський доступ</translation>
 <translation id="4734965478015604180">Горизонтально</translation>
 <translation id="4735498845456076464">Комбінацію клавіш "<ph name="LAUNCHER_KEY_NAME" /> + цифра" змінено. Щоб скористатися функціональними клавішами, натисніть <ph name="LAUNCHER_KEY_NAME" /> + клавішу у верхньому рядку.</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index e645806..6009dfa7 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">والدین کے کوڈ سے آلہ غیر مقفل کریں</translation>
 <translation id="4702647871202761252">رازداری کی اسکرین آف ہے</translation>
 <translation id="4705716602320768426">تاثرات فائل کریں</translation>
-<translation id="4730258224256997107">اس کو بہتر بنانے میں ہماری مدد کریں!</translation>
 <translation id="4731797938093519117">والدین کی رسائی</translation>
 <translation id="4734965478015604180">افقی</translation>
 <translation id="4735498845456076464">‏Number + <ph name="LAUNCHER_KEY_NAME" /> کی بورڈ شارٹ کٹ تبدیل ہو گیا ہے۔ فنکشن کلیدوں کا استعمال کرنے کے لیے <ph name="LAUNCHER_KEY_NAME" /> کلید + سب سے اوپر کی قطار پر ایک کلید کو دبائیں۔</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 57eb7d6..36e13c6d3 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Ota-ona kodi bilan qurilmani qulfdan chiqarish</translation>
 <translation id="4702647871202761252">Maxfiylik ekrani yoniq emas</translation>
 <translation id="4705716602320768426">Fikr-mulohaza yuborish</translation>
-<translation id="4730258224256997107">Buni takomillashtirishga yordam bering!</translation>
 <translation id="4731797938093519117">Ota-ona kirishi</translation>
 <translation id="4734965478015604180">Gorizontal</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Raqam tezkor tugmasi oʻzgardi. Funksiya tugmalaridan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + yuqori qatordagi kalitni bosing.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index d367afb..30566fe3 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">Thiết lập</translation>
 <translation id="3573179567135747900">Thay đổi lại thành "<ph name="FROM_LOCALE" />" (yêu cầu khởi động lại)</translation>
 <translation id="3576141592585647168">Thay đổi múi giờ</translation>
+<translation id="3580650856351781466">Đang tải các tệp mã chuyển lời nói thành văn bản xuống</translation>
 <translation id="3593039967545720377">Truy cập vào nhật ký lưu dữ liệu vào bảng nhớ tạm bằng cách nhấn tổ hợp phím <ph name="SHORTCUT_KEY_NAME" /> + V để xem bảng nhớ tạm của bạn. Hãy sao chép một mục để bắt đầu.</translation>
 <translation id="3593646411856133110">Vuốt lên và giữ để xem các ứng dụng đang mở</translation>
 <translation id="3595596368722241419">Pin đầy</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">Mở khóa thiết bị bằng mã dành cho cha mẹ</translation>
 <translation id="4702647871202761252">Màn hình bảo vệ quyền riêng tư đang tắt</translation>
 <translation id="4705716602320768426">Gửi ý kiến phản hồi</translation>
-<translation id="4730258224256997107">Hãy giúp chúng tôi cải thiện nội dung này!</translation>
 <translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation>
 <translation id="4734965478015604180">Ngang</translation>
 <translation id="4735498845456076464">Phím tắt <ph name="LAUNCHER_KEY_NAME" /> + Số đã thay đổi. Để sử dụng các phím chức năng, hãy nhấn tổ hợp phím <ph name="LAUNCHER_KEY_NAME" /> + một phím ở hàng trên cùng.</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index e9e15e8..cf5815b 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -484,7 +484,6 @@
 <translation id="4696813013609194136">使用家长访问代码解锁设备</translation>
 <translation id="4702647871202761252">已关闭隐私保护屏</translation>
 <translation id="4705716602320768426">提交反馈</translation>
-<translation id="4730258224256997107">欢迎协助我们改进这条查询!</translation>
 <translation id="4731797938093519117">家长访问</translation>
 <translation id="4734965478015604180">横向</translation>
 <translation id="4735498845456076464">键盘快捷键“<ph name="LAUNCHER_KEY_NAME" /> + 数字键”已更改。若要使用功能键,请按<ph name="LAUNCHER_KEY_NAME" />键 + 顶排的某个键。</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index 858ee70..3f598ddb 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">使用家長存取碼解鎖裝置</translation>
 <translation id="4702647871202761252">已停用私隱保護畫面</translation>
 <translation id="4705716602320768426">提供意見</translation>
-<translation id="4730258224256997107">協助改善此功能!</translation>
 <translation id="4731797938093519117">家長存取</translation>
 <translation id="4734965478015604180">橫向</translation>
 <translation id="4735498845456076464">「<ph name="LAUNCHER_KEY_NAME" />鍵 + 數字鍵」的鍵盤快速鍵已變更。如要使用功能鍵,請按下<ph name="LAUNCHER_KEY_NAME" />鍵 + 最上排的任一按鍵。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 2ba221a..4a28ac9 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -324,6 +324,7 @@
 <translation id="3571734092741541777">設定</translation>
 <translation id="3573179567135747900">改回「<ph name="FROM_LOCALE" />」(需要重新啟動)</translation>
 <translation id="3576141592585647168">變更時區</translation>
+<translation id="3580650856351781466">正在下載語音檔案</translation>
 <translation id="3593039967545720377">按下 <ph name="SHORTCUT_KEY_NAME" /> + V 鍵查看剪貼簿,藉此存取剪貼簿歷史記錄。複製任一項目即可開始。</translation>
 <translation id="3593646411856133110">向上滑動並按住螢幕即可查看開啟的應用程式</translation>
 <translation id="3595596368722241419">電池已充滿</translation>
@@ -484,7 +485,6 @@
 <translation id="4696813013609194136">使用家長存取碼將裝置解鎖</translation>
 <translation id="4702647871202761252">已停用隱私保護畫面</translation>
 <translation id="4705716602320768426">提供意見回饋</translation>
-<translation id="4730258224256997107">協助改善這項功能!</translation>
 <translation id="4731797938093519117">家長存取</translation>
 <translation id="4734965478015604180">橫向</translation>
 <translation id="4735498845456076464">「<ph name="LAUNCHER_KEY_NAME" /> 鍵 + 數字鍵」的鍵盤快速鍵已變更。如要使用功能鍵,請按下<ph name="LAUNCHER_KEY_NAME" /> 鍵 + 最上排的任一按鍵。</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb
index 011e796f..4b66e7ea 100644
--- a/ash/strings/ash_strings_zu.xtb
+++ b/ash/strings/ash_strings_zu.xtb
@@ -485,7 +485,6 @@
 <translation id="4696813013609194136">Vula idivayisi ngekhodi yomzali</translation>
 <translation id="4702647871202761252">Isikrini sobumfihlo sivaliwe</translation>
 <translation id="4705716602320768426">Impendulo yefayela</translation>
-<translation id="4730258224256997107">Sisize ukuthuthukisa lokhu!</translation>
 <translation id="4731797938093519117">Ukufinyelela komzali</translation>
 <translation id="4734965478015604180">Okuvundlile</translation>
 <translation id="4735498845456076464">Isinqamuleli sekhibhodi se-<ph name="LAUNCHER_KEY_NAME" /> + Inombolo sishintshile. Ukuze usebenzise okhiye bokukhethwayo, cindezela ukhiye we-<ph name="LAUNCHER_KEY_NAME" /> + ukhiye ophezulu emugqeni.</translation>
diff --git a/ash/system/accessibility/dictation_button_tray.cc b/ash/system/accessibility/dictation_button_tray.cc
index b784ee3..0a619a38 100644
--- a/ash/system/accessibility/dictation_button_tray.cc
+++ b/ash/system/accessibility/dictation_button_tray.cc
@@ -122,14 +122,15 @@
   UpdateIcon(Shell::Get()->accessibility_controller()->dictation_active());
 }
 
-void DictationButtonTray::UpdateOnSodaChanged(bool soda_download_in_progress) {
+void DictationButtonTray::UpdateOnSpeechRecognitionDownloadChanged(
+    bool download_in_progress) {
   if (!::features::IsExperimentalAccessibilityDictationOfflineEnabled() ||
       !visible_preferred())
     return;
 
-  SetEnabled(!soda_download_in_progress);
+  SetEnabled(!download_in_progress);
   icon_->SetTooltipText(l10n_util::GetStringUTF16(
-      soda_download_in_progress
+      download_in_progress
           ? IDS_ASH_ACCESSIBILITY_DICTATION_BUTTON_TOOLTIP_SODA_DOWNLOADING
           : IDS_ASH_STATUS_TRAY_ACCESSIBILITY_DICTATION));
 }
diff --git a/ash/system/accessibility/dictation_button_tray.h b/ash/system/accessibility/dictation_button_tray.h
index 7a1e8a3..4de18df 100644
--- a/ash/system/accessibility/dictation_button_tray.h
+++ b/ash/system/accessibility/dictation_button_tray.h
@@ -55,8 +55,9 @@
   // views::View:
   const char* GetClassName() const override;
 
-  // Updates this button's state when SODA download state changes.
-  void UpdateOnSodaChanged(bool soda_download_in_progress);
+  // Updates this button's state when speech recognition file download state
+  // changes.
+  void UpdateOnSpeechRecognitionDownloadChanged(bool download_in_progress);
 
  private:
   friend class DictationButtonTrayTest;
diff --git a/ash/system/accessibility/dictation_button_tray_unittest.cc b/ash/system/accessibility/dictation_button_tray_unittest.cc
index ad22cb5..aa98669 100644
--- a/ash/system/accessibility/dictation_button_tray_unittest.cc
+++ b/ash/system/accessibility/dictation_button_tray_unittest.cc
@@ -172,20 +172,19 @@
   std::unique_ptr<speech::SodaInstallerImplChromeOS> soda_installer_impl_;
 };
 
-// Tests the behavior of the UpdateOnSodaChanged() method, which gets called
-// whenever SODA download state changes.
-TEST_F(DictationButtonTraySodaTest, UpdateOnSodaChanged) {
+// Tests the behavior of the UpdateOnSpeechRecognitionDownloadChanged() method.
+TEST_F(DictationButtonTraySodaTest, UpdateOnSpeechRecognitionDownloadChanged) {
   AccessibilityControllerImpl* controller =
       Shell::Get()->accessibility_controller();
   controller->dictation().SetEnabled(true);
   DictationButtonTray* tray = GetTray();
   views::ImageView* image = GetImageView(tray);
 
-  tray->UpdateOnSodaChanged(true);
+  tray->UpdateOnSpeechRecognitionDownloadChanged(true);
   EXPECT_FALSE(tray->GetEnabled());
   EXPECT_EQ(base::UTF8ToUTF16(kDisabledTooltip), image->GetTooltipText());
 
-  tray->UpdateOnSodaChanged(false);
+  tray->UpdateOnSpeechRecognitionDownloadChanged(false);
   EXPECT_TRUE(tray->GetEnabled());
   EXPECT_EQ(base::UTF8ToUTF16(kEnabledTooltip), image->GetTooltipText());
 }
diff --git a/ash/system/bluetooth/bluetooth_feature_pod_controller.cc b/ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.cc
similarity index 86%
rename from ash/system/bluetooth/bluetooth_feature_pod_controller.cc
rename to ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.cc
index 1a0cbec..01e41df3 100644
--- a/ash/system/bluetooth/bluetooth_feature_pod_controller.cc
+++ b/ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.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 "ash/system/bluetooth/bluetooth_feature_pod_controller.h"
+#include "ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.h"
 
 #include <utility>
 
@@ -18,24 +18,24 @@
 #include "services/device/public/cpp/bluetooth/bluetooth_utils.h"
 #include "ui/base/l10n/l10n_util.h"
 
-using device::mojom::BluetoothSystem;
 using device::mojom::BluetoothDeviceInfo;
+using device::mojom::BluetoothSystem;
 
 namespace ash {
 
-BluetoothFeaturePodController::BluetoothFeaturePodController(
+BluetoothFeaturePodControllerLegacy::BluetoothFeaturePodControllerLegacy(
     UnifiedSystemTrayController* tray_controller)
     : tray_controller_(tray_controller) {
   Shell::Get()->tray_bluetooth_helper()->AddObserver(this);
 }
 
-BluetoothFeaturePodController::~BluetoothFeaturePodController() {
+BluetoothFeaturePodControllerLegacy::~BluetoothFeaturePodControllerLegacy() {
   auto* helper = Shell::Get()->tray_bluetooth_helper();
   if (helper)
     helper->RemoveObserver(this);
 }
 
-FeaturePodButton* BluetoothFeaturePodController::CreateButton() {
+FeaturePodButton* BluetoothFeaturePodControllerLegacy::CreateButton() {
   DCHECK(!button_);
   button_ = new FeaturePodButton(this);
   button_->ShowDetailedViewArrow();
@@ -43,7 +43,7 @@
   return button_;
 }
 
-void BluetoothFeaturePodController::OnIconPressed() {
+void BluetoothFeaturePodControllerLegacy::OnIconPressed() {
   bool was_enabled = button_->IsToggled();
   Shell::Get()->tray_bluetooth_helper()->SetBluetoothEnabled(!was_enabled);
 
@@ -52,16 +52,16 @@
     tray_controller_->ShowBluetoothDetailedView();
 }
 
-void BluetoothFeaturePodController::OnLabelPressed() {
+void BluetoothFeaturePodControllerLegacy::OnLabelPressed() {
   Shell::Get()->tray_bluetooth_helper()->SetBluetoothEnabled(true);
   tray_controller_->ShowBluetoothDetailedView();
 }
 
-SystemTrayItemUmaType BluetoothFeaturePodController::GetUmaType() const {
+SystemTrayItemUmaType BluetoothFeaturePodControllerLegacy::GetUmaType() const {
   return SystemTrayItemUmaType::UMA_BLUETOOTH;
 }
 
-void BluetoothFeaturePodController::UpdateButton() {
+void BluetoothFeaturePodControllerLegacy::UpdateButton() {
   bool is_available =
       Shell::Get()->tray_bluetooth_helper()->IsBluetoothStateAvailable();
   button_->SetVisible(is_available);
@@ -142,7 +142,7 @@
   }
 }
 
-void BluetoothFeaturePodController::SetTooltipState(
+void BluetoothFeaturePodControllerLegacy::SetTooltipState(
     const std::u16string& tooltip_state) {
   if (button_->GetEnabled()) {
     button_->SetIconTooltip(l10n_util::GetStringFUTF16(
@@ -157,15 +157,15 @@
   }
 }
 
-void BluetoothFeaturePodController::OnBluetoothSystemStateChanged() {
+void BluetoothFeaturePodControllerLegacy::OnBluetoothSystemStateChanged() {
   UpdateButton();
 }
 
-void BluetoothFeaturePodController::OnBluetoothScanStateChanged() {
+void BluetoothFeaturePodControllerLegacy::OnBluetoothScanStateChanged() {
   UpdateButton();
 }
 
-void BluetoothFeaturePodController::OnBluetoothDeviceListChanged() {
+void BluetoothFeaturePodControllerLegacy::OnBluetoothDeviceListChanged() {
   UpdateButton();
 }
 
diff --git a/ash/system/bluetooth/bluetooth_feature_pod_controller.h b/ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.h
similarity index 64%
rename from ash/system/bluetooth/bluetooth_feature_pod_controller.h
rename to ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.h
index f31446e..aad1204 100644
--- a/ash/system/bluetooth/bluetooth_feature_pod_controller.h
+++ b/ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.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 ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_H_
-#define ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_H_
+#ifndef ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_LEGACY_H_
+#define ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_LEGACY_H_
 
 #include <string>
 
@@ -16,11 +16,15 @@
 class UnifiedSystemTrayController;
 
 // Controller of a feature pod button of bluetooth.
-class BluetoothFeaturePodController : public FeaturePodControllerBase,
-                                      public TrayBluetoothHelper::Observer {
+// TODO(crbug.com/1234138): Remove this class when the
+// |ash::features::kBluetoothRevamp| feature flag is fully launched.
+class BluetoothFeaturePodControllerLegacy
+    : public FeaturePodControllerBase,
+      public TrayBluetoothHelper::Observer {
  public:
-  BluetoothFeaturePodController(UnifiedSystemTrayController* tray_controller);
-  ~BluetoothFeaturePodController() override;
+  BluetoothFeaturePodControllerLegacy(
+      UnifiedSystemTrayController* tray_controller);
+  ~BluetoothFeaturePodControllerLegacy() override;
 
   // FeaturePodControllerBase:
   FeaturePodButton* CreateButton() override;
@@ -41,9 +45,9 @@
   UnifiedSystemTrayController* const tray_controller_;
   FeaturePodButton* button_ = nullptr;
 
-  DISALLOW_COPY_AND_ASSIGN(BluetoothFeaturePodController);
+  DISALLOW_COPY_AND_ASSIGN(BluetoothFeaturePodControllerLegacy);
 };
 
 }  // namespace ash
 
-#endif  // ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_H_
+#endif  // ASH_SYSTEM_BLUETOOTH_BLUETOOTH_FEATURE_POD_CONTROLLER_LEGACY_H_
diff --git a/ash/system/network/cellular_setup_notifier_unittest.cc b/ash/system/network/cellular_setup_notifier_unittest.cc
index 15be5cf..f667792 100644
--- a/ash/system/network/cellular_setup_notifier_unittest.cc
+++ b/ash/system/network/cellular_setup_notifier_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "ash/system/network/cellular_setup_notifier.h"
 
-#include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
@@ -12,7 +11,6 @@
 #include "ash/test/ash_test_base.h"
 #include "base/bind.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/timer/mock_timer.h"
 #include "chromeos/dbus/hermes/hermes_clients.h"
 #include "chromeos/dbus/shill/shill_clients.h"
@@ -45,10 +43,6 @@
   ~CellularSetupNotifierTest() override = default;
 
   void SetUp() override {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndEnableFeature(
-        chromeos::features::kUpdatedCellularActivationUi);
-
     chromeos::SystemTokenCertDbStorage::Initialize();
     chromeos::NetworkCertLoader::Initialize();
     chromeos::shill_clients::InitializeFakes();
diff --git a/ash/system/power/tray_power.cc b/ash/system/power/tray_power.cc
index 6116a503..d3be0ce 100644
--- a/ash/system/power/tray_power.cc
+++ b/ash/system/power/tray_power.cc
@@ -46,7 +46,6 @@
   SetBorder(
       views::CreateEmptyBorder(0, 0, kUnifiedTrayBatteryBottomPadding, 0));
   CreateImageView();
-  UpdateImage();
   UpdateStatus();
   PowerStatus::Get()->AddObserver(this);
 }
@@ -82,7 +81,7 @@
 
 void PowerTrayView::OnThemeChanged() {
   TrayItemView::OnThemeChanged();
-  UpdateImage();
+  UpdateImage(/*icon_color_changed=*/true);
 }
 
 void PowerTrayView::HandleLocaleChange() {
@@ -94,11 +93,15 @@
 }
 
 void PowerTrayView::OnSessionStateChanged(session_manager::SessionState state) {
-  UpdateImage();
+  // Icon color changes only happens when switching session states between OOBE
+  // and other state.
+  UpdateImage(session_state_ == session_manager::SessionState::OOBE ||
+              state == session_manager::SessionState::OOBE);
+  session_state_ = state;
 }
 
 void PowerTrayView::UpdateStatus() {
-  UpdateImage();
+  UpdateImage(/*icon_color_changed=*/false);
   SetVisible(PowerStatus::Get()->IsBatteryPresent());
   accessible_name_ = PowerStatus::Get()->GetAccessibleNameString(true);
   tooltip_ = PowerStatus::Get()->GetInlinedStatusString();
@@ -107,22 +110,17 @@
   image_view()->SetAccessibleName(accessible_name_);
 }
 
-void PowerTrayView::UpdateImage() {
+void PowerTrayView::UpdateImage(bool icon_color_changed) {
   const PowerStatus::BatteryImageInfo& info =
       PowerStatus::Get()->GetBatteryImageInfo();
-  session_manager::SessionState session_state =
-      Shell::Get()->session_controller()->GetSessionState();
-
-  // Only change the image when the info changes and the icon color has not
+  // Only change the image when the info changes or the icon color has
   // changed. http://crbug.com/589348
-  if (info_ && info_->ApproximatelyEqual(info) &&
-      icon_session_state_color_ == session_state)
+  if (info_ && info_->ApproximatelyEqual(info) && !icon_color_changed)
     return;
   info_ = info;
-  icon_session_state_color_ = session_state;
 
   // Note: The icon color (both fg and bg) changes when the UI in in OOBE mode.
-  const SkColor icon_fg_color = TrayIconColor(session_state);
+  const SkColor icon_fg_color = TrayIconColor(session_state_);
   const SkColor icon_bg_color = color_utils::GetResultingPaintColor(
       ShelfConfig::Get()->GetShelfControlButtonColor(),
       AshColorProvider::Get()->GetBackgroundColor());
diff --git a/ash/system/power/tray_power.h b/ash/system/power/tray_power.h
index 2168be8..975e73d 100644
--- a/ash/system/power/tray_power.h
+++ b/ash/system/power/tray_power.h
@@ -43,12 +43,12 @@
 
  private:
   void UpdateStatus();
-  void UpdateImage();
+  void UpdateImage(bool icon_color_changed);
 
   std::u16string accessible_name_;
   std::u16string tooltip_;
   absl::optional<PowerStatus::BatteryImageInfo> info_;
-  session_manager::SessionState icon_session_state_color_ =
+  session_manager::SessionState session_state_ =
       session_manager::SessionState::UNKNOWN;
   ScopedSessionObserver session_observer_{this};
 
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index 161ad716..98ee7c3 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -19,7 +19,7 @@
 #include "ash/system/accessibility/unified_accessibility_detailed_view_controller.h"
 #include "ash/system/audio/unified_audio_detailed_view_controller.h"
 #include "ash/system/audio/unified_volume_slider_controller.h"
-#include "ash/system/bluetooth/bluetooth_feature_pod_controller.h"
+#include "ash/system/bluetooth/bluetooth_feature_pod_controller_legacy.h"
 #include "ash/system/bluetooth/unified_bluetooth_detailed_view_controller.h"
 #include "ash/system/brightness/unified_brightness_slider_controller.h"
 #include "ash/system/cast/cast_feature_pod_controller.h"
@@ -450,7 +450,8 @@
 
 void UnifiedSystemTrayController::InitFeaturePods() {
   AddFeaturePodItem(std::make_unique<NetworkFeaturePodController>(this));
-  AddFeaturePodItem(std::make_unique<BluetoothFeaturePodController>(this));
+  AddFeaturePodItem(
+      std::make_unique<BluetoothFeaturePodControllerLegacy>(this));
   AddFeaturePodItem(std::make_unique<AccessibilityFeaturePodController>(this));
   AddFeaturePodItem(std::make_unique<QuietModeFeaturePodController>(this));
   AddFeaturePodItem(std::make_unique<RotationLockFeaturePodController>());
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index d2cac5b3..fd7a50f 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -351,7 +351,7 @@
     // is a next frame.
     ignore_result(ui::WaitForNextFrameToBePresented(
         Shell::GetPrimaryRootWindow()->layer()->GetCompositor(),
-        base::TimeDelta::FromMilliseconds(100)));
+        base::TimeDelta::FromMilliseconds(500)));
 
     {
       SCOPED_TRACE(trace + std::string(".Enter"));
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 7a0a4f5..ea830bff 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -285,6 +285,7 @@
     "files/file.h",
     "files/file_enumerator.cc",
     "files/file_enumerator.h",
+    "files/file_error_or.h",
     "files/file_path.cc",
     "files/file_path.h",
     "files/file_path_constants.cc",
@@ -2615,7 +2616,6 @@
     "task/thread_pool/thread_pool_perftest.cc",
     "threading/counter_perftest.cc",
     "threading/thread_local_storage_perftest.cc",
-    "vlog_perftest.cc",
 
     # "test/run_all_unittests.cc",
     "json/json_perftest.cc",
diff --git a/base/allocator/allocator.gni b/base/allocator/allocator.gni
index 2d07edd0..4baec94 100644
--- a/base/allocator/allocator.gni
+++ b/base/allocator/allocator.gni
@@ -15,7 +15,7 @@
 # - Chromecast on Android: causes issues with crash reporting, see b/178423326.
 _disable_partition_alloc =
     is_component_build || (is_win && is_debug) || (is_android && is_chromecast)
-_is_partition_alloc_platform = is_android || is_win || is_linux
+_is_partition_alloc_platform = is_android || is_win || is_linux || is_chromeos
 
 # The debug CRT on Windows has some debug features that are incompatible with
 # the shim. NaCl in particular does seem to link some binaries statically
diff --git a/base/files/file_error_or.h b/base/files/file_error_or.h
new file mode 100644
index 0000000..ce1b3cf
--- /dev/null
+++ b/base/files/file_error_or.h
@@ -0,0 +1,59 @@
+// 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.
+
+#ifndef BASE_FILES_FILE_ERROR_OR_H_
+#define BASE_FILES_FILE_ERROR_OR_H_
+
+#include <utility>
+
+#include "base/check.h"
+#include "base/files/file.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
+
+namespace base {
+
+// Helper for methods which perform file system operations and which may fail.
+// Objects of this type can take on EITHER a base::File::Error value OR a result
+// value of the specified type.
+template <typename ValueType>
+class FileErrorOr {
+ public:
+  // These constructors are intentionally not marked `explicit` for cleaner code
+  // at call sites.
+  FileErrorOr(base::File::Error error) : error_or_value_(error) {}
+  FileErrorOr(ValueType&& value) : error_or_value_(std::move(value)) {}
+  FileErrorOr(const FileErrorOr&) = default;
+  FileErrorOr(FileErrorOr&&) = default;
+  FileErrorOr& operator=(const FileErrorOr&) = default;
+  FileErrorOr& operator=(FileErrorOr&&) = default;
+  ~FileErrorOr() = default;
+
+  bool is_error() const {
+    return absl::get_if<base::File::Error>(&error_or_value_);
+  }
+  base::File::Error error() const {
+    CHECK(is_error());
+    return absl::get<base::File::Error>(error_or_value_);
+  }
+
+  bool is_value() const { return absl::get_if<ValueType>(&error_or_value_); }
+  ValueType& value() {
+    CHECK(!is_error());
+    return absl::get<ValueType>(error_or_value_);
+  }
+  const ValueType& value() const {
+    CHECK(!is_error());
+    return absl::get<const ValueType>(error_or_value_);
+  }
+
+  ValueType* operator->() { return &value(); }
+  const ValueType* operator->() const { return &value(); }
+
+ private:
+  absl::variant<base::File::Error, ValueType> error_or_value_;
+};
+
+}  // namespace base
+
+#endif  // BASE_FILES_FILE_ERROR_OR_H_
diff --git a/base/files/important_file_writer_cleaner.cc b/base/files/important_file_writer_cleaner.cc
index afa6333..edaceb1 100644
--- a/base/files/important_file_writer_cleaner.cc
+++ b/base/files/important_file_writer_cleaner.cc
@@ -12,7 +12,6 @@
 #include "base/bind.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
-#include "base/metrics/histogram_functions.h"
 #include "base/process/process.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -170,12 +169,9 @@
     std::vector<FilePath> directories,
     std::atomic_bool& stop_flag) {
   DCHECK(!directories.empty());
-  bool stop = false;
   for (auto scan = directories.begin(), end = directories.end(); scan != end;
        ++scan) {
     const auto& directory = *scan;
-    ClampedNumeric<int> successes;
-    ClampedNumeric<int> fails;
     FileEnumerator file_enum(
         directory, /*recursive=*/false, FileEnumerator::FILES,
         FormatTemporaryFileName(FILE_PATH_LITERAL("*")).value());
@@ -184,23 +180,14 @@
       const FileEnumerator::FileInfo info = file_enum.GetInfo();
       if (info.GetLastModifiedTime() >= upper_bound_time)
         continue;
-      if (DeleteFile(path))
-        ++successes;
-      else
-        ++fails;
+      // Cleanup is a best-effort process, so ignore any failures here and
+      // continue to clean as much as possible. Metrics tell us that ~98.4% of
+      // directories are cleaned with no failures.
+      DeleteFile(path);
       // Break out without checking for the next file if a stop is requested.
-      stop = stop_flag.load(std::memory_order_relaxed);
-      if (stop)
-        break;
+      if (stop_flag.load(std::memory_order_relaxed))
+        return false;
     }
-    // Record metrics for this directory regardless of whether it was fully
-    // processed or if the cleaner is being stopped.
-    if (successes != 0 || fails != 0) {
-      UmaHistogramCounts1M("Windows.TmpFileDeleter.SuccessCount", successes);
-      UmaHistogramCounts1M("Windows.TmpFileDeleter.FailCount", fails);
-    }
-    if (stop)
-      return false;
   }
   return true;
 }
diff --git a/base/files/important_file_writer_cleaner.h b/base/files/important_file_writer_cleaner.h
index d4013999..60022c6 100644
--- a/base/files/important_file_writer_cleaner.h
+++ b/base/files/important_file_writer_cleaner.h
@@ -34,12 +34,9 @@
 // Start method at some point during startup to enable the cleaner.
 // ImportantFileWriter calls the AddDirectory method to provide the directory
 // hosting an "important" file. Hosting processes are expected to call the Stop
-// method at shutdown so that metrics of an in-process execution can be
-// recorded.
+// method at shutdown.
 //
-// The deletion scan takes place in a background task. Metrics are recorded when
-// a directory is fully processed, or shortly after the hosting process calls
-// the Stop method.
+// The deletion scan takes place in a background task.
 class BASE_EXPORT ImportantFileWriterCleaner {
  public:
   // Gets the process-wide single instance of the cleaner.
@@ -68,7 +65,7 @@
   void Start();
 
   // Stops the instance. The background task, if it is active, is notified to
-  // record metrics on the directory in progress and exit.
+  // halt processing and return.
   void Stop();
 
   // Brings the instance back to the uninitialized state. This should be used in
diff --git a/base/files/important_file_writer_cleaner_unittest.cc b/base/files/important_file_writer_cleaner_unittest.cc
index c7b5aa1e..33232e87 100644
--- a/base/files/important_file_writer_cleaner_unittest.cc
+++ b/base/files/important_file_writer_cleaner_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/task/thread_pool.h"
 #include "base/test/bind.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_waitable_event.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -89,7 +88,6 @@
 
   ScopedTempDir temp_dir_;
   test::TaskEnvironment task_environment_;
-  HistogramTester histogram_tester_;
 
  private:
   const Time old_file_time_;
@@ -181,12 +179,6 @@
   EXPECT_TRUE(PathExists(dir_2_file_new()));
   EXPECT_TRUE(PathExists(dir_2_file_old()));
   EXPECT_TRUE(PathExists(dir_2_file_other()));
-
-  // There should be 1 success and 0 failure logged for the one dir.
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       1);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       1);
 }
 
 // Tests that adding multiple directories before starting cleans both.
@@ -204,12 +196,6 @@
   EXPECT_TRUE(PathExists(dir_2_file_new()));
   EXPECT_FALSE(PathExists(dir_2_file_old()));
   EXPECT_TRUE(PathExists(dir_2_file_other()));
-
-  // There should be 2 success and 2 failure samples (one for each dir).
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       2);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       2);
 }
 
 // Tests that starting the cleaner then adding a directory works.
@@ -225,12 +211,6 @@
   EXPECT_TRUE(PathExists(dir_2_file_new()));
   EXPECT_TRUE(PathExists(dir_2_file_old()));
   EXPECT_TRUE(PathExists(dir_2_file_other()));
-
-  // There should be 1 success and 0 failure logged for the one dir.
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       1);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       1);
 }
 
 // Tests that starting the cleaner twice doesn't cause it to clean twice.
@@ -247,10 +227,6 @@
   task_environment_.RunUntilIdle();
 
   EXPECT_TRUE(PathExists(dir_1_file_old()));
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       1);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       1);
 }
 
 // Tests that adding a dir twice doesn't cause it to clean twice.
@@ -267,10 +243,6 @@
   task_environment_.RunUntilIdle();
 
   EXPECT_TRUE(PathExists(dir_1_file_old()));
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       1);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       1);
 }
 
 // Tests that AddDirectory called from another thread properly bounces back to
@@ -296,12 +268,6 @@
   EXPECT_TRUE(PathExists(dir_2_file_new()));
   EXPECT_TRUE(PathExists(dir_2_file_old()));
   EXPECT_TRUE(PathExists(dir_2_file_other()));
-
-  // There should be 1 success and 0 failure logged for the one dir.
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       1);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       1);
 }
 
 // Tests that adding a directory while a session is processing a previous
@@ -320,16 +286,9 @@
   EXPECT_TRUE(PathExists(dir_2_file_new()));
   EXPECT_FALSE(PathExists(dir_2_file_old()));
   EXPECT_TRUE(PathExists(dir_2_file_other()));
-
-  // There should be 2 success and 2 failure samples (one for each dir).
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.SuccessCount", 1,
-                                       2);
-  histogram_tester_.ExpectUniqueSample("Windows.TmpFileDeleter.FailCount", 0,
-                                       2);
 }
 
-// Tests that stopping while the background task is running results in at least
-// recording of partial metrics.
+// Tests stopping while the background task is running.
 TEST_F(ImportantFileWriterCleanerTest, StopWhileRunning) {
   ImportantFileWriterCleaner::GetInstance().Initialize();
 
@@ -347,9 +306,6 @@
   // then. Either case is a success.
   StopCleaner();
   task_environment_.RunUntilIdle();
-
-  // Expect a single sample indicating that one or more files were deleted.
-  histogram_tester_.ExpectTotalCount("Windows.TmpFileDeleter.SuccessCount", 1);
 }
 
 }  // namespace base
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
index dd73f43..527e007e2 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
@@ -618,6 +618,9 @@
         }
     }
 
+    // This method clears the data directory for the test apk, but device_utils.py clears the data
+    // for the apk under test via `pm clear`. Fake module smoke tests in particular requires some
+    // data to be kept for the apk under test: /sdcard/Android/data/package/files/local_testing
     private static void clearDataDirectory(Context targetContext) {
         File dataDir = ContextCompat.getDataDir(targetContext);
         File[] files = dataDir.listFiles();
diff --git a/base/vlog.cc b/base/vlog.cc
index 33c80cd..cdc30c3 100644
--- a/base/vlog.cc
+++ b/base/vlog.cc
@@ -5,11 +5,11 @@
 #include "base/vlog.h"
 
 #include <stddef.h>
-#include <algorithm>
-#include <limits>
+
 #include <ostream>
 #include <utility>
 
+#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -24,16 +24,17 @@
 
   explicit VmodulePattern(const std::string& pattern);
 
-  VmodulePattern() = default;
+  VmodulePattern();
 
   std::string pattern;
-  int vlog_level = VlogInfo::kDefaultVlogLevel;
-  MatchTarget match_target = MATCH_MODULE;
-  size_t score = 0;
+  int vlog_level;
+  MatchTarget match_target;
 };
 
 VlogInfo::VmodulePattern::VmodulePattern(const std::string& pattern)
-    : pattern(pattern) {
+    : pattern(pattern),
+      vlog_level(VlogInfo::kDefaultVlogLevel),
+      match_target(MATCH_MODULE) {
   // If the pattern contains a {forward,back} slash, we assume that
   // it's meant to be tested against the entire __FILE__ string.
   std::string::size_type first_slash = pattern.find_first_of("\\/");
@@ -41,6 +42,10 @@
     match_target = MATCH_FILE;
 }
 
+VlogInfo::VmodulePattern::VmodulePattern()
+    : vlog_level(VlogInfo::kDefaultVlogLevel),
+      match_target(MATCH_MODULE) {}
+
 VlogInfo::VlogInfo(const std::string& v_switch,
                    const std::string& vmodule_switch,
                    int* min_log_level)
@@ -81,58 +86,31 @@
 // Given a path, returns the basename with the extension chopped off
 // (and any -inl suffix).  We avoid using FilePath to minimize the
 // number of dependencies the logging system has.
-base::StringPiece GetModule(base::StringPiece file) {
-  base::StringPiece module = file;
-
-  // Chop off the file extension.
-  base::StringPiece::size_type extension_start = module.rfind('.');
-  module = module.substr(0, extension_start);
-
-  // Chop off the -inl suffix.
-  static constexpr base::StringPiece kInlSuffix("-inl");
-  if (base::EndsWith(module, kInlSuffix))
-    module.remove_suffix(kInlSuffix.size());
-
-  // Chop off the path up to the start of the file name. Using single-character
-  // overload of `base::StringPiece::find_last_of` for speed; this overload does
-  // not build a lookup table.
-  base::StringPiece::size_type last_slash_pos = module.find_last_of('/');
-  if (last_slash_pos != base::StringPiece::npos) {
-    module.remove_prefix(last_slash_pos + 1);
-    return module;
-  }
-  last_slash_pos = module.find_last_of('\\');
+base::StringPiece GetModule(const base::StringPiece& file) {
+  base::StringPiece module(file);
+  base::StringPiece::size_type last_slash_pos =
+      module.find_last_of("\\/");
   if (last_slash_pos != base::StringPiece::npos)
     module.remove_prefix(last_slash_pos + 1);
+  base::StringPiece::size_type extension_start = module.rfind('.');
+  module = module.substr(0, extension_start);
+  static const char kInlSuffix[] = "-inl";
+  static const int kInlSuffixLen = base::size(kInlSuffix) - 1;
+  if (base::EndsWith(module, kInlSuffix))
+    module.remove_suffix(kInlSuffixLen);
   return module;
 }
 
 }  // namespace
 
-int VlogInfo::GetVlogLevel(base::StringPiece file) {
+int VlogInfo::GetVlogLevel(const base::StringPiece& file) const {
   if (!vmodule_levels_.empty()) {
     base::StringPiece module(GetModule(file));
-    for (size_t i = 0; i < vmodule_levels_.size(); i++) {
-      VmodulePattern& it = vmodule_levels_[i];
-
-      const bool kUseFile = it.match_target == VmodulePattern::MATCH_FILE;
-      if (!MatchVlogPattern(kUseFile ? file : module, it.pattern)) {
-        continue;
-      }
-      const int ret = it.vlog_level;
-
-      // Since `it` matched, increase its score because we believe it has a
-      // higher probability of winning next time.
-      if (it.score == std::numeric_limits<size_t>::max()) {
-        for (VmodulePattern& pattern : vmodule_levels_) {
-          pattern.score = 0;
-        }
-      }
-      ++it.score;
-      if (i > 0 && it.score > vmodule_levels_[i - 1].score)
-        std::swap(it, vmodule_levels_[i - 1]);
-
-      return ret;
+    for (const auto& it : vmodule_levels_) {
+      base::StringPiece target(
+          (it.match_target == VmodulePattern::MATCH_FILE) ? file : module);
+      if (MatchVlogPattern(target, it.pattern))
+        return it.vlog_level;
     }
   }
   return GetMaxVlogLevel();
@@ -147,20 +125,23 @@
   return -*min_log_level_;
 }
 
-bool MatchVlogPattern(base::StringPiece string,
-                      base::StringPiece vlog_pattern) {
+bool MatchVlogPattern(const base::StringPiece& string,
+                      const base::StringPiece& vlog_pattern) {
+  base::StringPiece pat(vlog_pattern);
+  base::StringPiece str(string);
+
   // The code implements the glob matching using a greedy approach described in
   // https://research.swtch.com/glob.
   size_t s = 0, nexts = 0;
   size_t p = 0, nextp = 0;
-  const size_t slen = string.size(), plen = vlog_pattern.size();
+  size_t slen = str.size(), plen = pat.size();
   while (s < slen || p < plen) {
     if (p < plen) {
-      switch (vlog_pattern[p]) {
+      switch (pat[p]) {
         // A slash (forward or back) must match a slash (forward or back).
         case '/':
         case '\\':
-          if (s < slen && (string[s] == '/' || string[s] == '\\')) {
+          if (s < slen && (str[s] == '/' || str[s] == '\\')) {
             p++, s++;
             continue;
           }
@@ -179,7 +160,7 @@
           continue;
         // Anything else must match literally.
         default:
-          if (s < slen && string[s] == vlog_pattern[p]) {
+          if (s < slen && str[s] == pat[p]) {
             p++, s++;
             continue;
           }
diff --git a/base/vlog.h b/base/vlog.h
index 67b6d25..201daab 100644
--- a/base/vlog.h
+++ b/base/vlog.h
@@ -45,7 +45,7 @@
 
   // Returns the vlog level for a given file (usually taken from
   // __FILE__).
-  int GetVlogLevel(base::StringPiece file);
+  int GetVlogLevel(const base::StringPiece& file) const;
 
  private:
   void SetMaxVlogLevel(int level);
@@ -68,8 +68,8 @@
 //   "kh*n" matches "khn", "khan", or even "khaaaaan"
 //   "/foo\bar" matches "/foo/bar", "\foo\bar", or "/foo\bar"
 //     (disregarding C escaping rules)
-BASE_EXPORT bool MatchVlogPattern(base::StringPiece string,
-                                  base::StringPiece vlog_pattern);
+BASE_EXPORT bool MatchVlogPattern(const base::StringPiece& string,
+                                  const base::StringPiece& vlog_pattern);
 
 }  // namespace logging
 
diff --git a/base/vlog_perftest.cc b/base/vlog_perftest.cc
deleted file mode 100644
index edabe1c..0000000
--- a/base/vlog_perftest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 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/vlog.h"
-
-#include "base/logging.h"
-#include "base/numerics/checked_math.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_result_reporter.h"
-
-namespace logging {
-
-TEST(VlogPerfTest, GetVlogLevel) {
-  const std::string kMetricThroughput = "throughput";
-  perf_test::PerfResultReporter reporter(/*metric_basename=*/"Vlog",
-                                         /*story_name=*/"GetVlogLevel");
-  reporter.RegisterImportantMetric(/*metric_suffix=*/kMetricThroughput,
-                                   /*units=*/"gets/microsecond");
-
-  const base::TimeTicks job_run_start(base::TimeTicks::Now());
-
-  const char kVModuleSwitch[] =
-      "foo/bar.cc=1,baz\\*\\qux.cc=2,*quux/*=3,*/*-inl.h=4";
-
-  constexpr size_t kNumFilenames = 3;
-  const char* const kFileNames[kNumFilenames] = {"baz/x/qux.cc", "foo/bar",
-                                                 "x/y-inl.h"};
-  int min_log_level = 0;
-  VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
-
-  constexpr size_t kNumSets = 1 << 21;
-  constexpr size_t kNumReps = 3;
-
-  for (size_t set = 0; set < kNumSets; set++) {
-    const char* kFileName = kFileNames[set % kNumFilenames];
-    for (size_t rep = 0; rep < kNumReps; rep++) {
-      int res = vlog_info.GetVlogLevel(kFileName);
-      ASSERT_GE(res, min_log_level);
-      ASSERT_LE(res, 4);
-    }
-  }
-
-  const base::TimeDelta kDuration = base::TimeTicks::Now() - job_run_start;
-  const int64_t kDurationUs = kDuration.InMicroseconds();
-  ASSERT_NE(kDurationUs, 0) << "Too fast, would divide by zero.";
-
-  base::CheckedNumeric<size_t> gets_per_us_checked = kNumSets;
-  gets_per_us_checked *= kNumReps;
-  gets_per_us_checked /= kDurationUs;
-
-  const size_t kGetsPerUs = gets_per_us_checked.ValueOrDie();
-  reporter.AddResult(kMetricThroughput, kGetsPerUs);
-}
-}  // namespace logging
diff --git a/build/android/gyp/create_app_bundle_apks.py b/build/android/gyp/create_app_bundle_apks.py
index 5950696b..059b4dd8 100755
--- a/build/android/gyp/create_app_bundle_apks.py
+++ b/build/android/gyp/create_app_bundle_apks.py
@@ -32,18 +32,21 @@
       '--minimal',
       action='store_true',
       help='Create APKs archive with minimal language support.')
+  parser.add_argument('--local-testing',
+                      action='store_true',
+                      help='Create APKs archive with local testing support.')
 
   args = parser.parse_args()
 
-  app_bundle_utils.GenerateBundleApks(
-      args.bundle,
-      args.output,
-      args.aapt2_path,
-      args.keystore_path,
-      args.keystore_password,
-      args.keystore_name,
-      minimal=args.minimal,
-      check_for_noop=False)
+  app_bundle_utils.GenerateBundleApks(args.bundle,
+                                      args.output,
+                                      args.aapt2_path,
+                                      args.keystore_path,
+                                      args.keystore_password,
+                                      args.keystore_name,
+                                      local_testing=args.local_testing,
+                                      minimal=args.minimal,
+                                      check_for_noop=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/pylib/utils/app_bundle_utils.py b/build/android/pylib/utils/app_bundle_utils.py
index b2e9927..986e126 100644
--- a/build/android/pylib/utils/app_bundle_utils.py
+++ b/build/android/pylib/utils/app_bundle_utils.py
@@ -49,6 +49,7 @@
                        keystore_password,
                        keystore_alias,
                        mode=None,
+                       local_testing=False,
                        minimal=False,
                        minimal_sdk_version=None,
                        check_for_noop=True,
@@ -109,6 +110,9 @@
           '--overwrite',
       ]
 
+      if local_testing:
+        cmd_args += ['--local-testing']
+
       if mode is not None:
         if mode not in BUILD_APKS_MODES:
           raise Exception('Invalid mode parameter %s (should be in %s)' %
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 047439ef..1099c49f 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -5089,6 +5089,9 @@
         "--keystore-password",
         android_keystore_password,
       ]
+      if (debuggable_apks) {
+        args += [ "--local-testing" ]
+      }
       deps = [ ":$_bundle_target_name" ]
       metadata = {
         install_artifacts = [ _apks_path ]
diff --git a/build/config/dcheck_always_on.gni b/build/config/dcheck_always_on.gni
index a868076..0e8443f 100644
--- a/build/config/dcheck_always_on.gni
+++ b/build/config/dcheck_always_on.gni
@@ -25,12 +25,8 @@
   # please prefer excluding OSes rather than reverting . I.e. if Mac builds
   # break badly but other platforms are reasonably stable, add "&& !is_mac"
   # instead of reverting.
-  # TODO(crbug.com/1225701): Once this sticks, try to expand this to all
-  # platforms (incl. Fuchsia + any OS added here during rollout) and reduce it
-  # down to:
-  # (build_with_chromium && !is_official_builds) || dcheck_is_configurable
-  dcheck_always_on = (build_with_chromium && !is_official_build &&
-                      !is_fuchsia) || dcheck_is_configurable
+  dcheck_always_on =
+      (build_with_chromium && !is_official_build) || dcheck_is_configurable
 }
 
 declare_args() {
diff --git a/build/config/linux/BUILD.gn b/build/config/linux/BUILD.gn
index 2e649ee..08471742 100644
--- a/build/config/linux/BUILD.gn
+++ b/build/config/linux/BUILD.gn
@@ -18,8 +18,10 @@
   if (current_cpu == "arm64") {
     import("//build/config/arm.gni")
     cflags = []
+    asmflags = []
     if (arm_control_flow_integrity == "standard") {
-      cflags = [ "-mbranch-protection=standard" ]
+      cflags += [ "-mbranch-protection=standard" ]
+      asmflags += [ "-mbranch-protection=standard" ]
     } else {
       assert(arm_control_flow_integrity == "none",
              "Invalid branch protection option")
diff --git a/build/util/lib/results/result_sink.py b/build/util/lib/results/result_sink.py
index 4fe3c59..c151660b 100644
--- a/build/util/lib/results/result_sink.py
+++ b/build/util/lib/results/result_sink.py
@@ -117,8 +117,9 @@
     if artifacts:
       tr['artifacts'] = artifacts
     if failure_reason:
-      tr['failureReason']['primaryErrorMessage'] = _TruncateToUTF8Bytes(
-          failure_reason, 1024)
+      tr['failureReason'] = {
+          'primaryErrorMessage': _TruncateToUTF8Bytes(failure_reason, 1024)
+      }
 
     if duration is not None:
       # Duration must be formatted to avoid scientific notation in case
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index d99684a..5dc8fea 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -561,6 +561,7 @@
     "//third_party/android_data_chart:android_data_chart_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:chromium_play_services_availability_java",
+    "//third_party/android_deps:com_google_android_play_core_java",
     "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
     "//third_party/android_deps:com_google_guava_listenablefuture_java",
     "//third_party/android_deps:dagger_java",
@@ -591,7 +592,6 @@
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
     "//third_party/blink/public/mojom:mojom_platform_java",
     "//third_party/gif_player:gif_player_java",
-    "//third_party/google_android_play_core:com_google_android_play_core_java",
     "//third_party/metrics_proto:metrics_proto_java",
     "//ui/android:ui_java",
     "//ui/base/mojom:mojom_java",
@@ -2446,10 +2446,10 @@
     "//components/media_router/browser/android:cast_options_provider_java",
     "//components/minidump_uploader:minidump_uploader_java",
     "//components/module_installer/android:module_installer_java",
+    "//third_party/android_deps:com_google_android_play_core_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_collection_collection_java",
     "//third_party/androidx:androidx_fragment_fragment_java",
-    "//third_party/google_android_play_core:com_google_android_play_core_java",
     "//ui/android:ui_no_recycler_view_java",
 
     # Deps needed for child processes.
@@ -3098,6 +3098,13 @@
 _bundle_fake_modules_smoke_test_extra_args = [
   # These are in addition to the ones listed in _bundle_smoke_test_extra_args.
   "--fake-feature-module-install",
+
+  # The fake modules' apks are stored in the apk_under_test's data directory.
+  # This flag tells test_runner.py to skip the "pm clear" step so that the apk
+  # files (along with other app data) are not removed before tests are run.
+  # Other data files for the test_apk are still cleared between tests by
+  # BaseChromiumAndroidJUnitRunner.clearDataDirectory().
+  "--skip-clear-data",
 ]
 
 instrumentation_test_runner(
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
index 63f167d..1cd7760 100644
--- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -94,7 +94,6 @@
         android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:enabled="false"
         android:exported="false"
-        android:process=":playcore_dialog_wrapper_activity"
         android:stateNotNeeded="true"
         android:theme="@style/Theme.PlayCore.Transparent">
     </activity>  # DIFF-ANCHOR: a2bae37c
diff --git a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
index d8cb0cf..0a14103 100644
--- a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
@@ -732,6 +732,9 @@
     @com.google.vr.dynamite.client.UsedByReflection *;
 }
 
+# File: obj/third_party/android_deps/com_google_android_play_core_java/proguard.txt
+-keepnames class com.google.android.play.core.review.ReviewInfo
+
 # File: obj/third_party/android_deps/google_android_datatransport_transport_api_java/proguard.txt
 -dontwarn com.google.auto.value.AutoValue
 -dontwarn com.google.auto.value.AutoValue$Builder
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
index 5d85d91..8d7320f 100644
--- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -94,7 +94,6 @@
         android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:enabled="false"
         android:exported="false"
-        android:process=":playcore_dialog_wrapper_activity"
         android:stateNotNeeded="true"
         android:theme="@style/Theme.PlayCore.Transparent">
     </activity>  # DIFF-ANCHOR: a2bae37c
diff --git a/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_ble_enable.xml b/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_ble_enable.xml
index 355820ff..ff3ac6f7 100644
--- a/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_ble_enable.xml
+++ b/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_ble_enable.xml
@@ -41,6 +41,7 @@
 
   <TextView
       a:layout_width="wrap_content"
+      a:id="@+id/cablev2_ble_enable_body"
       a:layout_height="wrap_content"
       a:layout_marginTop="4dp"
       a:layout_gravity="center_horizontal"
diff --git a/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_ble_enable.xml b/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_ble_enable.xml
index 51a393d..9d76ccd 100644
--- a/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_ble_enable.xml
+++ b/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_ble_enable.xml
@@ -38,6 +38,7 @@
 
   <TextView
       style="@style/TextAppearance.TextMedium.Secondary"
+      a:id="@+id/cablev2_ble_enable_body"
       a:layout_marginTop="4dp"
       a:layout_marginLeft="40dp"
       a:layout_marginRight="40dp"
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
index 8e9802a..49d6ab6 100644
--- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
+++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
@@ -37,6 +37,7 @@
 import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialUserEntity;
 import com.google.android.gms.tasks.Task;
 
+import org.chromium.base.BuildInfo;
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
@@ -79,6 +80,9 @@
     // mFCMEvent contains the serialized event data that was stored in the notification's
     // PendingIntent.
     private final byte[] mFCMEvent;
+    // mServerLinkData contains the information passed from GMS Core in the event that
+    // this is a SERVER_LINK connection.
+    private final byte[] mServerLinkData;
 
     // mHandle is the opaque ID returned by the native code to ensure that
     // |stop| doesn't apply to a transaction that this instance didn't create.
@@ -105,6 +109,7 @@
         mContext = context;
         mUi = ui;
         mFCMEvent = fcmEvent;
+        mServerLinkData = serverLink;
 
         // networkContext can only be used from the UI thread, therefore all
         // short-lived work is done on that thread.
@@ -119,11 +124,7 @@
                     this, new USBHandler(context, mTaskRunner, accessory));
         }
 
-        if (serverLink != null) {
-            mHandle = CableAuthenticatorJni.get().startServerLink(this, serverLink);
-        }
-
-        // Otherwise wait for |onQRCode| or |onBluetoothReadyForCloudMessage|.
+        // Otherwise wait for |onQRCode| or |onBluetoothReady|.
     }
 
     // Calls from native code.
@@ -450,10 +451,14 @@
      *
      * @param needToDisable true if BLE needs to be disabled afterwards
      */
-    void onBluetoothReadyForCloudMessage(boolean needToDisable) {
+    void onBluetoothReady(boolean needToDisable) {
         assert mTaskRunner.belongsToCurrentThread();
         sOwnBluetooth |= needToDisable;
-        mHandle = CableAuthenticatorJni.get().startCloudMessage(this, mFCMEvent);
+        if (mServerLinkData != null) {
+            mHandle = CableAuthenticatorJni.get().startServerLink(this, mServerLinkData);
+        } else {
+            mHandle = CableAuthenticatorJni.get().startCloudMessage(this, mFCMEvent);
+        }
     }
 
     void unlinkAllDevices() {
@@ -471,9 +476,15 @@
         sInstanceCount--;
         if (sOwnBluetooth) {
             if (sInstanceCount == 0) {
-                Log.i(TAG, "disabling Bluetooth");
-                BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-                adapter.disable();
+                if (BuildInfo.isAtLeastS()) {
+                    // It's not possible to disable Bluetooth on Android 12 without another
+                    // permission prompt.
+                    Log.i(TAG, "not trying to disable Bluetooth on Android 12");
+                } else {
+                    Log.i(TAG, "disabling Bluetooth");
+                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+                    adapter.disable();
+                }
 
                 sOwnBluetooth = false;
             } else {
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java
index f0ca13df..6107031 100644
--- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java
+++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java
@@ -34,6 +34,7 @@
 import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 
+import org.chromium.base.BuildInfo;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.PostTask;
@@ -83,15 +84,32 @@
     private static final int ERROR_NONE = 0;
     private static final int ERROR_UNEXPECTED_EOF = 100;
     private static final int ERROR_NO_SCREENLOCK = 110;
+    private static final int ERROR_NO_BLUETOOTH_PERMISSION = 111;
 
     private enum Mode {
         QR, // Triggered from Settings; can scan QR code to start handshake.
         FCM, // Triggered by user selecting notification; handshake already running.
         USB, // Triggered by connecting via USB.
         SERVER_LINK, // Triggered by GMSCore forwarding from GAIA.
-        ERROR, // An invalid request. Error in |mErrorCode|.
     }
     private Mode mMode;
+
+    // Save for ERROR, states always move from one to the next. There are no
+    // cycles. Different modes start in different states, e.g. only QR mode
+    // starts with SETTINGS_UI.
+    private enum State {
+        SETTINGS_UI,
+        CAMERA_PERMISSION,
+        QR_SCANNING,
+        ENABLE_BLUETOOTH,
+        ENABLE_BLUETOOTH_REQUESTED,
+        BLUETOOTH_PERMISSION,
+        BLUETOOTH_PERMISSION_REQUESTED,
+        RUNNING,
+        ERROR,
+    }
+    private State mState;
+
     private AndroidPermissionDelegate mPermissionDelegate;
     private CableAuthenticator mAuthenticator;
     private LinearLayout mQRButton;
@@ -103,7 +121,7 @@
     private View mSpinnerView;
 
     // mErrorCode contains a value of the authenticator::Platform::Error
-    // enumeration when |mMode| is |ERROR|.
+    // enumeration when |mState| is |ERROR|.
     private int mErrorCode;
 
     // The following two members store a pending QR-scan result while Bluetooth
@@ -111,10 +129,13 @@
     private String mPendingQRCode;
     private boolean mPendingShouldLink;
 
-    // mNeedToSignalBluetoothReady is true if a cloud message is pending
-    // Bluetooth enabling and this class should prompt the user to enable
-    // Bluetooth once the UI is showing.
-    private boolean mNeedToSignalBluetoothReady;
+    // This is true if we enabled Bluetooth and thus need to disable it once
+    // complete. This is only set while a Bluetooth permission prompt is
+    // outstanding, otherwise the value is passed around as a parameter.
+    // (A permission prompt is only shown on Android >=12, and on Android >=12
+    // it's not possible to disable Bluetooth. But we continue to accurately
+    // track this boolean in case that changes.)
+    private boolean mNeedToDisableBluetooth;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -134,13 +155,13 @@
         } else if (arguments.getBoolean(FCM_EXTRA)) {
             mMode = Mode.FCM;
         } else if (serverLink != null) {
-            mMode = Mode.SERVER_LINK;
-
             mErrorCode = CableAuthenticator.validateServerLinkData(serverLink);
             if (mErrorCode != ERROR_NONE) {
-                mMode = Mode.ERROR;
+                mState = State.ERROR;
                 return;
             }
+
+            mMode = Mode.SERVER_LINK;
         } else {
             mMode = Mode.QR;
         }
@@ -151,16 +172,17 @@
         // via Sync, but it's possible for a request to come in soon after a
         // screen lock was removed.
         if (mMode != Mode.SERVER_LINK && !hasScreenLockConfigured(context)) {
-            mMode = Mode.ERROR;
+            mState = State.ERROR;
             mErrorCode = ERROR_NO_SCREENLOCK;
         }
 
-        Log.i(TAG, "Starting in mode " + mMode.toString());
-
-        if (mMode == Mode.ERROR) {
+        if (mState == State.ERROR) {
+            Log.i(TAG, "Preconditions failed");
             return;
         }
 
+        Log.i(TAG, "Starting in mode " + mMode.toString());
+
         final long networkContext = arguments.getLong(NETWORK_CONTEXT_EXTRA);
         final long registration = arguments.getLong(REGISTRATION_EXTRA);
         final byte[] secret = arguments.getByteArray(SECRET_EXTRA);
@@ -170,13 +192,32 @@
         mAuthenticator = new CableAuthenticator(getContext(), this, networkContext, registration,
                 secret, mMode == Mode.FCM, accessory, serverLink, fcmEvent);
 
-        if (mMode == Mode.FCM) {
-            BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-            if (adapter.isEnabled()) {
-                mAuthenticator.onBluetoothReadyForCloudMessage(/*needToDisable=*/false);
-            } else {
-                mNeedToSignalBluetoothReady = true;
-            }
+        switch (mMode) {
+            case USB:
+                // USB mode doesn't require Bluetooth.
+                mState = State.RUNNING;
+                break;
+
+            case FCM:
+                BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+                if (!adapter.isEnabled()) {
+                    // A screen for enabling Bluetooth will be shown and
+                    // onResume will trigger the permission request.
+                    mState = State.ENABLE_BLUETOOTH;
+                    return;
+                }
+                mState = State.BLUETOOTH_PERMISSION;
+                break;
+
+            case SERVER_LINK:
+                // GMS Core should have taken care of enabling Bluetooth.
+                mState = State.BLUETOOTH_PERMISSION;
+                break;
+
+            case QR:
+                // QR mode displays a UI first.
+                mState = State.SETTINGS_UI;
+                break;
         }
     }
 
@@ -220,9 +261,17 @@
 
         View v = null;
 
-        if (mNeedToSignalBluetoothReady) {
+        if (mState == State.ENABLE_BLUETOOTH) {
             v = inflater.inflate(R.layout.cablev2_ble_enable, container, false);
+            if (BuildInfo.isAtLeastS()) {
+                // Don't claim that Bluetooth will be switched off afterwards on Android 12 and
+                // later because disabling Bluetooth requires an extra permission prompt.
+                ((TextView) v.findViewById(R.id.cablev2_ble_enable_body)).setText("");
+            }
             mSpinnerView = createSpinnerScreen(inflater, container);
+        } else if (mState == State.ERROR) {
+            fillOutErrorUI(mErrorCode);
+            v = mErrorView;
         } else {
             switch (mMode) {
                 case USB:
@@ -250,11 +299,6 @@
                     mUnlinkButton = v.findViewById(R.id.unlink);
                     mUnlinkButton.setOnClickListener(this);
                     break;
-
-                case ERROR:
-                    fillOutErrorUI(mErrorCode);
-                    v = mErrorView;
-                    break;
             }
         }
 
@@ -265,17 +309,71 @@
     @Override
     public void onResume() {
         super.onResume();
-        if (!mNeedToSignalBluetoothReady) {
+
+        if (mState == State.ENABLE_BLUETOOTH) {
+            mState = State.ENABLE_BLUETOOTH_REQUESTED;
+            PostTask.postDelayedTask(UiThreadTaskTraits.DEFAULT, () -> {
+                if (mAuthenticator != null) {
+                    startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),
+                            ENABLE_BLUETOOTH_REQUEST_CODE);
+                }
+            }, BLE_SCREEN_DELAY_SECS * 1000);
+        } else if (mState == State.BLUETOOTH_PERMISSION) {
+            onBluetoothEnabled(/*needToDisableBluetooth=*/false);
+        }
+    }
+
+    // Called when the Bluetooth adapter has been enabled, or was already enabled.
+    private void onBluetoothEnabled(boolean needToDisableBluetooth) {
+        // In Android 12 and above there is a new BLUETOOTH_ADVERTISE runtime permission.
+        if (BuildInfo.isAtLeastS()) {
+            maybeGetBluetoothPermission(needToDisableBluetooth);
             return;
         }
 
-        mNeedToSignalBluetoothReady = false;
-        PostTask.postDelayedTask(UiThreadTaskTraits.DEFAULT, () -> {
-            if (mAuthenticator != null) {
-                startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),
-                        ENABLE_BLUETOOTH_REQUEST_CODE);
-            }
-        }, BLE_SCREEN_DELAY_SECS * 1000);
+        onHaveBluetoothPermission(needToDisableBluetooth);
+    }
+
+    // Called on Android 12 or later after the Bluetooth adaptor is enabled.
+    @TargetApi(31)
+    private void maybeGetBluetoothPermission(boolean needToDisableBluetooth) {
+        mState = State.BLUETOOTH_PERMISSION;
+        final String advertise = permission.BLUETOOTH_ADVERTISE;
+
+        if (getContext().checkSelfPermission(advertise) == PackageManager.PERMISSION_GRANTED) {
+            onHaveBluetoothPermission(needToDisableBluetooth);
+            return;
+        }
+
+        if (shouldShowRequestPermissionRationale(advertise)) {
+            // Since the user took explicit action to make a connection to their
+            // computer, and there's a big "Connecting to your computer" in the
+            // background, the rationale should be clear. However, this
+            // function must always be called otherwise the permission will be
+            // automatically refused.
+        }
+
+        // The |Fragment| method |requestPermissions| is called rather than
+        // the method on |mPermissionDelegate| because the latter routes the
+        // |onRequestPermissionsResult| callback to the Activity, and not
+        // this fragment.
+        mState = State.BLUETOOTH_PERMISSION_REQUESTED;
+        mNeedToDisableBluetooth = needToDisableBluetooth;
+        requestPermissions(new String[] {advertise}, 1);
+    }
+
+    // Called once the BLUETOOTH_ADVERTISE permission has been granted, or if
+    // its not needed on this version of Android.
+    private void onHaveBluetoothPermission(boolean needToDisableBluetooth) {
+        mState = State.RUNNING;
+
+        if (mMode == Mode.QR) {
+            final String qrCode = mPendingQRCode;
+            mPendingQRCode = null;
+            mAuthenticator.onQRCode(qrCode, mPendingShouldLink);
+        } else {
+            mAuthenticator.onBluetoothReady(needToDisableBluetooth);
+        }
     }
 
     /**
@@ -325,6 +423,7 @@
         // dialog.
         final Context context = getContext();
         if (mPermissionDelegate.hasPermission(permission.CAMERA)) {
+            mState = State.QR_SCANNING;
             (new QRScanDialog(this)).show(getFragmentManager(), "dialog");
             return;
         }
@@ -335,6 +434,7 @@
             // the method on |mPermissionDelegate| because the latter routes the
             // |onRequestPermissionsResult| callback to the Activity, and not
             // this fragment.
+            mState = State.CAMERA_PERMISSION;
             requestPermissions(new String[] {permission.CAMERA}, 1);
         } else {
             // TODO: permission cannot be requested on older versions of
@@ -350,14 +450,17 @@
     @Override
     @SuppressLint("SetTextI18n")
     public void onQRCode(String value, boolean link) {
+        assert mState == State.QR_SCANNING;
         setHeader(R.style.step1);
 
+        mPendingQRCode = value;
+        mPendingShouldLink = link;
+
         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
         if (adapter.isEnabled()) {
-            mAuthenticator.onQRCode(value, link);
+            onBluetoothEnabled(/*needToDisableBluetooth=*/false);
         } else {
-            mPendingQRCode = value;
-            mPendingShouldLink = link;
+            mState = State.ENABLE_BLUETOOTH_REQUESTED;
             startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),
                     ENABLE_BLUETOOTH_REQUEST_CODE);
         }
@@ -400,10 +503,6 @@
             case USB:
                 // In USB mode everything should happen immediately.
                 break;
-
-            case ERROR:
-                // There shouldn't be any status updates in an error condition.
-                assert false;
         }
     }
 
@@ -414,8 +513,45 @@
     @Override
     public void onRequestPermissionsResult(
             int requestCode, String[] permissions, int[] grantResults) {
-        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-            (new QRScanDialog(this)).show(getFragmentManager(), "dialog");
+        final boolean granted =
+                grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
+
+        switch (mState) {
+            case CAMERA_PERMISSION:
+                if (granted) {
+                    assert permissions[0].equals(permission.CAMERA);
+                    mState = State.QR_SCANNING;
+                    (new QRScanDialog(this)).show(getFragmentManager(), "dialog");
+                } else {
+                    mState = State.SETTINGS_UI;
+                }
+                break;
+
+            case BLUETOOTH_PERMISSION_REQUESTED:
+                final boolean needToDisable = mNeedToDisableBluetooth;
+                mNeedToDisableBluetooth = false;
+
+                if (granted) {
+                    assert permissions[0].equals(permission.BLUETOOTH_ADVERTISE);
+                    onHaveBluetoothPermission(needToDisable);
+                } else {
+                    mState = State.ERROR;
+
+                    // If would be nice to disable Bluetooth here if we switched
+                    // it on previously, but Android 12 requires more
+                    // permissions to do that.
+
+                    // TODO(agl): do a better UI once we're out of strings freeze.
+                    mErrorCode = ERROR_NO_BLUETOOTH_PERMISSION;
+                    fillOutErrorUI(mErrorCode);
+                    ViewGroup top = (ViewGroup) getView();
+                    top.removeAllViews();
+                    top.addView(mErrorView);
+                }
+                break;
+
+            default:
+                assert false;
         }
     }
 
@@ -452,9 +588,7 @@
 
         switch (mMode) {
             case QR:
-                String qrCode = mPendingQRCode;
-                mPendingQRCode = null;
-                mAuthenticator.onQRCode(qrCode, mPendingShouldLink);
+                onBluetoothEnabled(/*needToDisableBluetooth=*/true);
                 break;
 
             case FCM:
@@ -462,7 +596,7 @@
                 top.removeAllViews();
                 top.addView(mSpinnerView);
 
-                mAuthenticator.onBluetoothReadyForCloudMessage(/*needToDisable=*/true);
+                onBluetoothEnabled(/*needToDisableBluetooth=*/true);
                 break;
 
             default:
diff --git a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
index 4f3a773..acb5b80 100644
--- a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
+++ b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
@@ -331,6 +331,7 @@
         case Error::SERVER_LINK_WRONG_LENGTH:
         case Error::SERVER_LINK_NOT_ON_CURVE:
         case Error::NO_SCREENLOCK:
+        case Error::NO_BLUETOOTH_PERMISSION:
           result = CableV2MobileResult::kInternalError;
           break;
       }
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index 5231bb6c..7737895 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -45,7 +45,6 @@
     "java/res/drawable/price_card_scrim.xml",
     "java/res/drawable/selected_tab_background.xml",
     "java/res/drawable/selected_tab_background_incognito.xml",
-    "java/res/drawable/single_tab_background.xml",
     "java/res/drawable/tab_grid_card_background.xml",
     "java/res/drawable/tab_grid_dialog_background.xml",
     "java/res/drawable/tab_grid_selection_list_icon.xml",
diff --git a/chrome/android/features/tab_ui/java/res/drawable/single_tab_background.xml b/chrome/android/features/tab_ui/java/res/drawable/single_tab_background.xml
deleted file mode 100644
index d0c7e02..0000000
--- a/chrome/android/features/tab_ui/java/res/drawable/single_tab_background.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <stroke
-        android:width="1dp"
-        android:color="@color/default_chip_outline_color" />
-    <corners android:radius="8dp" />
-</shape>
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/res/layout/single_tab_view_layout.xml b/chrome/android/features/tab_ui/java/res/layout/single_tab_view_layout.xml
index a492e1e..e7cbda5 100644
--- a/chrome/android/features/tab_ui/java/res/layout/single_tab_view_layout.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/single_tab_view_layout.xml
@@ -13,7 +13,7 @@
     android:layout_marginStart="14dp"
     android:layout_marginEnd="14dp"
     android:layout_marginTop="4dp"
-    android:background="@drawable/single_tab_background"
+    android:background="@drawable/card_with_corners_background"
     android:orientation="horizontal">
 
     <ImageView
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/SingleTabView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/SingleTabView.java
index fb5fae19..08e922e5 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/SingleTabView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/SingleTabView.java
@@ -6,12 +6,14 @@
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
 import android.util.AttributeSet;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import org.chromium.chrome.tab_ui.R;
+import org.chromium.components.browser_ui.styles.ChromeColors;
 
 /** View of the tab on the single tab tab switcher. */
 class SingleTabView extends LinearLayout {
@@ -23,6 +25,7 @@
     public SingleTabView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
+        setBackgroundColor();
     }
 
     @Override
@@ -48,4 +51,11 @@
     public void setTitle(String title) {
         mTitle.setText(title);
     }
+
+    /** Set the background color of the view. */
+    private void setBackgroundColor() {
+        GradientDrawable gradientDrawable = (GradientDrawable) getBackground();
+        gradientDrawable.setColor(
+                ChromeColors.getSurfaceColor(getContext(), R.dimen.card_elevation));
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
index f3d3a3a0..aebd3fa4 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Преместете с плъзгане разделите, за да ги групирате</translation>
 <translation id="5846292395804797011">Затваряне на групата с раздели „<ph name="TITLE_OF_GROUP" />“ с(ъс) <ph name="NUMBER_OF_TABS" /> раздела.</translation>
 <translation id="6040143037577758943">Затваряне</translation>
+<translation id="6054741997831917303">Цената на този артикул наскоро бе намалена от <ph name="PREVIOUS_PRICE" /> на <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Избиране на раздели</translation>
 <translation id="6510648526783655549">Затваряне на лентата с раздели</translation>
 <translation id="6562820390860419811">Преместване на раздела наляво</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
index 9e7278f..3b752d7 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Prevucite kartice da ih grupišete</translation>
 <translation id="5846292395804797011">Zatvaranje grupe kartica <ph name="TITLE_OF_GROUP" /> sa sljedećim brojem kartica: <ph name="NUMBER_OF_TABS" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
+<translation id="6054741997831917303">Cijena ovog artikla bila je <ph name="PREVIOUS_PRICE" />, a sada iznosi <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Odaberite kartice</translation>
 <translation id="6510648526783655549">Zatvaranje trake kartice</translation>
 <translation id="6562820390860419811">Pomjeranje kartice ulijevo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
index 963660d..a6fa1c1 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Arrossega les pestanyes per agrupar-les</translation>
 <translation id="5846292395804797011">Tanca el grup <ph name="TITLE_OF_GROUP" /> format per <ph name="NUMBER_OF_TABS" /> pestanyes</translation>
 <translation id="6040143037577758943">Tanca</translation>
+<translation id="6054741997831917303">El preu d'aquest article fa poc ha baixat de <ph name="PREVIOUS_PRICE" /> a <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Selecciona pestanyes</translation>
 <translation id="6510648526783655549">Tanca la barra de pestanyes</translation>
 <translation id="6562820390860419811">Mou la pestanya cap a l'esquerra</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
index 03a090f..e98fe84c 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Drag tabs to group them</translation>
 <translation id="5846292395804797011">Close <ph name="TITLE_OF_GROUP" /> group with <ph name="NUMBER_OF_TABS" /> tabs</translation>
 <translation id="6040143037577758943">Close</translation>
+<translation id="6054741997831917303">The price of this item recently dropped from <ph name="PREVIOUS_PRICE" /> to <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Select tabs</translation>
 <translation id="6510648526783655549">Close tab strip</translation>
 <translation id="6562820390860419811">Move tab left</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
index e6b8b296..7e01d24 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Lohistage vahelehti, et neid grupeerida</translation>
 <translation id="5846292395804797011">Sule <ph name="NUMBER_OF_TABS" /> vahelehega grupp <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="6040143037577758943">Sulge</translation>
+<translation id="6054741997831917303">Selle üksuse hind <ph name="PREVIOUS_PRICE" /> langes hiljuti ja uus hind on <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Valige vahelehed</translation>
 <translation id="6510648526783655549">Sule vahelehtede riba</translation>
 <translation id="6562820390860419811">Teisalda vaheleht vasakule</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
index 03db93c..0187c8cd 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Povucite kartice da biste ih grupirali</translation>
 <translation id="5846292395804797011">Zatvori grupu <ph name="TITLE_OF_GROUP" /> koja sadrži sljedeći broj kartica: <ph name="NUMBER_OF_TABS" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
+<translation id="6054741997831917303">Cijena ovog artikla bila je <ph name="PREVIOUS_PRICE" />, a sada iznosi <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Odaberite kartice</translation>
 <translation id="6510648526783655549">Zatvorite vrpcu kartica</translation>
 <translation id="6562820390860419811">Pomakni karticu ulijevo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
index 701fa3c..1e55cad 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Sleep de tabbladen om ze te groeperen</translation>
 <translation id="5846292395804797011">De groep <ph name="TITLE_OF_GROUP" /> met <ph name="NUMBER_OF_TABS" /> tabbladen sluiten</translation>
 <translation id="6040143037577758943">Sluiten</translation>
+<translation id="6054741997831917303">De prijs van dit item is recent verlaagd van <ph name="PREVIOUS_PRICE" /> naar <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Tabbladen selecteren</translation>
 <translation id="6510648526783655549">Tabbladstrook sluiten</translation>
 <translation id="6562820390860419811">Tabblad naar links verplaatsen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
index d99b4c3..505e0d9 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Trage filele pentru a le grupa</translation>
 <translation id="5846292395804797011">Închide grupul <ph name="TITLE_OF_GROUP" /> cu <ph name="NUMBER_OF_TABS" /> file</translation>
 <translation id="6040143037577758943">Închide</translation>
+<translation id="6054741997831917303">Prețul articolului a scăzut recent de la <ph name="PREVIOUS_PRICE" /> la <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Selectează file</translation>
 <translation id="6510648526783655549">Închide bara de file</translation>
 <translation id="6562820390860419811">Mută fila spre stânga</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
index 4056c75..b7d587e 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Povlecite zavihke, če jih želite združiti v skupino</translation>
 <translation id="5846292395804797011">Zapri skupino <ph name="TITLE_OF_GROUP" /> s toliko zavihki: <ph name="NUMBER_OF_TABS" /></translation>
 <translation id="6040143037577758943">Zapri</translation>
+<translation id="6054741997831917303">Cena tega izdelka je bila nedavno <ph name="PREVIOUS_PRICE" />, zdaj je <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Izberite zavihke</translation>
 <translation id="6510648526783655549">Zapri trak z zavihki</translation>
 <translation id="6562820390860419811">Premakni zavihek v levo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
index a01ad6fc..1682a63 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Prevucite kartice da biste ih grupisali</translation>
 <translation id="5846292395804797011">Zatvorite grupu <ph name="TITLE_OF_GROUP" /> sa kartica: <ph name="NUMBER_OF_TABS" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
+<translation id="6054741997831917303">Cena ove stavke je nedavno snižena sa <ph name="PREVIOUS_PRICE" /> na <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Izaberite kartice</translation>
 <translation id="6510648526783655549">Zatvorite traku sa karticama</translation>
 <translation id="6562820390860419811">Premestite karticu ulevo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
index deccf41..998f78fe 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
@@ -48,6 +48,7 @@
 <translation id="58326064309361797">Превуците картице да бисте их груписали</translation>
 <translation id="5846292395804797011">Затворите групу <ph name="TITLE_OF_GROUP" /> са картица: <ph name="NUMBER_OF_TABS" /></translation>
 <translation id="6040143037577758943">Затвори</translation>
+<translation id="6054741997831917303">Цена ове ставке је недавно снижена са <ph name="PREVIOUS_PRICE" /> на <ph name="NEW_PRICE" /></translation>
 <translation id="6193448654517602979">Изаберите картице</translation>
 <translation id="6510648526783655549">Затворите траку са картицама</translation>
 <translation id="6562820390860419811">Преместите картицу улево</translation>
diff --git a/chrome/android/feed/BUILD.gn b/chrome/android/feed/BUILD.gn
index 6f271f5..12cedac3 100644
--- a/chrome/android/feed/BUILD.gn
+++ b/chrome/android/feed/BUILD.gn
@@ -10,7 +10,6 @@
   sources = [
     "core/java/res/drawable/feed_text_ripple_drawable_dark.xml",
     "core/java/res/drawable/feed_text_ripple_drawable_light.xml",
-    "core/java/res/drawable/hairline_border_card_background_with_inset.xml",
     "core/java/res/layout/feed_spinner.xml",
     "core/java/res/layout/following_empty_state.xml",
     "core/java/res/layout/no_connection.xml",
diff --git a/chrome/android/feed/core/java/res/drawable/hairline_border_card_background_with_inset.xml b/chrome/android/feed/core/java/res/drawable/hairline_border_card_background_with_inset.xml
deleted file mode 100644
index fd9a1f6..0000000
--- a/chrome/android/feed/core/java/res/drawable/hairline_border_card_background_with_inset.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<!-- TODO(twellington): Remove tools:ignore after feed build flag is removed -->
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:shape="rectangle" >
-    <solid android:color="@color/default_bg_color" />
-    <stroke android:width="1dp" android:color="@color/hairline_stroke_color"/>
-    <corners android:radius="@dimen/default_rounded_corner_radius" />
-    <padding android:left="1dp" android:right="1dp" android:top="1dp" android:bottom="1dp"/>
-</shape>
diff --git a/chrome/android/feed/core/java/res/layout/following_empty_state.xml b/chrome/android/feed/core/java/res/layout/following_empty_state.xml
index 994e951a..0d34d787 100644
--- a/chrome/android/feed/core/java/res/layout/following_empty_state.xml
+++ b/chrome/android/feed/core/java/res/layout/following_empty_state.xml
@@ -4,22 +4,26 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<LinearLayout
+<org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:padding="@dimen/no_content_padding"
-    android:background="@drawable/hairline_border_card_background_with_inset">
-    <TextView
-          android:layout_width="match_parent"
-          android:layout_height="wrap_content"
-          android:paddingBottom="@dimen/no_content_text_padding"
-          android:textAppearance="@style/TextAppearance.TextLarge.Primary"
-          android:text="@string/web_feed_no_cards_title" />
-    <TextView
-          android:layout_width="match_parent"
-          android:layout_height="wrap_content"
-          android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
-          android:text="@string/web_feed_no_cards_instructions" />
-</LinearLayout>
+    style="@style/MaterialCardStyle">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="@dimen/no_content_padding">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/no_content_text_padding"
+            android:textAppearance="@style/TextAppearance.TextLarge.Primary"
+            android:text="@string/web_feed_no_cards_title" />
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
+            android:text="@string/web_feed_no_cards_instructions" />
+    </LinearLayout>
+</org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
diff --git a/chrome/android/feed/core/java/res/layout/no_connection.xml b/chrome/android/feed/core/java/res/layout/no_connection.xml
index 697ef28..2c3bd9f7 100644
--- a/chrome/android/feed/core/java/res/layout/no_connection.xml
+++ b/chrome/android/feed/core/java/res/layout/no_connection.xml
@@ -4,23 +4,26 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<LinearLayout
-  xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content"
-  android:orientation="vertical"
-  android:id="@+id/no_connection"
-  android:padding="@dimen/no_content_padding"
-  android:background="@drawable/hairline_border_card_background_with_inset">
-  <TextView
+<org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/no_content_text_padding"
-    android:textAppearance="@style/TextAppearance.TextLarge.Primary"
-    android:text="@string/discover_cant_refresh" />
-  <TextView
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
-    android:text="@string/discover_cant_refresh_instructions" />
-</LinearLayout>
+    style="@style/MaterialCardStyle">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="@dimen/no_content_padding">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/no_content_text_padding"
+            android:textAppearance="@style/TextAppearance.TextLarge.Primary"
+            android:text="@string/discover_cant_refresh" />
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
+            android:text="@string/discover_cant_refresh_instructions" />
+    </LinearLayout>
+</org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
diff --git a/chrome/android/feed/core/java/res/layout/no_content_v2.xml b/chrome/android/feed/core/java/res/layout/no_content_v2.xml
index 6966401a..8577c87 100644
--- a/chrome/android/feed/core/java/res/layout/no_content_v2.xml
+++ b/chrome/android/feed/core/java/res/layout/no_content_v2.xml
@@ -4,23 +4,26 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<LinearLayout
-  xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content"
-  android:orientation="vertical"
-  android:id="@+id/no_content"
-  android:padding="@dimen/no_content_padding"
-  android:background="@drawable/hairline_border_card_background_with_inset">
-  <TextView
+<org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/no_content_text_padding"
-    android:textAppearance="@style/TextAppearance.TextLarge.Primary"
-    android:text="@string/discover_no_cards" />
-  <TextView
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
-    android:text="@string/discover_no_cards_instructions" />
-</LinearLayout>
+    style="@style/MaterialCardStyle">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="@dimen/no_content_padding">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/no_content_text_padding"
+            android:textAppearance="@style/TextAppearance.TextLarge.Primary"
+            android:text="@string/discover_no_cards" />
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
+            android:text="@string/discover_no_cards_instructions" />
+    </LinearLayout>
+</org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
diff --git a/chrome/android/feed/core/java/res/values/styles.xml b/chrome/android/feed/core/java/res/values/styles.xml
index c5d6f11..684fb5c 100644
--- a/chrome/android/feed/core/java/res/values/styles.xml
+++ b/chrome/android/feed/core/java/res/values/styles.xml
@@ -11,7 +11,6 @@
        Android can swap themes for us automatically if we use styles with the
        same name in values and values-night.-->
   <style name="ThemeOverlay.Feed.Light" parent="">
-    <item name="colorPrimary">@color/default_control_color_active</item>
     <item name="feedTextRippleDrawable">@drawable/feed_text_ripple_drawable_light</item>
     <!-- TODO(crbug.com/1039415): This is an old text style color (changed for
      Modern update back in 2018). Swap for @color/default_text_color.-->
@@ -21,7 +20,6 @@
   </style>
 
   <style name="ThemeOverlay.Feed.Dark" parent="">
-    <item name="colorPrimary">@color/default_control_color_active</item>
     <item name="feedTextRippleDrawable">@drawable/feed_text_ripple_drawable_dark</item>
     <item name="feedPrimaryTextColor">@color/feed_default_text_color_dark</item>
     <item name="feedSecondaryTextColor">@color/feed_default_text_color_secondary_dark</item>
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 40ed75f8f..2dc5755 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -1313,6 +1313,16 @@
           tools:node="remove">
       </provider>
 
+      <!-- The Play Core library added support for Play Asset Delivery (PAD), which is primarily
+           used by game apps to allow dynamic delivery of resource bundles. Since chrome does not
+           currently use this feature, remove these services to reclaim 70kb+ of binary size. -->
+      <service
+          android:name="com.google.android.play.core.assetpacks.AssetPackExtractionService"
+          tools:node="remove"/>
+      <service
+          android:name="com.google.android.play.core.assetpacks.ExtractionForegroundService"
+          tools:node="remove"/>
+
       <!-- Provider for chrome data. -->
       <provider android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider"
           android:authorities="{{ manifest_package }}.ChromeBrowserProvider;{{ manifest_package }}.browser;{{ manifest_package }}"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index dd4a245..fc40ac6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -1780,7 +1780,7 @@
         if (mMultiInstanceManager != null) {
             int assignedIndex = TabWindowManagerSingleton.getInstance().getIndexForWindow(this);
             // The given index and the one computed by TabWindowManager should be one and the same.
-            assert !MultiWindowUtils.instanceSwitcherEnabled() || assignedIndex == mWindowId;
+            assert !MultiWindowUtils.isMultiInstanceApi31Enabled() || assignedIndex == mWindowId;
             mMultiInstanceManager.initialize(assignedIndex, getTaskId());
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index be812c4..772641d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -507,7 +507,8 @@
 
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     public boolean instanceSwitcherEnabled() {
-        return MultiWindowUtils.instanceSwitcherEnabled();
+        return MultiWindowUtils.instanceSwitcherEnabled()
+                && MultiWindowUtils.isMultiInstanceApi31Enabled();
     }
 
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
index 14edcb6c..2266458 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -111,8 +111,6 @@
      * @return Whether a Tap gesture is currently supported as a trigger for the feature.
      */
     boolean isTapSupported() {
-        if (isTapDisabledDueToLongpress()) return false;
-
         return (!isUserUndecided()
                        || ContextualSearchFieldTrial.getSwitch(
                                ContextualSearchSwitch
@@ -206,7 +204,8 @@
      * context with the right gesture.
      */
     boolean isLongpressInPanelHelpCondition() {
-        return mSelectionController.isTapSelection() && canResolveLongpress() && !isUserUndecided();
+        // We no longer support an IPH in the panel for promoting a Longpress instead of a Tap.
+        return false;
     }
 
     /**
@@ -286,11 +285,6 @@
         return ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXTUAL_SEARCH_LITERAL_SEARCH_TAP);
     }
 
-    /** @return whether Tap is disabled due to the longpress experiment. */
-    private boolean isTapDisabledDueToLongpress() {
-        return canResolveLongpress() && !isLiteralSearchTapEnabled();
-    }
-
     /**
      * Determines the policy for sending page content when on plain HTTP pages.
      * Checks a Feature to use our legacy HTTP policy instead of treating HTTP just like HTTPS.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
index e7feb62..9c572c9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
@@ -112,7 +112,7 @@
             MenuOrKeyboardActionController menuOrKeyboardActionController) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             return null;
-        } else if (MultiWindowUtils.instanceSwitcherEnabled()) {
+        } else if (MultiWindowUtils.isMultiInstanceApi31Enabled()) {
             return new MultiInstanceManagerApi31(activity, tabModelOrchestratorSupplier,
                     multiWindowModeStateDispatcher, activityLifecycleDispatcher,
                     modalDialogManagerSupplier, menuOrKeyboardActionController);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
index d2cedb8..c4c47a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
@@ -60,7 +60,7 @@
 
     private static MultiWindowUtils sInstance = new MultiWindowUtils();
 
-    private final boolean mInstanceSwitcherEnabled;
+    private final boolean mMultiInstanceApi31Enabled;
 
     // Used to keep track of whether ChromeTabbedActivity2 is running. A tri-state Boolean is
     // used in case both activities die in the background and MultiWindowUtils is recreated.
@@ -85,14 +85,25 @@
     }
 
     protected MultiWindowUtils() {
-        mInstanceSwitcherEnabled = instanceSwitcherEnabled();
+        mMultiInstanceApi31Enabled = isMultiInstanceApi31Enabled();
     }
 
+    /**
+     * @return Whether the feature flag is on to enable instance switcher UI/menu.
+     */
     public static boolean instanceSwitcherEnabled() {
         // Instance switcher is supported on S, and on some R platforms where the new
         // launch mode is backported.
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) return false;
-        if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANCE_SWITCHER)) return false;
+        return CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANCE_SWITCHER);
+    }
+
+    /**
+     * @return Whether the new launch mode 'singleInstancePerTask' is configured to allow
+     *         multiple instantiation of Chrome instance.
+     */
+    public static boolean isMultiInstanceApi31Enabled() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) return false;
         Context context = ContextUtils.getApplicationContext();
         String packageName = context.getPackageName();
         String className = ChromeTabbedActivity.class.getCanonicalName();
@@ -113,8 +124,8 @@
     }
 
     public static int getMaxInstances() {
-        return MultiWindowUtils.instanceSwitcherEnabled() ? TabWindowManager.MAX_SELECTORS_S
-                                                          : TabWindowManager.MAX_SELECTORS_LEGACY;
+        return isMultiInstanceApi31Enabled() ? TabWindowManager.MAX_SELECTORS_S
+                                             : TabWindowManager.MAX_SELECTORS_LEGACY;
     }
 
     /**
@@ -229,7 +240,14 @@
     }
 
     /**
-     *
+     * Creates and returns an {@link Intent} that instantiates a new Chrome instance.
+     * @param activity The activity firing the intent.
+     * @param instanceId ID of the new Chrome instance to be created.
+     * @param preferNew {@code true} if the new instance should be instanted as a fresh
+     *        new one not loading any tabs from a persistent disk file.
+     * @param openAdjacently {@code true} if the new instance shall be created in
+     *        the adjacent window of split-screen mode.
+     * @return The created intent.
      */
     public static Intent createNewWindowIntent(
             Activity activity, int instanceId, boolean preferNew, boolean openAdjacently) {
@@ -362,7 +380,7 @@
     public Class<? extends ChromeTabbedActivity> getTabbedActivityForIntent(
             @Nullable Intent intent, Context context) {
         // 0. Use always ChromeTabbedActivity when multi-instance support in S+ is enabled.
-        if (mInstanceSwitcherEnabled) return ChromeTabbedActivity.class;
+        if (mMultiInstanceApi31Enabled) return ChromeTabbedActivity.class;
 
         // 1. Exit early if the build version doesn't support Android N+ multi-window mode or
         // ChromeTabbedActivity2 isn't running.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
index a32d1e8..ab6f15af 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
@@ -8,6 +8,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.Consumer;
 import org.chromium.base.Promise;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
@@ -15,6 +16,7 @@
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.sync.TrustedVaultUserActionTriggerForUMA;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -257,23 +259,16 @@
      */
     @CalledByNative
     private static void fetchKeys(int requestId, CoreAccountInfo accountInfo) {
+        Consumer<List<byte[]>> responseCb = keys -> {
+            if (get().mNativeTrustedVaultClientAndroid == 0) {
+                // Native already unregistered, no response needed.
+                return;
+            }
+            TrustedVaultClientJni.get().fetchKeysCompleted(get().mNativeTrustedVaultClientAndroid,
+                    requestId, accountInfo.getGaiaId(), keys.toArray(new byte[0][]));
+        };
         get().mBackend.fetchKeys(accountInfo)
-                .then(
-                        (keys)
-                                -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                TrustedVaultClientJni.get().fetchKeysCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId,
-                                        accountInfo.getGaiaId(), keys.toArray(new byte[0][]));
-                            }
-                        },
-                        (exception) -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                TrustedVaultClientJni.get().fetchKeysCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId,
-                                        accountInfo.getGaiaId(), new byte[0][]);
-                            }
-                        });
+                .then(responseCb::accept, exception -> responseCb.accept(new ArrayList<byte[]>()));
     }
 
     /**
@@ -282,24 +277,19 @@
      */
     @CalledByNative
     private static void markLocalKeysAsStale(int requestId, CoreAccountInfo accountInfo) {
-        get().mBackend.markLocalKeysAsStale(accountInfo)
-                .then(
-                        (result)
-                                -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                TrustedVaultClientJni.get().markLocalKeysAsStaleCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId, result);
-                            }
-                        },
-                        (exception) -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                // There's no certainty about whether the operation made any
-                                // difference so let's return true indicating that it might have,
-                                // since false positives are allowed.
-                                TrustedVaultClientJni.get().markLocalKeysAsStaleCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId, true);
-                            }
-                        });
+        Consumer<Boolean> responseCallback = succeeded -> {
+            if (get().mNativeTrustedVaultClientAndroid == 0) {
+                // Native already unregistered, no response needed.
+                return;
+            }
+            TrustedVaultClientJni.get().markLocalKeysAsStaleCompleted(
+                    get().mNativeTrustedVaultClientAndroid, requestId, succeeded);
+        };
+        get().mBackend
+                .markLocalKeysAsStale(accountInfo)
+                // If an exception occurred, it's unknown whether the operation made any
+                // difference. In doubt return true, since false positives are allowed.
+                .then(responseCallback::accept, exception -> responseCallback.accept(true));
     }
 
     /**
@@ -308,22 +298,20 @@
      */
     @CalledByNative
     private static void getIsRecoverabilityDegraded(int requestId, CoreAccountInfo accountInfo) {
-        get().mBackend.getIsRecoverabilityDegraded(accountInfo)
-                .then(
-                        (result)
-                                -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                TrustedVaultClientJni.get().getIsRecoverabilityDegradedCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId, result);
-                            }
-                        },
-                        (exception) -> {
-                            if (get().mNativeTrustedVaultClientAndroid != 0) {
-                                // In doubt, let's not bother the user with a prompt.
-                                TrustedVaultClientJni.get().getIsRecoverabilityDegradedCompleted(
-                                        get().mNativeTrustedVaultClientAndroid, requestId, false);
-                            }
-                        });
+        Consumer<Boolean> responseCallback = isDegraded -> {
+            if (get().mNativeTrustedVaultClientAndroid == 0) {
+                // Native already unregistered, no response needed.
+                return;
+            }
+            TrustedVaultClientJni.get().getIsRecoverabilityDegradedCompleted(
+                    get().mNativeTrustedVaultClientAndroid, requestId, isDegraded);
+        };
+
+        get().mBackend
+                .getIsRecoverabilityDegraded(accountInfo)
+                // If an exception occurred, it's unknown whether recoverability is degraded. In
+                // doubt reply with `false`, so the user isn't bothered with a prompt.
+                .then(responseCallback::accept, exception -> responseCallback.accept(false));
     }
 
     @NativeMethods
@@ -331,9 +319,9 @@
         void fetchKeysCompleted(
                 long nativeTrustedVaultClientAndroid, int requestId, String gaiaId, byte[][] keys);
         void markLocalKeysAsStaleCompleted(
-                long nativeTrustedVaultClientAndroid, int requestId, boolean result);
+                long nativeTrustedVaultClientAndroid, int requestId, boolean succeeded);
         void getIsRecoverabilityDegradedCompleted(
-                long nativeTrustedVaultClientAndroid, int requestId, boolean result);
+                long nativeTrustedVaultClientAndroid, int requestId, boolean isDegraded);
         void notifyKeysChanged(long nativeTrustedVaultClientAndroid);
         void notifyRecoverabilityChanged(long nativeTrustedVaultClientAndroid);
         void recordKeyRetrievalTrigger(@TrustedVaultUserActionTriggerForUMA int trigger);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index 6f48935..c81d9112 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -332,6 +332,7 @@
     private class ContextualSearchManagerTestHost implements ContextualSearchTestHost {
         @Override
         public void triggerNonResolve(String nodeId) throws TimeoutException {
+            // TODO(donnd): remove support for the LiteralSearchTap Feature.
             if (mPolicy.isLiteralSearchTapEnabled()) {
                 clickWordNode(nodeId);
             } else if (!mPolicy.canResolveLongpress()) {
@@ -1551,6 +1552,17 @@
                 "Search.RelatedSearches.CarouselLastVisibleItemPosition");
     }
 
+    /**
+     * Returns whether all the supported gestures for opted-in users trigger a Resolve request,
+     * aka intelligent search.
+     */
+    private boolean isConfigurationForResolvingGesturesOnly() {
+        // The current interpretation of the ability to resolve Longpress (which is forced by the
+        // Translations Feature as well as the LongpressResolve Feature) preserves a resolving Tap
+        // so there is no non-resolving gesture for opted-in users.
+        return mPolicy.canResolveLongpress();
+    }
+
     //============================================================================================
     // Test Cases
     //============================================================================================
@@ -1659,6 +1671,7 @@
     @Feature({"ContextualSearch"})
     @ParameterAnnotations.UseMethodParameter(FeatureParamProvider.class)
     public void testNonResolveTrigger(@EnabledFeature int enabledFeature) throws Exception {
+        if (isConfigurationForResolvingGesturesOnly()) return;
         triggerNonResolve("states");
 
         Assert.assertNull(mFakeServer.getSearchTermRequested());
@@ -1856,7 +1869,7 @@
         longPressNode("intelligence");
         Assert.assertEquals("Intelligence", getSelectedText());
         waitForPanelToPeek();
-        assertLoadedNoUrl();  // No load after long-press until opening panel.
+        assertLoadedNoUrl(); // No load (preload) after long-press until opening panel.
         clickNode("question-mark");
         waitForPanelToCloseAndSelectionEmpty();
         Assert.assertTrue(TextUtils.isEmpty(getSelectedText()));
@@ -2530,6 +2543,7 @@
     @ParameterAnnotations.UseMethodParameter(FeatureParamProvider.class)
     public void testNotifyObserversAfterNonResolve(@EnabledFeature int enabledFeature)
             throws Exception {
+        if (isConfigurationForResolvingGesturesOnly()) return;
         TestContextualSearchObserver observer = new TestContextualSearchObserver();
         TestThreadUtils.runOnUiThreadBlocking(() -> mManager.addObserver(observer));
         triggerNonResolve("states");
@@ -3380,6 +3394,7 @@
     public void testNetworkDisconnectedDeactivatesSearch(@EnabledFeature int enabledFeature)
             throws Exception {
         setOnlineStatusAndReload(false);
+        // We use the longpress gesture here because unlike Tap it's never suppressed.
         longPressNodeWithoutWaiting("states");
         waitForSelectActionBarVisible();
         // Verify the panel didn't open.  It should open by now if CS has not been disabled.
@@ -3506,7 +3521,7 @@
     @ParameterAnnotations.UseMethodParameter(FeatureParamProvider.class)
     @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O, message = "crbug.com/1075895")
     @DisabledTest(message = "Flaky https://crbug.com/1127796")
-    public void testQuickActionUrl_Longpress(@EnabledFeature int enabledFeature) throws Exception {
+    public void testQuickActionUrl(@EnabledFeature int enabledFeature) throws Exception {
         final String testUrl = mTestServer.getURL("/chrome/test/data/android/google.html");
 
         // Simulate a resolving search to show the Bar, then set the quick action data.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
index 1bff83e8..9eee352 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
@@ -19,11 +19,13 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
@@ -34,6 +36,7 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@DisableFeatures({ChromeFeatureList.REVERT_DSE_AUTOMATIC_PERMISSIONS})
 public class GeolocationHeaderTest {
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java
index 61d5787..605f946a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java
@@ -21,6 +21,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
@@ -28,6 +29,7 @@
 import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni;
@@ -69,6 +71,7 @@
     @SmallTest
     @Feature({"Preferences"})
     @DisableIf.Build(hardware_is = "sprout", message = "crashes on android-one: crbug.com/540720")
+    @DisableFeatures({ChromeFeatureList.REVERT_DSE_AUTOMATIC_PERMISSIONS})
     public void testSearchEnginePreference() throws Exception {
         ensureTemplateUrlServiceLoaded();
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
index 5fdf9d5f..8961049 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
@@ -27,6 +27,7 @@
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni;
@@ -42,6 +43,7 @@
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Batch(SiteSettingsTest.SITE_SETTINGS_BATCH_NAME)
+@DisableFeatures({ChromeFeatureList.REVERT_DSE_AUTOMATIC_PERMISSIONS})
 public class PermissionInfoTest {
     private static final String DSE_ORIGIN = "https://www.google.com";
     private static final String OTHER_ORIGIN = "https://www.other.com";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
index 32a630d6..1da17da 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
@@ -926,7 +926,7 @@
             tab.getUserDataHost().setUserData(
                     ShoppingPersistedTabData.class, shoppingPersistedTabData);
             // Tab being destroyed should result in the public API from returning null
-            tab.setIsDestroyed(true);
+            tab.destroy();
             ShoppingPersistedTabData.from(tab, (sptdRes) -> {
                 Assert.assertNull(sptdRes);
                 semaphore.release();
@@ -947,7 +947,7 @@
         // acquired from OptimizationGuide.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // Tab being destroyed should result in the public API from returning null
-            tab.setIsDestroyed(true);
+            tab.destroy();
             ShoppingPersistedTabData.from(tab, (sptdRes) -> {
                 Assert.assertNull(sptdRes);
                 semaphore.release();
@@ -983,7 +983,7 @@
             // Remove UserData to force acquisition from storage.
             tab.getUserDataHost().removeUserData(ShoppingPersistedTabData.class);
             // Tab being destroyed should result in the public API from returning null
-            tab.setIsDestroyed(true);
+            tab.destroy();
             ShoppingPersistedTabData.from(tab, (sptdRes) -> {
                 Assert.assertNull(sptdRes);
                 semaphore1.release();
@@ -1020,7 +1020,7 @@
             // Remove UserData to force acquisition from storage.
             tab.getUserDataHost().removeUserData(ShoppingPersistedTabData.class);
             // Tab being destroyed should result in the public API from returning null
-            tab.setIsDestroyed(true);
+            tab.destroy();
             ShoppingPersistedTabData.from(tab, (sptdRes) -> {
                 Assert.assertNull(sptdRes);
                 semaphore1.release();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeBundleSmokeTest.java b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeBundleSmokeTest.java
index ad40d5922..9c45439 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeBundleSmokeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeBundleSmokeTest.java
@@ -20,6 +20,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.test.pagecontroller.rules.ChromeUiApplicationTestRule;
 import org.chromium.chrome.test.pagecontroller.rules.ChromeUiAutomatorTestRule;
 import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator;
@@ -86,6 +87,7 @@
     }
 
     @Test
+    @DisabledTest(message = "https://crbug.com/1238487")
     public void testModuleNativeResourceLoading() {
         runTestActivity(3); // Test case LOAD_NATIVE_RESOURCE.
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
index 5cc05cf..1c032f3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
@@ -20,7 +20,9 @@
 import org.junit.After;
 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.Mockito;
 import org.robolectric.RuntimeEnvironment;
@@ -28,8 +30,8 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -62,7 +64,12 @@
                 OptionalNewTabButtonControllerActivityTest.ShadowChromeFeatureList.class,
                 ShadowGURL.class})
 @RunWith(BaseRobolectricTestRunner.class)
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ChromeSwitches.DISABLE_NATIVE_INITIALIZATION})
 public class OptionalNewTabButtonControllerActivityTest {
+    @Rule
+    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
+
     /**
      * Shadow of {@link OptionalNewTabButtonController.Delegate}. Injects testing values into every
      * instance of {@link OptionalNewTabButtonController}.
@@ -117,8 +124,6 @@
     public void setUp() {
         // Avoid leaking state from the previous test.
         resetStaticState();
-        CommandLine.getInstance().appendSwitch(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE);
-        CommandLine.getInstance().appendSwitch(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION);
         ShadowChromeFeatureList.sParamValues.put("mode", AdaptiveToolbarFeatures.ALWAYS_NEW_TAB);
 
         MockTabModelSelector tabModelSelector = new MockTabModelSelector(
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni
index e795bb7..e583b1a 100644
--- a/chrome/android/webapk/shell_apk/current_version/current_version.gni
+++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@
 # //chrome/android/webapk/shell_apk:webapk is changed. This includes
 # Java files, Android resource files and AndroidManifest.xml. Does not affect
 # Chrome.apk
-current_shell_apk_version = 140
+current_shell_apk_version = 141
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index f4bd1377..9c12fe0 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -86,6 +86,7 @@
 #include "chrome/child/v8_crashpad_support_win.h"
 #include "chrome/chrome_elf/chrome_elf_main.h"
 #include "chrome/common/child_process_logging.h"
+#include "chrome/common/protobuf_init.h"
 #include "chrome/install_static/install_util.h"
 #include "components/browser_watcher/extended_crash_reporting.h"
 #include "sandbox/win/src/sandbox.h"
@@ -606,6 +607,10 @@
 #if defined(OS_MAC)
   chrome::CacheChannelInfo();
 #endif
+
+#if defined(OS_WIN)
+  chrome::InitializeProtobuf();
+#endif
 }
 
 bool ChromeMainDelegate::ShouldCreateFeatureList() {
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 0caaf49..92d0fef 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7283,8 +7283,8 @@
       <message name="IDS_TAB_SEARCH_TAB_COUNT" desc="Plural form of a message indicating the presence of a number of tabs greater than one.">
         <ph name="NUM">$1<ex>2</ex></ph> Tabs
       </message>
-      <message name="IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ENTRIES" desc="The label for the button that toggles showing the recently closed entries list section.">
-        Toggle Recently Closed Entries
+      <message name="IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS" desc="The label for the button that toggles showing the recently closed items list section.">
+        Toggle Recently Closed Items
       </message>
 
       <!-- Strings for Window Titles in Menus -->
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ENTRIES.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ENTRIES.png.sha1
deleted file mode 100644
index 16b89b4b..0000000
--- a/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ENTRIES.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8bfc1266f52f663c0263de37e7b336e97f963b96
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS.png.sha1
new file mode 100644
index 0000000..a104f3d
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS.png.sha1
@@ -0,0 +1 @@
+3c30937b3bd05165b008f3520f6eaaa177dd642e
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 746e0ab..9f158ac 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Aktief</translation>
 <translation id="5567989639534621706">Programkaste</translation>
 <translation id="5568069709869097550">Kan nie aanmeld nie</translation>
+<translation id="5571092938913434726">Globale mediakontroles</translation>
 <translation id="5571832155627049070">Pasmaak jou profiel</translation>
 <translation id="5572851009514199876">Begin asseblief deur by Chrome aan te meld sodat Chrome kan kyk of jy toegelaat word om na hierdie werf te gaan.</translation>
 <translation id="5575473780076478375">Incognito-uitbreiding: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 99cd07a..85d4ad0d 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -4258,6 +4258,7 @@
 <translation id="5565735124758917034">ገባሪ</translation>
 <translation id="5567989639534621706">የመተግበሪያ መሸጎጫዎች</translation>
 <translation id="5568069709869097550">መግባት አልተቻለም</translation>
+<translation id="5571092938913434726">ሁለንተናዊ የሚዲያ መቆጣጠሪያዎች</translation>
 <translation id="5571832155627049070">መገለጫዎን አብጅ</translation>
 <translation id="5572851009514199876">Chrome እርስዎ ይህን ጣቢያ እንዲደርሱ የተፈቀደልዎ መሆኑን ወይም አለመሆኑን እንዲያረጋግጥ እባክዎ ይጀምሩና ወደ Chrome ይግቡ።</translation>
 <translation id="5575473780076478375">የማንነትን የማያሳውቅ ቅጥያ፦ <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 71a580c..a319fcd 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4259,6 +4259,7 @@
 <translation id="5565735124758917034">نشط</translation>
 <translation id="5567989639534621706">ذاكرة التخزين المؤقت للتطبيقات</translation>
 <translation id="5568069709869097550">تعذّر الدخول</translation>
+<translation id="5571092938913434726">عناصر التحكم في الوسائط العامة</translation>
 <translation id="5571832155627049070">تخصيص ملفك الشخصي</translation>
 <translation id="5572851009514199876">‏يُرجى البدء وتسجيل الدخول إلى Chrome لكي يتأكد Chrome مما إذا كان مسموحًا لك الوصول إلى الموقع الإلكتروني هذا أم لا.</translation>
 <translation id="5575473780076478375">إضافة وضع التصفح المتخفي: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index dc9f282..8103c8f 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -4260,6 +4260,7 @@
 <translation id="5565735124758917034">সক্ৰিয়</translation>
 <translation id="5567989639534621706">এপ্লিকেশ্বন কেশ্বসমূহ</translation>
 <translation id="5568069709869097550">ছাইন ইন কৰিব নোৱাৰি</translation>
+<translation id="5571092938913434726">গ্ল’বেল মিডিয়া নিয়ন্ত্ৰণবোৰ</translation>
 <translation id="5571832155627049070">আপোনাৰ প্ৰ’ফাইলটো কাষ্টমাইজ কৰক</translation>
 <translation id="5572851009514199876">অনুগ্ৰহ কৰি আৰম্ভ কৰি Chromeত ছাইন ইন কৰক যাতে Chromeএ আপুনি এই ছাইটটো এক্সেছ কৰিব পাৰেনে নোৱাৰে চাব পাৰে।</translation>
 <translation id="5575473780076478375">ইনক’গনিট’ এক্সটেনশ্বন: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 5f656b73..785b407 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -4252,6 +4252,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Tətbiq keşləri</translation>
 <translation id="5568069709869097550">Daxil ola bilməz</translation>
+<translation id="5571092938913434726">Qlobal Media Nəzarətləri</translation>
 <translation id="5571832155627049070">Profilinizi fərdiləşdirin</translation>
 <translation id="5572851009514199876">Başlayın və Chrome'a daxil olun, beləliklə, Chrome bu sayta girişə icazə olub olmadığını yoxlaya bilər.</translation>
 <translation id="5575473780076478375">İnkoqnito rejimi Artırması: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index d366a3a..28f9312 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -4256,6 +4256,7 @@
 <translation id="5565735124758917034">Актыўны</translation>
 <translation id="5567989639534621706">Кэшы праграм</translation>
 <translation id="5568069709869097550">Не ўдалося ўвайсці ў сістэму</translation>
+<translation id="5571092938913434726">Агульныя элементы кіравання мультымедыйным змесцівам</translation>
 <translation id="5571832155627049070">Наладзьце свой профіль</translation>
 <translation id="5572851009514199876">Каб Chrome змог праверыць, ці дазволена вам мець доступ да гэтага сайта, запусціце Chrome і ўвайдзіце ў свой уліковы запіс.</translation>
 <translation id="5575473780076478375">Пашырэнне інкогніта: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 8e9a072..0a4a0c84 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -101,6 +101,7 @@
 <translation id="1103523840287552314">Винаги да се превежда от <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Стоп</translation>
 <translation id="1110155001042129815">Изчакване</translation>
+<translation id="1111781754511998498">Проектор</translation>
 <translation id="1112420131909513020">Раздел на заден план използва Bluetooth</translation>
 <translation id="1113892970288677790">Изберете подбрани произведения на изкуството и изображения</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MODEL" /> от <ph name="PRINTER_MANUFACTURER" /> (USB)</translation>
@@ -531,6 +532,7 @@
 <translation id="156793199942386351"><ph name="CURRENTKEY" /> вече се използва за действието „<ph name="ACTION" />“. Натиснете произволен клавиш, за да <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Конзола на JavaScript</translation>
 <translation id="1568323446248056064">Отваряне на настройките за дисплея</translation>
+<translation id="1570604804919108255">Включване на известията</translation>
 <translation id="1571738973904005196">Преглед на раздела <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (гост)</translation>
 <translation id="1572266655485775982">Активиране на Wi-Fi</translation>
@@ -588,6 +590,7 @@
 <translation id="1621485112342885423">Вашите кошници</translation>
 <translation id="1621729191093924223">Функциите, за които е необходим микрофон, няма да работят</translation>
 <translation id="1621831347985899379">Данните от <ph name="DEVICE_TYPE" /> ще бъдат изтрити</translation>
+<translation id="1621984899599015181">Опциите за споделяне се управляват от организацията ви. Някои от тях може да са скрити.</translation>
 <translation id="1622054403950683339">Забравяне на Wi-Fi мрежа</translation>
 <translation id="1623132449929929218">Понастоящем няма достъп до изображенията. Моля, свържете се отново с интернет, за да видите колекциите от тапети.</translation>
 <translation id="1623723619460186680">Намаляване на синята светлина</translation>
@@ -832,6 +835,7 @@
 <translation id="1850508293116537636">Завъртане &amp;по часовниковата стрелка</translation>
 <translation id="1852141627593563189">Намерете опасния софтуер</translation>
 <translation id="1852799913675865625">Възникна грешка при опита за четене от файла: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Продължавайте оттам, откъдето сте прекъснали. От настройките можете да зададете приложенията винаги да се възстановяват при стартиране или да изключите функцията.</translation>
 <translation id="1854180393107901205">Спиране на предаването</translation>
 <translation id="1855079636134697549">Камерата е включена</translation>
 <translation id="1856715684130786728">Добавяне на местоположение...</translation>
@@ -961,6 +965,7 @@
 <translation id="1989113344093894667">Не е възможно заснемане на съдържание</translation>
 <translation id="1990046457226896323">Файловете за говор бяха изтеглени</translation>
 <translation id="1990512225220753005">Преките пътища да не се показват на тази страница</translation>
+<translation id="199191324030140441">Изключване на режима „Не безпокойте“</translation>
 <translation id="1992397118740194946">Няма зададен</translation>
 <translation id="1992924914582925289">Премахване от устройството</translation>
 <translation id="1994173015038366702">URL адрес на сайт</translation>
@@ -1002,6 +1007,7 @@
 
 Можете да управлявате настройките на профила, като инсталирате приложението Family Link на устройството си.  Изпратихме ви имейл с инструкции.</translation>
 <translation id="2040460856718599782">Ами сега! При опита да ви удостоверим нещо се обърка. Моля, проверете идентификационните си данни за вход и опитайте отново.</translation>
+<translation id="2040894699575719559">Местоположението е блокирано</translation>
 <translation id="2042279886444479655">Активни потребителски профили</translation>
 <translation id="2044014337866019681">За да отключите сесията, трябва да потвърдите <ph name="ACCOUNT" />.</translation>
 <translation id="204497730941176055">Име на шаблон за сертификат от Microsoft</translation>
@@ -1488,6 +1494,7 @@
 <translation id="2527167509808613699">Каквато и да е връзка</translation>
 <translation id="2530166226437958497">Отстраняване на неизправности</translation>
 <translation id="2532589005999780174">Режим на висок контраст</translation>
+<translation id="2533649878691950253">Достъпът на този сайт до точното ви местоположение бе блокиран, защото обикновено не го разрешавате</translation>
 <translation id="253434972992662860">&amp;Пауза</translation>
 <translation id="253557089021624350">Брой на активно използващите</translation>
 <translation id="2535799430745250929">Няма мобилна мрежа</translation>
@@ -1675,6 +1682,7 @@
 <translation id="2738771556149464852">Не след</translation>
 <translation id="2739191690716947896">Отстраняване на грешки</translation>
 <translation id="2739240477418971307">Промяна на настройките ви за достъпност</translation>
+<translation id="2739965161385757621">Преглед на настройките ми</translation>
 <translation id="274029851662193272">Снижена</translation>
 <translation id="2740531572673183784">OK</translation>
 <translation id="2741713322780029189">Отваряне на терминален прозорец за възстановяване</translation>
@@ -1799,6 +1807,7 @@
 <translation id="2864601841139725659">Задаване на снимката на потребителския ви профил</translation>
 <translation id="2865919525181940183">Екранна снимка на програмите на екрана</translation>
 <translation id="286674810810214575">Източниците на захранване се проверяват...</translation>
+<translation id="2866876751734765554">Преглед на настройките за поверителност</translation>
 <translation id="2867768963760577682">Отваряне като фиксиран раздел</translation>
 <translation id="2868746137289129307">Това разширение не е актуално и е деактивирано от корпоративно правило. Може да бъде активирано автоматично, когато бъде налице по-нова версия.</translation>
 <translation id="2870560284913253234">Сайт</translation>
@@ -2328,6 +2337,7 @@
 <translation id="3446274660183028131">Моля, стартирайте Parallels Desktop, за да инсталирате Windows.</translation>
 <translation id="344630545793878684">Четене на данните ви от редица уебсайтове</translation>
 <translation id="3446650212859500694">В този файл има деликатно съдържание</translation>
+<translation id="3446827946208017735">Прегледайте най-важните настройки за поверителност и научете повече за тях на едно място</translation>
 <translation id="3448086340637592206">Допълнителни условия на Google Chrome и Chrome OS</translation>
 <translation id="3448492834076427715">Актуализиране на профила</translation>
 <translation id="3449393517661170867">Нов прозорец с раздели</translation>
@@ -3759,6 +3769,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Няма намерени виртуални машини от тип <ph name="VM_TYPE" />}=1{Намерена е 1 виртуална машина от тип <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{Намерени са {NUM_VMS} виртуални машини от тип <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Няма връзка с интернет.</translation>
 <translation id="4998430619171209993">Включено</translation>
+<translation id="4999804342505941663">Включване на режима „Не безпокойте“</translation>
 <translation id="5000922062037820727">Блокирано (препоръчително)</translation>
 <translation id="5005498671520578047">Копиране на паролата</translation>
 <translation id="5006218871145547804">Отстраняване на грешки в приложения за Android през ADB за Crostini</translation>
@@ -4269,6 +4280,7 @@
 <translation id="5565735124758917034">Активно</translation>
 <translation id="5567989639534621706">Кешове на приложения</translation>
 <translation id="5568069709869097550">Не може да се влезе</translation>
+<translation id="5571092938913434726">Глобални контроли за мултимедия</translation>
 <translation id="5571832155627049070">Персонализиране на потребителския ви профил</translation>
 <translation id="5572851009514199876">Моля, стартирайте браузъра Chrome и влезте в него, за да се провери дали имате достъп до този сайт.</translation>
 <translation id="5575473780076478375">Разширение „Инкогнито“: <ph name="EXTENSION_NAME" /></translation>
@@ -5083,6 +5095,7 @@
 <translation id="6468485451923838994">Шрифтове</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> файла</translation>
 <translation id="6469557521904094793">Включване на мобилната мрежа</translation>
+<translation id="6470823736074966819">Спиране на известията</translation>
 <translation id="6472893788822429178">Показване на бутона „Начална страница“</translation>
 <translation id="6474498546677193336">Прекратяването на споделянето не бе успешно, защото тази папка се използва от приложение. Споделянето ѝ ще бъде прекратено при следващото изключване на устройството с Linux.</translation>
 <translation id="6474884162850599008">Прекратяване на връзката с профила в Google Диск</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 327b503..9644d5c 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4266,6 +4266,7 @@
 <translation id="5565735124758917034">সক্রিয়</translation>
 <translation id="5567989639534621706">অ্যাপ্লিকেশন ক্যাশে</translation>
 <translation id="5568069709869097550">প্রবেশ করতে পারছেন না</translation>
+<translation id="5571092938913434726">গ্লোবাল মিডিয়া কন্ট্রোল</translation>
 <translation id="5571832155627049070">আপনার প্রোফাইল কাস্টমাইজ করুন</translation>
 <translation id="5572851009514199876">আপনার এই সাইটে অ্যাক্সেস আছে কিনা, তা দেখার জন্য Chrome চালু করে সাইন-ইন করুন।</translation>
 <translation id="5575473780076478375">ছদ্মবেশী এক্সটেনশন: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 276323e..d4ccf96 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -101,6 +101,7 @@
 <translation id="1103523840287552314">Uvijek prevodi <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Zaustavi</translation>
 <translation id="1110155001042129815">Sačekaj</translation>
+<translation id="1111781754511998498">Projektor</translation>
 <translation id="1112420131909513020">Kartica u pozadini koristi bluetooth</translation>
 <translation id="1113892970288677790">Odaberite probrane ilustracije i slike</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -536,6 +537,7 @@
 <translation id="156793199942386351">Tipka "<ph name="CURRENTKEY" />" je već dodijeljena radnji "<ph name="ACTION" />". Pritisnite bilo koju tipku da <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Konzola za JavaScript</translation>
 <translation id="1568323446248056064">Otvori postavke uređaja za ekran</translation>
+<translation id="1570604804919108255">Uključi zvuk obavijesti</translation>
 <translation id="1571738973904005196">Prikaži karticu: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (gost)</translation>
 <translation id="1572266655485775982">Omogućavanje WiFi-ja</translation>
@@ -593,6 +595,7 @@
 <translation id="1621485112342885423">Vaše korpe</translation>
 <translation id="1621729191093924223">Funkcije za koje je potreban mikrofon neće funkcionirati</translation>
 <translation id="1621831347985899379">Podaci uređaja <ph name="DEVICE_TYPE" /> će se izbrisati</translation>
+<translation id="1621984899599015181">Opcijama za dijeljenje upravlja vaša organizacija. Neke su stavke možda skrivene.</translation>
 <translation id="1622054403950683339">Zanemari WiFi mrežu</translation>
 <translation id="1623132449929929218">Slike trenutno nisu dostupne. Ponovo se povežite na internet da vidite kolekcije pozadinskih slika.</translation>
 <translation id="1623723619460186680">Smanjenje plavog svjetla</translation>
@@ -835,6 +838,7 @@
 <translation id="1850508293116537636">Rotiraj u smjeru kazaljke na satu</translation>
 <translation id="1852141627593563189">Pronađi štetan softver</translation>
 <translation id="1852799913675865625">Došlo je do greške prilikom čitanja fajla: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Nastavite tamo gdje ste stali. U postavkama možete postaviti aplikacije tako da se uvijek vrati prilikom pokretanja ili isključite vraćanje.</translation>
 <translation id="1854180393107901205">Zaustavi emitiranje</translation>
 <translation id="1855079636134697549">Kamera je uključena</translation>
 <translation id="1856715684130786728">Dodaj lokaciju...</translation>
@@ -964,6 +968,7 @@
 <translation id="1989113344093894667">Nije moguće snimanje sadržaja</translation>
 <translation id="1990046457226896323">Fajlovi govora su preuzeti</translation>
 <translation id="1990512225220753005">Ne prikazuj prečice na ovoj stranici</translation>
+<translation id="199191324030140441">Isključivanje načina Ne uznemiravaj</translation>
 <translation id="1992397118740194946">Nije postavljeno</translation>
 <translation id="1992924914582925289">Ukloni s uređaja</translation>
 <translation id="1994173015038366702">URL web lokacije</translation>
@@ -1005,6 +1010,7 @@
 
 Postavkama ovog računa možete upravljati instaliranjem aplikacije Family Link na svoj uređaj.  Poslali smo vam e-poruku s uputstvom.</translation>
 <translation id="2040460856718599782">Ups!  Došlo je do greške prilikom vaše autentifikacije.  Ponovo provjerite akreditive za prijavu i pokušajte ponovo.</translation>
+<translation id="2040894699575719559">Lokacija je blokirana</translation>
 <translation id="2042279886444479655">Aktivni profili</translation>
 <translation id="2044014337866019681">Provjerite potvrđujete li račun <ph name="ACCOUNT" /> radi otključavanja sesije.</translation>
 <translation id="204497730941176055">Naziv šablona za Microsoftovu potvrdu</translation>
@@ -1491,6 +1497,7 @@
 <translation id="2527167509808613699">Bilo koja vrsta veze</translation>
 <translation id="2530166226437958497">Rješavanje problema</translation>
 <translation id="2532589005999780174">Način rada visokog kontrasta</translation>
+<translation id="2533649878691950253">Web-lokaciji je blokiran pristup vašoj točnoj lokaciji jer to obično ne dopuštate</translation>
 <translation id="253434972992662860">&amp;Pauziraj</translation>
 <translation id="253557089021624350">Broj aktivnih radnji</translation>
 <translation id="2535799430745250929">Mobilna mreža ne postoji</translation>
@@ -1677,6 +1684,7 @@
 <translation id="2738771556149464852">Ne poslije</translation>
 <translation id="2739191690716947896">Otkloni pogrešku</translation>
 <translation id="2739240477418971307">Promijeniti postavke pristupačnosti</translation>
+<translation id="2739965161385757621">Pregled postavki</translation>
 <translation id="274029851662193272">Utisnuto</translation>
 <translation id="2740531572673183784">Uredu</translation>
 <translation id="2741713322780029189">Otvorite terminal za oporavak</translation>
@@ -1801,6 +1809,7 @@
 <translation id="2864601841139725659">Postavite sliku profila</translation>
 <translation id="2865919525181940183">Snimak ekrana programa koji su trenutno na ekranu.</translation>
 <translation id="286674810810214575">Provjeravanje izvora napajanja...</translation>
+<translation id="2866876751734765554">Pregled privatnosti</translation>
 <translation id="2867768963760577682">Otvori kao zakačenu karticu</translation>
 <translation id="2868746137289129307">Ova ekstenzija je zastarjela i onemogućena je pravilom preduzeća. Može se omogućiti automatski kada nova verzija postane dostupna.</translation>
 <translation id="2870560284913253234">Web lokacija</translation>
@@ -2330,6 +2339,7 @@
 <translation id="3446274660183028131">Pokrenite Parallels Desktop da instalirate Windows.</translation>
 <translation id="344630545793878684">Čitati vaše podatke na nizu web lokacija</translation>
 <translation id="3446650212859500694">U ovom fajlu postoji osjetljiv sadržaj</translation>
+<translation id="3446827946208017735">Objašnjenje i pregled najkritičnijih postavki privatnosti na jednom mjestu</translation>
 <translation id="3448086340637592206">Dodatni uslovi za Google Chrome i Chrome OS</translation>
 <translation id="3448492834076427715">Ažuriraj račun</translation>
 <translation id="3449393517661170867">Novi prozor u kartici</translation>
@@ -3760,6 +3770,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Nijedan VM <ph name="VM_TYPE" /> nije pronađen}=1{Pronađen je 1 VM <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}one{Pronađen je {NUM_VMS} VM <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}few{Pronađena su {NUM_VMS} VM-a <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{Pronađeno je {NUM_VMS} VM-ova <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Nema internetske veze.</translation>
 <translation id="4998430619171209993">Uključeno</translation>
+<translation id="4999804342505941663">Uključi opciju Ne uznemiravaj</translation>
 <translation id="5000922062037820727">Blokirano (preporučeno)</translation>
 <translation id="5005498671520578047">Kopiranje lozinke</translation>
 <translation id="5006218871145547804">ADB Android aplikacija na Crostiniju</translation>
@@ -4270,6 +4281,7 @@
 <translation id="5565735124758917034">Aktivan</translation>
 <translation id="5567989639534621706">Keš memorije aplikacije</translation>
 <translation id="5568069709869097550">Ne možete se prijaviti</translation>
+<translation id="5571092938913434726">Globalne kontrole medija</translation>
 <translation id="5571832155627049070">Prilagodite profil</translation>
 <translation id="5572851009514199876">Pokrenite Chrome i prijavite se tako da Chrome može provjeriti imate li pristup ovoj web lokaciji.</translation>
 <translation id="5575473780076478375">Anonimna ekstenzija: <ph name="EXTENSION_NAME" /></translation>
@@ -5083,6 +5095,7 @@
 <translation id="6468485451923838994">Fontovi</translation>
 <translation id="6468773105221177474">Broj fajlova: <ph name="FILE_COUNT" /></translation>
 <translation id="6469557521904094793">Uključi mobilnu mrežu</translation>
+<translation id="6470823736074966819">Zanemari obavijesti</translation>
 <translation id="6472893788822429178">Prikaz dugmeta za početni ekran</translation>
 <translation id="6474498546677193336">Poništavanje dijeljenja nije uspjelo jer neka aplikacija koristi ovaj folder. Dijeljenje foldera će se poništiti nakon sljedećeg isključivanja Linuxa.</translation>
 <translation id="6474884162850599008">Prekini vezu s računom za Google Disk</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index fa7c36f..e27d289 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314">Tradueix sempre el text en <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Atura</translation>
 <translation id="1110155001042129815">Espera</translation>
+<translation id="1111781754511998498">Projector</translation>
 <translation id="1112420131909513020">Una pestanya de fons utilitza el Bluetooth</translation>
 <translation id="1113892970288677790">Tria obres d'art i imatges seleccionades</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -531,6 +532,7 @@
 <translation id="156793199942386351">La tecla <ph name="CURRENTKEY" /> ja està assignada a l'acció <ph name="ACTION" />. Prem qualsevol tecla per <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Consola de JavaScript</translation>
 <translation id="1568323446248056064">Obre la configuració de la pantalla</translation>
+<translation id="1570604804919108255">Deixa de silenciar les notificacions</translation>
 <translation id="1571738973904005196">Mostra la pestanya <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (convidat)</translation>
 <translation id="1572266655485775982">Activa la Wi-Fi</translation>
@@ -588,6 +590,7 @@
 <translation id="1621485112342885423">Els teus carretons</translation>
 <translation id="1621729191093924223">Les funcions que necessiten un micròfon no funcionaran</translation>
 <translation id="1621831347985899379">Les dades del dispositiu <ph name="DEVICE_TYPE" /> se suprimiran</translation>
+<translation id="1621984899599015181">La teva organització gestiona les opcions de compartició. Pot ser que alguns elements estiguin amagats.</translation>
 <translation id="1622054403950683339">Oblida la xarxa Wi-Fi</translation>
 <translation id="1623132449929929218">En aquests moments les imatges no estan disponibles. Torna't a connectar a Internet per veure les col·leccions de fons de pantalla.</translation>
 <translation id="1623723619460186680">Reducció de la llum blava</translation>
@@ -825,6 +828,7 @@
 <translation id="1850508293116537636">Gira en el sentit de les &amp;agulles del rellotge</translation>
 <translation id="1852141627593563189">Cerca programari maliciós</translation>
 <translation id="1852799913675865625">S'ha produït un error en intentar llegir el fitxer: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Continua des d'on ho vas deixar. Pots definir que les aplicacions es restaurin sempre a l'inici o desactivar la restauració a Configuració.</translation>
 <translation id="1854180393107901205">Atura l'emissió</translation>
 <translation id="1855079636134697549">La càmera està activada</translation>
 <translation id="1856715684130786728">Afegeix una ubicació...</translation>
@@ -953,6 +957,7 @@
 <translation id="1989113344093894667">No es pot capturar contingut</translation>
 <translation id="1990046457226896323">S'han baixat els fitxers de veu</translation>
 <translation id="1990512225220753005">No mostris dreceres en aquesta pàgina</translation>
+<translation id="199191324030140441">Desactiva el mode No molestis</translation>
 <translation id="1992397118740194946">No establerta</translation>
 <translation id="1992924914582925289">Suprimeix del dispositiu</translation>
 <translation id="1994173015038366702">URL del lloc web</translation>
@@ -994,6 +999,7 @@
 
 Pots gestionar la configuració d'aquest compte instal·lant l'aplicació Family Link al teu dispositiu.  T'hem enviat un correu amb instruccions.</translation>
 <translation id="2040460856718599782">S'ha produït un error quan provàvem d'autenticar-te. Comprova les teves credencials d'inici de sessió i torna-ho a provar.</translation>
+<translation id="2040894699575719559">S'ha bloquejat la ubicació</translation>
 <translation id="2042279886444479655">Perfils actius</translation>
 <translation id="2044014337866019681">Comprova que estàs verificant <ph name="ACCOUNT" /> per desbloquejar la sessió.</translation>
 <translation id="204497730941176055">Nom de plantilla de certificat de Microsoft</translation>
@@ -1476,6 +1482,7 @@
 <translation id="2527167509808613699">Qualsevol tipus de connexió</translation>
 <translation id="2530166226437958497">Resolució de problemes</translation>
 <translation id="2532589005999780174">Mode d'alt contrast</translation>
+<translation id="2533649878691950253">S'ha impedit que aquest lloc web sabés la teva ubicació exacta perquè normalment no ho permets</translation>
 <translation id="253434972992662860">P&amp;ausa</translation>
 <translation id="253557089021624350">Nombre de processos actius</translation>
 <translation id="2535799430745250929">No hi ha cap xarxa mòbil</translation>
@@ -1663,6 +1670,7 @@
 <translation id="2738771556149464852">No després</translation>
 <translation id="2739191690716947896">Depura</translation>
 <translation id="2739240477418971307">Canvia la configuració d'accessibilitat</translation>
+<translation id="2739965161385757621">Revisa la configuració</translation>
 <translation id="274029851662193272">Enfonsat</translation>
 <translation id="2740531572673183784">D'acord</translation>
 <translation id="2741713322780029189">Obre el terminal de recuperació</translation>
@@ -1787,6 +1795,7 @@
 <translation id="2864601841139725659">Estableix la teva foto de perfil</translation>
 <translation id="2865919525181940183">Captura de pantalla de programes que hi ha en pantalla en aquests moments</translation>
 <translation id="286674810810214575">S'estan comprovant les fonts d'alimentació...</translation>
+<translation id="2866876751734765554">Revisió de la privadesa</translation>
 <translation id="2867768963760577682">Obre com a pestanya fixada</translation>
 <translation id="2868746137289129307">Aquesta extensió no està actualitzada i està desactivada per a la política d'empresa. És possible que s'activi de manera automàtica quan estigui disponible una versió nova.</translation>
 <translation id="2870560284913253234">Lloc web</translation>
@@ -2316,6 +2325,7 @@
 <translation id="3446274660183028131">Inicia Parallels Desktop per instal·lar Windows.</translation>
 <translation id="344630545793878684">Llegir les dades d'una sèrie de llocs web</translation>
 <translation id="3446650212859500694">Aquest fitxer inclou contingut sensible</translation>
+<translation id="3446827946208017735">Entén i revisa les opcions de configuració de privadesa més importants des d'un sol lloc</translation>
 <translation id="3448086340637592206">Condicions addicionals de Google Chrome i Chrome OS</translation>
 <translation id="3448492834076427715">Actualitza el compte</translation>
 <translation id="3449393517661170867">Finestra amb pestanyes nova</translation>
@@ -3744,6 +3754,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{No s'ha trobat cap màquina virtual <ph name="VM_TYPE" />}=1{S'ha trobat una màquina virtual <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{S'han trobat {NUM_VMS} màquines virtuals <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">No hi ha connexió a Internet.</translation>
 <translation id="4998430619171209993">Activat</translation>
+<translation id="4999804342505941663">Activa el mode No molestis</translation>
 <translation id="5000922062037820727">Bloquejat (opció recomanada)</translation>
 <translation id="5005498671520578047">Copia la contrasenya</translation>
 <translation id="5006218871145547804">ADB d'aplicacions d'Android a Crostini</translation>
@@ -4255,6 +4266,7 @@
 <translation id="5565735124758917034">Actiu</translation>
 <translation id="5567989639534621706">Memòries cau de l'aplicació</translation>
 <translation id="5568069709869097550">No puc accedir</translation>
+<translation id="5571092938913434726">Controls multimèdia globals</translation>
 <translation id="5571832155627049070">Personalitza el perfil</translation>
 <translation id="5572851009514199876">Obre Chrome i inicia-hi la sessió perquè Chrome pugui comprovar si tens permís per accedir a aquest lloc.</translation>
 <translation id="5575473780076478375">Extensió d'incògnit: <ph name="EXTENSION_NAME" /></translation>
@@ -5069,6 +5081,7 @@
 <translation id="6468485451923838994">Tipus de lletra</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> fitxers</translation>
 <translation id="6469557521904094793">Activa la xarxa mòbil</translation>
+<translation id="6470823736074966819">Silencia les notificacions</translation>
 <translation id="6472893788822429178">Mostra el botó Pàgina d'inici</translation>
 <translation id="6474498546677193336">No s'ha pogut deixar de compartir perquè una aplicació està utilitzant aquesta carpeta. La carpeta es deixarà de compartir la propera vegada que Linux s'apagui.</translation>
 <translation id="6474884162850599008">Desconnecta el compte de Google Drive</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 08708ea6..2e9d68e 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -4255,6 +4255,7 @@
 <translation id="5565735124758917034">Aktivní</translation>
 <translation id="5567989639534621706">Mezipaměti aplikací</translation>
 <translation id="5568069709869097550">Nepodařilo se přihlásit</translation>
+<translation id="5571092938913434726">Globální ovládací prvky médií</translation>
 <translation id="5571832155627049070">Upravte si profil</translation>
 <translation id="5572851009514199876">Přihlaste se do Chromu, aby bylo možné ověřit, zda máte povolení tento web navštívit.</translation>
 <translation id="5575473780076478375">Anonymní rozšíření: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index cc8fa90..fabe76f3 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4273,6 +4273,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Applikationscaches</translation>
 <translation id="5568069709869097550">Kan ikke logge ind</translation>
+<translation id="5571092938913434726">Global mediestyring</translation>
 <translation id="5571832155627049070">Tilpas din profil</translation>
 <translation id="5572851009514199876">Start og log ind på Chrome, så Chrome kan kontrollere, om du har adgang til dette website.</translation>
 <translation id="5575473780076478375">Inkognitoudvidelse: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index ba1fdcb..dcbd4b9 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -4246,6 +4246,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Caches</translation>
 <translation id="5568069709869097550">Anmeldung nicht möglich</translation>
+<translation id="5571092938913434726">Globale Mediensteuerelemente</translation>
 <translation id="5571832155627049070">Profil anpassen</translation>
 <translation id="5572851009514199876">Melden Sie sich zuerst in Chrome an, damit überprüft werden kann, ob Sie auf diese Website zugreifen dürfen.</translation>
 <translation id="5575473780076478375">Anonyme Erweiterung: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 04c649e..d61e7e00 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Ενεργό</translation>
 <translation id="5567989639534621706">Προσωρινές μνήμες εφαρμογών</translation>
 <translation id="5568069709869097550">Δεν είναι δυνατή η σύνδεση</translation>
+<translation id="5571092938913434726">Καθολικά στοιχεία ελέγχου μέσων</translation>
 <translation id="5571832155627049070">Προσαρμογή του προφίλ σας</translation>
 <translation id="5572851009514199876">Εκκινήστε και συνδεθείτε στο Chrome, έτσι ώστε το Chrome να μπορεί να ελέγξει εάν έχετε δικαίωμα πρόσβασης σε αυτόν τον ιστότοπο.</translation>
 <translation id="5575473780076478375">Επέκταση ανώνυμης περιήγησης: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 94a775cf..1ac367bb 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -101,6 +101,7 @@
 <translation id="1103523840287552314">Always translate <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Stop</translation>
 <translation id="1110155001042129815">Wait</translation>
+<translation id="1111781754511998498">Projector</translation>
 <translation id="1112420131909513020">Background tab is using Bluetooth</translation>
 <translation id="1113892970288677790">Select curated artwork and images</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -534,6 +535,7 @@
 <translation id="156793199942386351">'<ph name="CURRENTKEY" />' is already assigned to the '<ph name="ACTION" />' action. Press any key to <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">JavaScript Console</translation>
 <translation id="1568323446248056064">Open display device settings</translation>
+<translation id="1570604804919108255">Unmute notifications</translation>
 <translation id="1571738973904005196">View tab: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (Guest)</translation>
 <translation id="1572266655485775982">Wi-Fi enable</translation>
@@ -591,6 +593,7 @@
 <translation id="1621485112342885423">Your baskets</translation>
 <translation id="1621729191093924223">Features that need a microphone won't work</translation>
 <translation id="1621831347985899379"><ph name="DEVICE_TYPE" /> data will be deleted</translation>
+<translation id="1621984899599015181">Options for sharing are managed by your organisation. Some items may be hidden.</translation>
 <translation id="1622054403950683339">Forget Wi-Fi network</translation>
 <translation id="1623132449929929218">The images are currently unavailable. Please reconnect to the Internet to see wallpaper collections.</translation>
 <translation id="1623723619460186680">Blue light reduction</translation>
@@ -836,6 +839,7 @@
 <translation id="1850508293116537636">Rotate &amp;clockwise</translation>
 <translation id="1852141627593563189">Find harmful software</translation>
 <translation id="1852799913675865625">There was an error while trying to read the file: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Continue from where you left off. You can set apps to always restore on startup or turn off restore in Settings.</translation>
 <translation id="1854180393107901205">Stop casting</translation>
 <translation id="1855079636134697549">Camera is turned on</translation>
 <translation id="1856715684130786728">Add location...</translation>
@@ -965,6 +969,7 @@
 <translation id="1989113344093894667">Can't capture content</translation>
 <translation id="1990046457226896323">Speech files downloaded</translation>
 <translation id="1990512225220753005">Don't show shortcuts on this page</translation>
+<translation id="199191324030140441">Turn off Do Not Disturb</translation>
 <translation id="1992397118740194946">Not set</translation>
 <translation id="1992924914582925289">Remove from device</translation>
 <translation id="1994173015038366702">Site URL</translation>
@@ -1006,6 +1011,7 @@
 
 You can manage this account’s settings by installing the Family Link app on your device.  We sent you instructions in an email.</translation>
 <translation id="2040460856718599782">Oops!  Something went wrong when trying to authenticate you. Please double-check your sign-in credentials and try again.</translation>
+<translation id="2040894699575719559">Location blocked</translation>
 <translation id="2042279886444479655">Active profiles</translation>
 <translation id="2044014337866019681">Please make sure that you are verifying <ph name="ACCOUNT" /> to unlock the session.</translation>
 <translation id="204497730941176055">Microsoft certificate template name</translation>
@@ -1492,6 +1498,7 @@
 <translation id="2527167509808613699">Any kind of connection</translation>
 <translation id="2530166226437958497">Troubleshooting</translation>
 <translation id="2532589005999780174">High contrast mode</translation>
+<translation id="2533649878691950253">This site was blocked from knowing your precise location because you usually don't allow this</translation>
 <translation id="253434972992662860">&amp;Pause</translation>
 <translation id="253557089021624350">Keepalive count</translation>
 <translation id="2535799430745250929">No mobile network exists</translation>
@@ -1679,6 +1686,7 @@
 <translation id="2738771556149464852">Not After</translation>
 <translation id="2739191690716947896">Debug</translation>
 <translation id="2739240477418971307">Change your accessibility settings</translation>
+<translation id="2739965161385757621">Review my settings</translation>
 <translation id="274029851662193272">Depressed</translation>
 <translation id="2740531572673183784">OK</translation>
 <translation id="2741713322780029189">Open recovery terminal</translation>
@@ -1803,6 +1811,7 @@
 <translation id="2864601841139725659">Set your profile picture</translation>
 <translation id="2865919525181940183">Screenshot of programs that are currently on the screen</translation>
 <translation id="286674810810214575">Checking power sources…</translation>
+<translation id="2866876751734765554">Privacy review</translation>
 <translation id="2867768963760577682">Open as pinned tab</translation>
 <translation id="2868746137289129307">This extension is outdated and disabled by enterprise policy. It might become enabled automatically when a newer version is available.</translation>
 <translation id="2870560284913253234">Site</translation>
@@ -2332,6 +2341,7 @@
 <translation id="3446274660183028131">Please launch Parallels Desktop to install Windows.</translation>
 <translation id="344630545793878684">Read your data on a number of websites</translation>
 <translation id="3446650212859500694">This file has sensitive content</translation>
+<translation id="3446827946208017735">Understand and review the most critical privacy settings in one place</translation>
 <translation id="3448086340637592206">Google Chrome and Chrome OS additional terms</translation>
 <translation id="3448492834076427715">Update account</translation>
 <translation id="3449393517661170867">New tabbed window</translation>
@@ -3762,6 +3772,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{No <ph name="VM_TYPE" /> VMs found}=1{1 <ph name="VM_TYPE" /> VM found: <ph name="VM_NAME_LIST" />}other{{NUM_VMS} <ph name="VM_TYPE" /> VMs found: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">No Internet connection.</translation>
 <translation id="4998430619171209993">On</translation>
+<translation id="4999804342505941663">Turn on Do Not Disturb</translation>
 <translation id="5000922062037820727">Blocked (recommended)</translation>
 <translation id="5005498671520578047">Copy password</translation>
 <translation id="5006218871145547804">Crostini Android app ADB</translation>
@@ -4272,6 +4283,7 @@
 <translation id="5565735124758917034">Active</translation>
 <translation id="5567989639534621706">Application Caches</translation>
 <translation id="5568069709869097550">Can't sign in</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Customise your profile</translation>
 <translation id="5572851009514199876">Please start and sign in to Chrome so that Chrome can check whether you are allowed to access this site.</translation>
 <translation id="5575473780076478375">Incognito Extension: <ph name="EXTENSION_NAME" /></translation>
@@ -5085,6 +5097,7 @@
 <translation id="6468485451923838994">Fonts</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> files</translation>
 <translation id="6469557521904094793">Turn on mobile network</translation>
+<translation id="6470823736074966819">Mute notifications</translation>
 <translation id="6472893788822429178">Show Home button</translation>
 <translation id="6474498546677193336">Couldn't unshare because an application is using this folder. The folder will be unshared when Linux is next shut down.</translation>
 <translation id="6474884162850599008">Disconnect Google Drive account</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index b769755..0b07d56e 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -4253,6 +4253,7 @@
 <translation id="5565735124758917034">Activo</translation>
 <translation id="5567989639534621706">Cachés de aplicación</translation>
 <translation id="5568069709869097550">No puedo acceder</translation>
+<translation id="5571092938913434726">Controles generales de contenido multimedia</translation>
 <translation id="5571832155627049070">Personaliza tu perfil</translation>
 <translation id="5572851009514199876">Abre Chrome y accede a tu cuenta para que el programa pueda comprobar si puedes acceder a este sitio.</translation>
 <translation id="5575473780076478375">Extensión de incógnito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 4ce5ee9..0129d43f 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -4255,6 +4255,7 @@
 <translation id="5565735124758917034">Activo</translation>
 <translation id="5567989639534621706">Cachés de aplicación</translation>
 <translation id="5568069709869097550">No puedo iniciar sesión</translation>
+<translation id="5571092938913434726">Controles multimedia globales</translation>
 <translation id="5571832155627049070">Personaliza tu perfil</translation>
 <translation id="5572851009514199876">Abre Chrome e inicia sesión en el navegador para que compruebe si tienes permiso para acceder a este sitio web.</translation>
 <translation id="5575473780076478375">Extensión de incógnito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index cc070f9..64384486 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -101,6 +101,7 @@
 <translation id="1103523840287552314">Tõlgi alati: <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Peata</translation>
 <translation id="1110155001042129815">Oota</translation>
+<translation id="1111781754511998498">Projektor</translation>
 <translation id="1112420131909513020">Taustal töötav rakendus kasutab Bluetoothi</translation>
 <translation id="1113892970288677790">Valige kureeritud kujundused ja pildid</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -534,6 +535,7 @@
 <translation id="156793199942386351"><ph name="CURRENTKEY" /> on juba määratud toimingu „<ph name="ACTION" />” jaoks. Vajutage ükskõik millist klahvi, et <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">JavaScripti konsool</translation>
 <translation id="1568323446248056064">Kuvaseadme seadete avamine</translation>
+<translation id="1570604804919108255">Tühista märguannete summutus</translation>
 <translation id="1571738973904005196">Kuva vaheleht: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (Külaline)</translation>
 <translation id="1572266655485775982">WiFi lubamine</translation>
@@ -591,6 +593,7 @@
 <translation id="1621485112342885423">Teie ostukorvid</translation>
 <translation id="1621729191093924223">Mikrofoni vajavad funktsioonid ei tööta</translation>
 <translation id="1621831347985899379">Seadme <ph name="DEVICE_TYPE" /> andmed kustutatakse</translation>
+<translation id="1621984899599015181">Jagamisvalikuid haldab teie organisatsioon. Mõni üksus võib olla peidetud.</translation>
 <translation id="1622054403950683339">WiFi-võrgu unustamine</translation>
 <translation id="1623132449929929218">Pildid ei ole praegu saadaval. Taustapiltide kogude vaatamiseks looge uuesti Interneti-ühendus.</translation>
 <translation id="1623723619460186680">Sinise valguse vähendamine</translation>
@@ -828,6 +831,7 @@
 <translation id="1850508293116537636">Pööra &amp;päripäeva</translation>
 <translation id="1852141627593563189">Otsi kahjulikku tarkvara</translation>
 <translation id="1852799913675865625">Ilmnes viga, kui proovisite lugeda faili: <ph name="ERROR_TEXT" /></translation>
+<translation id="1854049213067042715">Jätkake sealt, kus pooleli jäite. Seadetes saate seadistada rakenduste taastamise käivitamisel või taastamise välja lülitada.</translation>
 <translation id="1854180393107901205">Peata ülekandmine</translation>
 <translation id="1855079636134697549">Kaamera on sisse lülitatud</translation>
 <translation id="1856715684130786728">Lisa asukoht ...</translation>
@@ -956,6 +960,7 @@
 <translation id="1989113344093894667">Ei saa sisu jäädvustada</translation>
 <translation id="1990046457226896323">Kõnefailid laaditi alla</translation>
 <translation id="1990512225220753005">Ära kuva sellel lehel otseteid</translation>
+<translation id="199191324030140441">Režiimi Mitte segada väljalülitamine</translation>
 <translation id="1992397118740194946">Pole määratud</translation>
 <translation id="1992924914582925289">Eemalda seadmest</translation>
 <translation id="1994173015038366702">Saidi URL</translation>
@@ -997,6 +1002,7 @@
 
 Selle konto seadete haldamiseks installige oma seadmesse Family Link.  Saatsime teile meili teel juhised.</translation>
 <translation id="2040460856718599782">Vabandust! Teie autentimisel läks midagi valesti. Kontrollige veel kord sisselogimise mandaate ja proovige uuesti.</translation>
+<translation id="2040894699575719559">Asukoht on blokeeritud</translation>
 <translation id="2042279886444479655">Aktiivsed profiilid</translation>
 <translation id="2044014337866019681">Seansi avamiseks veenduge, et kinnitaksite konto <ph name="ACCOUNT" />.</translation>
 <translation id="204497730941176055">Microsofti sertifikaadi malli nimi</translation>
@@ -1483,6 +1489,7 @@
 <translation id="2527167509808613699">Igat laadi ühendus</translation>
 <translation id="2530166226437958497">Veaotsing</translation>
 <translation id="2532589005999780174">Suure kontrastsusega režiim</translation>
+<translation id="2533649878691950253">Sellele saidile blokeeriti teie täpse asukoha nägemine, kuna tavaliselt te ei luba seda</translation>
 <translation id="253434972992662860">&amp;Peata</translation>
 <translation id="253557089021624350">Säilitamise loend</translation>
 <translation id="2535799430745250929">Mobiilsidevõrku ei ole</translation>
@@ -1670,6 +1677,7 @@
 <translation id="2738771556149464852">Mitte pärast</translation>
 <translation id="2739191690716947896">Silu</translation>
 <translation id="2739240477418971307">Juurdepääsetavuse seadete muutmine</translation>
+<translation id="2739965161385757621">Kuva minu seaded</translation>
 <translation id="274029851662193272">Lohkus</translation>
 <translation id="2740531572673183784">Ok</translation>
 <translation id="2741713322780029189">Ava taasteterminal</translation>
@@ -1794,6 +1802,7 @@
 <translation id="2864601841139725659">Profiilipildi määramine</translation>
 <translation id="2865919525181940183">Ekraanipilt programmidest, mis on praegu ekraanil kuvatud</translation>
 <translation id="286674810810214575">Toiteallikate kontrollimine …</translation>
+<translation id="2866876751734765554">Privaatsusseadete ülevaatamine</translation>
 <translation id="2867768963760577682">Ava kinnitatud vahelehel</translation>
 <translation id="2868746137289129307">See laiendus on aegunud ja ettevõtte reeglitega keelatud. Kui uuem versioon muutub kättesaadavaks, siis võidakse see automaatselt lubada.</translation>
 <translation id="2870560284913253234">Sait</translation>
@@ -2323,6 +2332,7 @@
 <translation id="3446274660183028131">Käivitage Windowsi installimiseks Parallels Desktop.</translation>
 <translation id="344630545793878684">Lugege oma andmeid mitmel veebisaidil</translation>
 <translation id="3446650212859500694">See fail sisaldab tundlikku sisu</translation>
+<translation id="3446827946208017735">Vaadake ühes kohas üle kõige kriitilisemad privaatsusseaded ja tehke need endale selgeks</translation>
 <translation id="3448086340637592206">Google Chrome'i ja Chrome OS-i lisatingimused</translation>
 <translation id="3448492834076427715">Värskenda kontot</translation>
 <translation id="3449393517661170867">Uus vahelehestatud aken</translation>
@@ -3752,6 +3762,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Üksuse <ph name="VM_TYPE" /> virtuaalmasinaid ei leitud}=1{Leiti 1 üksuse <ph name="VM_TYPE" /> virtuaalmasin: <ph name="VM_NAME_LIST" />}other{Leiti {NUM_VMS} üksuse <ph name="VM_TYPE" /> virtuaalmasinat: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Interneti-ühendus puudub.</translation>
 <translation id="4998430619171209993">Sees</translation>
+<translation id="4999804342505941663">Lülita režiim Mitte segada sisse</translation>
 <translation id="5000922062037820727">Blokeeritud (soovitatav)</translation>
 <translation id="5005498671520578047">Parooli kopeerimine</translation>
 <translation id="5006218871145547804">Crostini Androidi rakenduse ADB</translation>
@@ -4262,6 +4273,7 @@
 <translation id="5565735124758917034">Aktiivne</translation>
 <translation id="5567989639534621706">Rakenduste vahemälud</translation>
 <translation id="5568069709869097550">Ei saa sisse logida</translation>
+<translation id="5571092938913434726">Üldised meedia juhtelemendid</translation>
 <translation id="5571832155627049070">Profiili kohandamine</translation>
 <translation id="5572851009514199876">Alustage ja logige Chrome'i sisse, et Chrome saaks kontrollida, kas teil on luba sellele saidile juurdepääsemiseks.</translation>
 <translation id="5575473780076478375">Inkognito laiendus: <ph name="EXTENSION_NAME" /></translation>
@@ -5075,6 +5087,7 @@
 <translation id="6468485451923838994">Fondid</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> faili</translation>
 <translation id="6469557521904094793">Mobiilsidevõrgu sisselülitamine</translation>
+<translation id="6470823736074966819">Summuta märguanded</translation>
 <translation id="6472893788822429178">Kuva nupp Avaleht</translation>
 <translation id="6474498546677193336">Jagamist ei saanud lõpetada, kuna rakendus kasutab seda kausta. Kausta jagamine lõpetatakse Linuxi väljalülitamisel.</translation>
 <translation id="6474884162850599008">Google Drive'i konto ühenduse katkestamine</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index db21a29..94a284f 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -4255,6 +4255,7 @@
 <translation id="5565735124758917034">Aktibo</translation>
 <translation id="5567989639534621706">Aplikazio-cacheak</translation>
 <translation id="5568069709869097550">Ezin da hasi saioa</translation>
+<translation id="5571092938913434726">Multimedia-edukia kontrolatzeko aukera orokorrak</translation>
 <translation id="5571832155627049070">Pertsonalizatu profila</translation>
 <translation id="5572851009514199876">Ireki Chrome eta hasi saioa Chrome-k webgune hau atzitzeko baimena duzula egiazta dezan.</translation>
 <translation id="5575473780076478375">Ezkutuko luzapena: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 61555504..276ce72 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4269,6 +4269,7 @@
 <translation id="5565735124758917034">فعال</translation>
 <translation id="5567989639534621706">حافظه‌های پنهان برنامه</translation>
 <translation id="5568069709869097550">ورود به سیستم ممکن نیست</translation>
+<translation id="5571092938913434726">کنترل‌های رسانه جهانی</translation>
 <translation id="5571832155627049070">سفارشی کردن نمایه</translation>
 <translation id="5572851009514199876">‏لطفاً Chrome را باز کنید و به سیستم آن وارد شوید تا Chrome بتواند بررسی کند آیا مجاز به دسترسی به این سایت هستید یا خیر.</translation>
 <translation id="5575473780076478375">افزونه ناشناس: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index cb5e6ac..c3b9427 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4268,6 +4268,7 @@
 <translation id="5565735124758917034">Aktiivinen</translation>
 <translation id="5567989639534621706">Sovellusvälimuistit</translation>
 <translation id="5568069709869097550">Ei voi kirjautua sisään</translation>
+<translation id="5571092938913434726">Yleiset mediaohjaimet</translation>
 <translation id="5571832155627049070">Muokkaa profiiliasi</translation>
 <translation id="5572851009514199876">Aloita ja kirjaudu sisään, jotta Chrome voi tarkistaa, onko sinulla oikeus käyttää tätä sivustoa.</translation>
 <translation id="5575473780076478375">Incognito-laajennus: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 104ec10..523bf0d8 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -4273,6 +4273,7 @@
 <translation id="5565735124758917034">Aktibo</translation>
 <translation id="5567989639534621706">Mga cache ng application</translation>
 <translation id="5568069709869097550">Hindi makapag-sign in</translation>
+<translation id="5571092938913434726">Mga Kontrol ng Pangkalahatang Media</translation>
 <translation id="5571832155627049070">I-customize ang iyong profile</translation>
 <translation id="5572851009514199876">Magsimula at mag-sign in sa Chrome upang masuri ng Chrome kung pinapayagan kang i-access ang site na ito.</translation>
 <translation id="5575473780076478375">Extension ng Incognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 6601fa2..dbe8954 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -4258,6 +4258,7 @@
 <translation id="5565735124758917034">Actif</translation>
 <translation id="5567989639534621706">Caches des applications</translation>
 <translation id="5568069709869097550">Impossible de se connecter</translation>
+<translation id="5571092938913434726">Commandes multimédias générales</translation>
 <translation id="5571832155627049070">Personnaliser votre profil</translation>
 <translation id="5572851009514199876">Veuillez démarrer Chrome et vous connecter pour que Chrome puisse vérifier si vous pouvez accéder à ce site.</translation>
 <translation id="5575473780076478375">Extension en mode de navigation privée : <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index df1ab33..5f23a54 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -4257,6 +4257,7 @@
 <translation id="5565735124758917034">Actif</translation>
 <translation id="5567989639534621706">Caches des applications</translation>
 <translation id="5568069709869097550">Impossible de se connecter</translation>
+<translation id="5571092938913434726">Contrôles multimédias généraux</translation>
 <translation id="5571832155627049070">Personnalisez votre profil</translation>
 <translation id="5572851009514199876">Veuillez démarrer Chrome et vous connecter à votre compte pour que le navigateur puisse vérifier que vous êtes autorisé à accéder à ce site.</translation>
 <translation id="5575473780076478375">Extension en mode navigation privée :<ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index e5937dd..cba58a8 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -443,6 +443,7 @@
 <translation id="1476088332184200792">Copiar no teu dispositivo</translation>
 <translation id="1476607407192946488">&amp;Configuración de idioma</translation>
 <translation id="1477446329585670721"><ph name="DOMAIN" /> require que manteñas a tarxeta intelixente inserida.</translation>
+<translation id="1477654881618305065">A túa organización non che permite compartir este contido. Se precisas axuda, ponte en contacto co teu administrador.</translation>
 <translation id="1478340334823509079">Detalles: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">A instalación non está activada</translation>
 <translation id="1480571698637441426">Se queres obter respostas personalizadas cando fagas preguntas, permite que o teu Asistente acceda a unha captura da túa pantalla. É posible que tamén use a información das cancións ou dos vídeos que se estean reproducindo.</translation>
@@ -617,6 +618,7 @@
 <translation id="1643921258693943800">Para utilizar Compartir por Nearby, activa o Bluetooth e a wifi</translation>
 <translation id="1644574205037202324">Historial</translation>
 <translation id="1645516838734033527">Para manter o <ph name="DEVICE_TYPE" /> seguro, Smart Lock require que o teléfono teña activado un bloqueo de pantalla.</translation>
+<translation id="1646793251510634025">Revisa a configuración para optimizar a busca e a navegación</translation>
 <translation id="1646982517418478057">Introduce un contrasinal para encriptar este certificado</translation>
 <translation id="1648528859488547844">Utilizar a wifi ou as redes de telefonía móbil para determinar a localización</translation>
 <translation id="164936512206786300">Desvincular dispositivo Bluetooth</translation>
@@ -1460,6 +1462,7 @@
 <translation id="2514326558286966059">Desbloquea o dispositivo máis rápido coa impresión dixital</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">Asignar acción a un interruptor máis</translation>
+<translation id="251722524540674480">Confirma o teu nome de usuario</translation>
 <translation id="2517472476991765520">Buscar</translation>
 <translation id="2518024842978892609">Usar os teus certificados de cliente</translation>
 <translation id="2519517390894391510">Nome do perfil do certificado</translation>
@@ -2163,6 +2166,7 @@
 <translation id="3288047731229977326">As extensións que se executan no modo de programador poden danar o ordenador. Se non es programador, deberás desactivar estas extensións que se executan no modo de programador para permanecer seguro.</translation>
 <translation id="3289668031376215426">Usar maiúsculas automaticamente</translation>
 <translation id="3289856944988573801">Para consultar se hai actualizacións, utiliza unha Ethernet ou unha wifi.</translation>
+<translation id="3291436823898732747">Melloras na navegación (por exemplo, suxestións en Omnibox antes de comezar a escribir a busca)</translation>
 <translation id="3293644607209440645">Enviar esta páxina</translation>
 <translation id="32939749466444286">O contedor de Linux non se iniciou. Téntao de novo.</translation>
 <translation id="3294437725009624529">Invitado</translation>
@@ -3668,7 +3672,7 @@
 <translation id="4918021164741308375"><ph name="ORIGIN" /> quere comunicarse coa extensión "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Aceptar</translation>
 <translation id="4921290200821452703">Información para os pais sobre contas de centro educativo</translation>
-<translation id="4921348630401250116">Síntese de voz</translation>
+<translation id="4921348630401250116">Conversión de texto a voz</translation>
 <translation id="4921809350408880559">Estás vendo documentos recentes e suxestións de ficheiros segundo a actividade que realizaches anteriormente en Google Drive.
         <ph name="BREAK" />
 <ph name="BREAK" />
@@ -3777,7 +3781,7 @@
 <translation id="5045550434625856497">Contrasinal incorrecto</translation>
 <translation id="504561833207953641">Abrindo nunha sesión xa aberta do navegador.</translation>
 <translation id="5047421709274785093">Impedir que os sitios utilicen sensores de movemento e de luz</translation>
-<translation id="5050330054928994520">Síntese de voz</translation>
+<translation id="5050330054928994520">Texto a voz</translation>
 <translation id="5051836348807686060">O corrector ortográfico non é compatible cos idiomas que seleccionaches</translation>
 <translation id="5052499409147950210">Editar sitio</translation>
 <translation id="505347685865235222">Grupo sen nome: <ph name="GROUP_CONTENT_STRING" /></translation>
@@ -4197,6 +4201,7 @@
 <translation id="5505307013568720083">Non hai tinta</translation>
 <translation id="5505794066310932198">Activar/desactivar comandante</translation>
 <translation id="5507756662695126555">Sen rexeitamento</translation>
+<translation id="5507795078844206688">O URL das páxinas que visitas (por exemplo, https://www.google.com)</translation>
 <translation id="5509693895992845810">Gardar &amp;como...</translation>
 <translation id="5509914365760201064">Emisor: <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">Obter descricións de Google para as imaxes</translation>
@@ -4249,6 +4254,7 @@
 <translation id="5565735124758917034">Activo</translation>
 <translation id="5567989639534621706">Memorias caché das aplicacións</translation>
 <translation id="5568069709869097550">Non se pode iniciar sesión</translation>
+<translation id="5571092938913434726">Controis multimedia globais</translation>
 <translation id="5571832155627049070">Personaliza o teu perfil</translation>
 <translation id="5572851009514199876">Abre Chrome e inicia sesión para que o navegador poida comprobar se tes permiso para acceder a este sitio.</translation>
 <translation id="5575473780076478375">Extensión do modo de incógnito: <ph name="EXTENSION_NAME" /></translation>
@@ -4513,6 +4519,7 @@
 <translation id="5869522115854928033">Contrasinais gardados</translation>
 <translation id="5870086504539785141">Pechar menú de accesibilidade</translation>
 <translation id="5870155679953074650">Erros graves</translation>
+<translation id="5875534259258494936">Deixouse de compartir a pantalla</translation>
 <translation id="5876576639916258720">En execución…</translation>
 <translation id="5876851302954717356">Nova pestana á dereita</translation>
 <translation id="5877064549588274448">Canle cambiada. Reinicia o dispositivo para aplicar os cambios.</translation>
@@ -5372,6 +5379,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> non se pode executar como raíz.</translation>
 <translation id="6812841287760418429">Manter os cambios</translation>
 <translation id="6813907279658683733">Pantalla completa</translation>
+<translation id="6814033694018386318">Que compartes con Google?</translation>
 <translation id="6817174620439930047">Preguntar cando un sitio queira utilizar mensaxes exclusivas do sistema para acceder aos dispositivos MIDI (recomendado)</translation>
 <translation id="6818198425579322765">Idioma da páxina que se quere traducir</translation>
 <translation id="6818802132960437751">Protección antivirus integrada</translation>
@@ -5867,6 +5875,7 @@
 <translation id="7374376573160927383">Xestionar dispositivos USB</translation>
 <translation id="7374461526650987610">Controladores de protocolo</translation>
 <translation id="7375235221357833624">{0,plural, =1{Actualiza o dispositivo en 1 hora}other{Actualiza o dispositivo en # horas}}</translation>
+<translation id="7376543451826039186">Unha navegación máis rápida (por exemplo, cárganse de forma proactiva determinados contidos adicionais sobre a base da páxina en que te atopas)</translation>
 <translation id="7376553024552204454">Destacar o cursor do rato cando se move</translation>
 <translation id="737728204345822099">Conservarase un rexistro da túa visita a este sitio na túa chave de seguranza</translation>
 <translation id="7377451353532943397">Continuar bloqueando o acceso aos sensores</translation>
@@ -5924,6 +5933,7 @@
 <translation id="7427798576651127129">Chamada de <ph name="DEVICE_NAME" /></translation>
 <translation id="7431719494109538750">Non se encontraron dispositivos de interface humana</translation>
 <translation id="7431991332293347422">Controla como se utiliza o historial de navegación para personalizar a Busca e moito máis</translation>
+<translation id="7432200167665670017">O teu administrador bloqueou "<ph name="EXTENSION_NAME" />" (código de identificación da aplicación: <ph name="EXTENSION_ID" />)</translation>
 <translation id="7433708794692032816">Para seguir usando o teu dispositivo (<ph name="DEVICE_TYPE" />), insire a tarxeta intelixente</translation>
 <translation id="7433957986129316853">Conservar cambios</translation>
 <translation id="7434509671034404296">Programador</translation>
@@ -5953,6 +5963,7 @@
 <translation id="7460045493116006516">Tema que tes instalado actualmente</translation>
 <translation id="7461924472993315131">Marcar cun alfinete</translation>
 <translation id="746216226901520237">A próxima vez, o teléfono desbloqueará o teu <ph name="DEVICE_TYPE" />. Podes desactivar Smart Lock en Configuración.</translation>
+<translation id="7464637891177137294">Gárdao na túa Conta de Google, <ph name="ACCOUNT" /></translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# pestana aberta, preme o botón para activar/desactivar a franxa de pestanas}other{# pestanas abertas, preme o botón para activar/desactivar a franxa de pestanas}}</translation>
 <translation id="7465635034594602553">Produciuse un erro. Agarda uns poucos minutos e executa <ph name="APP_NAME" /> de novo.</translation>
 <translation id="7465778193084373987">URL de revogación do certificado de Netscape</translation>
@@ -6016,6 +6027,7 @@
 <translation id="7525625923260515951">Escoita o texto seleccionado</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 máis}other{{NUM_DOWNLOADS} máis}}</translation>
 <translation id="7526989658317409655">Marcador de posición</translation>
+<translation id="7527758104894292229">Actualízao na túa Conta de Google, <ph name="ACCOUNT" /></translation>
 <translation id="7529411698175791732">Comproba a túa conexión a Internet. Se o problema continúa, tenta pechar sesión e volver iniciala.</translation>
 <translation id="7529876053219658589">{0,plural, =1{Pechar ventá da sesión de convidado}other{Pechar ventás da sesión de convidado}}</translation>
 <translation id="7530016656428373557">Índice de descarga en watts</translation>
@@ -6402,6 +6414,7 @@
 <translation id="7898725031477653577">Traducir sempre</translation>
 <translation id="790040513076446191">Manipular configuración relacionada coa privacidade</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
+<translation id="7901914889562552258">Melloras en Chrome grazas a distintas métricas das páxinas</translation>
 <translation id="7903345046358933331">A páxina deixou de responder. Podes esperar a que volva responder ou ben podes pechala.</translation>
 <translation id="7903742244674067440">Tes certificados arquivados que identifican estas entidades de certificación</translation>
 <translation id="7903859912536385558">estable (probador de confianza)</translation>
@@ -6867,6 +6880,7 @@
 <translation id="8392364544846746346">Preguntar cando un sitio queira modificar ficheiros ou cartafoles do teu dispositivo</translation>
 <translation id="8392451568018454956">Menú de opcións para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Deter o plugin</translation>
+<translation id="839363317075970734">Detalles do dispositivo Bluetooth</translation>
 <translation id="8393700583063109961">Enviar mensaxe</translation>
 <translation id="8397825320644530257">Desconectar teléfono conectado</translation>
 <translation id="8398877366907290961">Continuar igualmente</translation>
@@ -7117,6 +7131,7 @@
 <translation id="8681614230122836773">Chrome atopou software daniño no teu ordenador</translation>
 <translation id="8682730193597992579">A impresora <ph name="PRINTER_NAME" /> está conectada e lista</translation>
 <translation id="8683081248374354009">Restablecer grupo</translation>
+<translation id="8683526617475118045">Que consegues?</translation>
 <translation id="8688672835843460752">Dispoñible</translation>
 <translation id="8690129572193755009">Os sitios poden pediche permiso para xestionar protocolos</translation>
 <translation id="8695139659682234808">Engadir controis parentais despois da configuración</translation>
@@ -7170,6 +7185,7 @@
 <translation id="8737685506611670901">Abrir ligazóns de <ph name="PROTOCOL" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Elixir idioma ao que se traducirá a páxina</translation>
+<translation id="8737916108453753541">Os URL compártense con Google para entender o comportamento de navegación</translation>
 <translation id="8740247629089392745">Podes entregar este Chromebook a <ph name="SUPERVISED_USER_NAME" />. A configuración case rematou, polo que é momento de explorar contido.</translation>
 <translation id="8741944563400125534">Guía de configuración de Acceso con interruptores</translation>
 <translation id="8742998548129056176">Trátase de información xeral acerca do teu dispositivo e do seu uso, como o nivel de batería, a actividade das aplicacións e do sistema, e os erros. Os datos utilizaranse coa finalidade de mellorar Android e algunha información agregada tamén axudará ás aplicacións de Google e aos socios, como os programadores de Android, a mellorar as súas aplicacións e produtos.</translation>
@@ -7498,7 +7514,7 @@
 <ph name="BREAK" />
 <ph name="BREAK" />
 Consulta máis información sobre os datos que recompila Google e por que o fai en <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation>
-<translation id="9066782832737749352">Síntese de voz</translation>
+<translation id="9066782832737749352">Texto a voz</translation>
 <translation id="9068878141610261315">O tipo de ficheiro non é compatible</translation>
 <translation id="9070342919388027491">A pestana moveuse á esquerda</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 23c7e96b..9eba451 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4249,6 +4249,7 @@
 <translation id="5565735124758917034">સક્રિય</translation>
 <translation id="5567989639534621706">ઍપ્લિકેશન કૅશેસ</translation>
 <translation id="5568069709869097550">સાઇન ઇન કરી શકાતું નથી</translation>
+<translation id="5571092938913434726">વૈશ્વિક મીડિયા નિયંત્રણો</translation>
 <translation id="5571832155627049070">તમારી પ્રોફાઇલ કસ્ટમાઇઝ કરો</translation>
 <translation id="5572851009514199876">કૃપા કરીને Chrome ને પ્રારંભ કરો અને સાઇન ઇન કરો જેથી કરીને Chrome તપાસી શકે કે તમને આ સાઇટની ઍક્સેસની મંજૂરી છે કે કેમ.</translation>
 <translation id="5575473780076478375">છુપું એક્સ્ટેંશન: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index f6601b1..00374fb 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -4271,6 +4271,7 @@
 <translation id="5565735124758917034">सक्रिय</translation>
 <translation id="5567989639534621706">ऐप्स  संचय</translation>
 <translation id="5568069709869097550">साइन इन नहीं किया जा सकता</translation>
+<translation id="5571092938913434726">ग्लोबल मीडिया कंट्रोल</translation>
 <translation id="5571832155627049070">अपनी प्रोफ़ाइल को पसंद के मुताबिक बनाएं</translation>
 <translation id="5572851009514199876">कृपया Chrome शुरू करके उसमें साइन इन करें ताकि Chrome देख सके कि क्या आपके पास यह साइट एक्सेस करने की अनुमति है.</translation>
 <translation id="5575473780076478375">गुप्‍त एक्सटेंशन: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 1305d97..e3f5104 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314">Uvijek prevedi <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Stop (Zaustavi)</translation>
 <translation id="1110155001042129815">Čekaj</translation>
+<translation id="1111781754511998498">Projektor</translation>
 <translation id="1112420131909513020">Pozadinska kartica upotrebljava Bluetooth</translation>
 <translation id="1113892970288677790">Odaberite birana umjetnička djela i slike</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -532,6 +533,7 @@
 <translation id="156793199942386351">Tipka <ph name="CURRENTKEY" /> već je dodijeljena radnji <ph name="ACTION" />. Pritisnite bilo koju tipku za <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Konzola JavaScripta</translation>
 <translation id="1568323446248056064">Otvorite postavke zaslona na uređaju</translation>
+<translation id="1570604804919108255">Uključi zvuk obavijesti</translation>
 <translation id="1571738973904005196">Prikaži karticu: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (Gost)</translation>
 <translation id="1572266655485775982">Omogućivanje Wi-Fija</translation>
@@ -589,6 +591,7 @@
 <translation id="1621485112342885423">Vaše košarice</translation>
 <translation id="1621729191093924223">Značajke kojima je potreban mikrofon neće raditi</translation>
 <translation id="1621831347985899379">Izbrisat će se podaci uređaja <ph name="DEVICE_TYPE" /></translation>
+<translation id="1621984899599015181">Opcijama za dijeljenje upravlja vaša organizacija. Neke su stavke možda skrivene.</translation>
 <translation id="1622054403950683339">Zaboravljanje Wi-Fi mreže</translation>
 <translation id="1623132449929929218">Slike trenutačno nisu dostupne. Ponovo se povežite s internetom da biste pregledali zbirke pozadina.</translation>
 <translation id="1623723619460186680">Redukcija plavog svjetla</translation>
@@ -826,6 +829,7 @@
 <translation id="1850508293116537636">Zakreni u &amp;smjeru kretanja kazaljke na satu</translation>
 <translation id="1852141627593563189">Pronađi štetni softver</translation>
 <translation id="1852799913675865625">Došlo je do pogreške pri pokušaju čitanja datoteke: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Nastavite tamo gdje ste stali. U postavkama možete postaviti aplikacije tako da se uvijek vrati prilikom pokretanja ili isključite vraćanje.</translation>
 <translation id="1854180393107901205">Zaustavi emitiranje</translation>
 <translation id="1855079636134697549">Kamera je uključena</translation>
 <translation id="1856715684130786728">Dodaj lokaciju...</translation>
@@ -954,6 +958,7 @@
 <translation id="1989113344093894667">Snimanje sadržaja nije moguće</translation>
 <translation id="1990046457226896323">Govorne datoteke su preuzete</translation>
 <translation id="1990512225220753005">Nemoj prikazivati prečace na ovoj stranici</translation>
+<translation id="199191324030140441">Isključivanje načina Ne uznemiravaj</translation>
 <translation id="1992397118740194946">Nije postavljeno</translation>
 <translation id="1992924914582925289">Ukloni s uređaja</translation>
 <translation id="1994173015038366702">URL web-lokacije</translation>
@@ -995,6 +1000,7 @@
 
 Postavkama računa možete upravljati tako da instalirate aplikaciju Family Link na svom uređaju.  Poslali smo vam e-poruku s uputama.</translation>
 <translation id="2040460856718599782">Ups! Nešto nije u redu s vašom autentifikacijom. Još jedanput provjerite svoje vjerodajnice za prijavu i pokušajte ponovo.</translation>
+<translation id="2040894699575719559">Lokacija je blokirana</translation>
 <translation id="2042279886444479655">Aktivni profili</translation>
 <translation id="2044014337866019681">Provjerite potvrđujete li račun <ph name="ACCOUNT" /> da biste otključali sesiju.</translation>
 <translation id="204497730941176055">Naziv predloška Microsoftovog certifikata</translation>
@@ -1479,6 +1485,7 @@
 <translation id="2527167509808613699">Bilo koja vrsta veze</translation>
 <translation id="2530166226437958497">Rješavanje problema</translation>
 <translation id="2532589005999780174">Način visokog kontrasta</translation>
+<translation id="2533649878691950253">Web-lokaciji je blokiran pristup vašoj točnoj lokaciji jer to obično ne dopuštate</translation>
 <translation id="253434972992662860">&amp;Pauziraj</translation>
 <translation id="253557089021624350">Broj aktivnosti održavanja</translation>
 <translation id="2535799430745250929">Ne postoji nijedna mobilna mreža</translation>
@@ -1666,6 +1673,7 @@
 <translation id="2738771556149464852">Ne nakon</translation>
 <translation id="2739191690716947896">Otkloni pogrešku</translation>
 <translation id="2739240477418971307">promijeniti postavke pristupačnosti</translation>
+<translation id="2739965161385757621">Pregled postavki</translation>
 <translation id="274029851662193272">Utisnuto</translation>
 <translation id="2740531572673183784">U redu</translation>
 <translation id="2741713322780029189">Otvorite terminal za oporavak</translation>
@@ -1790,6 +1798,7 @@
 <translation id="2864601841139725659">Postavite profilnu sliku</translation>
 <translation id="2865919525181940183">Snimka zaslona programa koji su trenutačno na zaslonu</translation>
 <translation id="286674810810214575">Provjera izvora napajanja...</translation>
+<translation id="2866876751734765554">Pregled privatnosti</translation>
 <translation id="2867768963760577682">Otvori kao prikvačenu karticu</translation>
 <translation id="2868746137289129307">Proširenje je zastarjelo, pa su ga pravila tvrtke onemogućila. Možda će se automatski omogućiti kada postane dostupna novija verzija.</translation>
 <translation id="2870560284913253234">Web lokacija</translation>
@@ -2319,6 +2328,7 @@
 <translation id="3446274660183028131">Pokrenite Parallels Desktop da biste instalirali Windows.</translation>
 <translation id="344630545793878684">čitati vaše podatke s raznih web-lokacija</translation>
 <translation id="3446650212859500694">Ova datoteka ima osjetljiv sadržaj</translation>
+<translation id="3446827946208017735">Objašnjenje i pregled najkritičnijih postavki privatnosti na jednom mjestu</translation>
 <translation id="3448086340637592206">Dodatni uvjeti za Google Chrome i OS Chrome</translation>
 <translation id="3448492834076427715">Ažuriraj račun</translation>
 <translation id="3449393517661170867">Novi prozor s karticama</translation>
@@ -3748,6 +3758,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Nije pronađen nijedan <ph name="VM_TYPE" /> VM}=1{Pronađen je jedan <ph name="VM_TYPE" /> VM: <ph name="VM_NAME_LIST" />}one{Pronađen je {NUM_VMS} <ph name="VM_TYPE" /> VM: <ph name="VM_NAME_LIST" />}few{Pronađena su {NUM_VMS} <ph name="VM_TYPE" /> VM-a: <ph name="VM_NAME_LIST" />}other{Pronađeno je {NUM_VMS} <ph name="VM_TYPE" /> VM-ova: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Nema internetske veze.</translation>
 <translation id="4998430619171209993">Uključeno</translation>
+<translation id="4999804342505941663">Uključi opciju Ne uznemiravaj</translation>
 <translation id="5000922062037820727">Blokirano (preporučeno)</translation>
 <translation id="5005498671520578047">Kopiranje zaporke</translation>
 <translation id="5006218871145547804">Crostinijev ADB za Android aplikacije</translation>
@@ -4258,6 +4269,7 @@
 <translation id="5565735124758917034">Aktivno</translation>
 <translation id="5567989639534621706">Predmemorije aplikacije</translation>
 <translation id="5568069709869097550">Ne mogu se prijaviti</translation>
+<translation id="5571092938913434726">Globalne medijske kontrole</translation>
 <translation id="5571832155627049070">Prilagodite svoj profil</translation>
 <translation id="5572851009514199876">Pokrenite Chrome i prijavite se na njega kako bi mogao provjeriti imate li dopuštenje za pristup toj web-lokaciji.</translation>
 <translation id="5575473780076478375">Anonimno proširenje: <ph name="EXTENSION_NAME" /></translation>
@@ -5071,6 +5083,7 @@
 <translation id="6468485451923838994">Fontovi</translation>
 <translation id="6468773105221177474">Datoteka: <ph name="FILE_COUNT" /></translation>
 <translation id="6469557521904094793">Uključivanje mobilne mreže</translation>
+<translation id="6470823736074966819">Zanemari obavijesti</translation>
 <translation id="6472893788822429178">Pokaži gumb početne stranice</translation>
 <translation id="6474498546677193336">Prekid dijeljenja nije bio moguć jer jedna aplikacija koristi tu mapu. Dijeljenje mape prekinut će se kad se Linux isključi.</translation>
 <translation id="6474884162850599008">Prekini vezu računa Google diska</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 854bed8a..51631cb 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4270,6 +4270,7 @@
 <translation id="5565735124758917034">Aktív</translation>
 <translation id="5567989639534621706">Alkalmazás-gyorsítótárak</translation>
 <translation id="5568069709869097550">Nem sikerült a bejelentkezés</translation>
+<translation id="5571092938913434726">Globális médiavezérlők</translation>
 <translation id="5571832155627049070">Profil személyre szabása</translation>
 <translation id="5572851009514199876">Indítsa el a Chrome böngészőt és jelentkezzen be, hogy a Chrome ellenőrizni tudja, engedélyezték-e a hozzáférést ehhez a webhelyhez.</translation>
 <translation id="5575473780076478375">Inkognitó mód bővítmény: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 20de5b2..be6c27be 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -445,6 +445,7 @@
 <translation id="1476088332184200792">Պատճենել սարքում</translation>
 <translation id="1476607407192946488">&amp;Լեզվի կարգավորումներ</translation>
 <translation id="1477446329585670721">Համաձայն <ph name="DOMAIN" /> տիրույթի կանոնների՝ խելացի քարտը պետք է տեղադրված լինի։</translation>
+<translation id="1477654881618305065">Ձեր կազմակերպությունում արգելված է կիսվել այս բովանդակությամբ։ Եթե օգնության կարիք ունեք, դիմեք ադմինիստրատորին։</translation>
 <translation id="1478340334823509079">Մանրամասներ` <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Տեղադրում չի թույլատրվում</translation>
 <translation id="1480571698637441426">Անհատականացված պատասխաններ ստանալու համար թույլատրեք Օգնականին օգտագործել ձեր էկրանի սքրինշոթը, այդ թվում՝ նվագարկվող երգերի և տեսանյութերի մասին տվյալները։</translation>
@@ -620,6 +621,7 @@
 <translation id="1643921258693943800">«Փոխանակում մոտակա սարքերի հետ» գործառույթն օգտագործելու համար միացրեք Bluetooth-ն ու Wi-Fi-ը</translation>
 <translation id="1644574205037202324">Պատմություն</translation>
 <translation id="1645516838734033527"><ph name="DEVICE_TYPE" /> սարքը Smart Lock-ի միջոցով պաշտպանելու համար հեռախոսում միացրեք էկրանի կողպումը։</translation>
+<translation id="1646793251510634025">Ստուգեք որոնման և էջերի դիտարկման օպտիմալացման կարգավորումները</translation>
 <translation id="1646982517418478057">Մուտքագրեք գաղտնաբառ՝ այս հավաստագիրը գաղտնագրելու համար</translation>
 <translation id="1648528859488547844">Տեղորոշելու համար օգտագործել Wi‑Fi կամ բջջային ցանցեր</translation>
 <translation id="164936512206786300">Անջատել Bluetooth սարքը</translation>
@@ -1463,6 +1465,7 @@
 <translation id="2514326558286966059">Արագ ապակողպեք մատնահետքի օգնությամբ</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">Նշանակել ևս մեկ փոխանջատիչ</translation>
+<translation id="251722524540674480">Հաստատեք ձեր օգտանունը</translation>
 <translation id="2517472476991765520">Որոնել</translation>
 <translation id="2518024842978892609">Օգտագործել ձեր սպասառուի վկայականները</translation>
 <translation id="2519517390894391510">Հավաստագրման պրոֆիլի անունը</translation>
@@ -2166,6 +2169,7 @@
 <translation id="3288047731229977326">Մշակողի ռեժիմում գործարկվող ընդլայնումները կարող են վնասել ձեր համակարգիչը: Եթե դուք մշակող չեք, ձեր ապահովության համար խորհուրդ ենք տալիս անջատել այդ ընդլայնումները:</translation>
 <translation id="3289668031376215426">Ավտոմատ գլխատառացում</translation>
 <translation id="3289856944988573801">Թարմացումների առկայությունը ստուգելու համար օգտվեք Ethernet կամ Wi-Fi ցանցերից:</translation>
+<translation id="3291436823898732747">Բարելավված որոնում․ առաջարկները հայտնվում են omnibox-ում մինչ հարցումը մուտքագրելը</translation>
 <translation id="3293644607209440645">Ուղարկել այս էջը</translation>
 <translation id="32939749466444286">Չհաջողվեց մեկնարկել Linux-ի կոնտեյները: Նորից փորձեք:</translation>
 <translation id="3294437725009624529">Հյուր</translation>
@@ -4203,6 +4207,7 @@
 <translation id="5505307013568720083">Թանաքը վերջացել է</translation>
 <translation id="5505794066310932198">Միացնել/անջատել Commander-ը</translation>
 <translation id="5507756662695126555">Առանց մերժման</translation>
+<translation id="5507795078844206688">Ձեր այցելած էջերի URL-ները, օր․՝ https://www.google.com</translation>
 <translation id="5509693895992845810">Պահել &amp;որպես…</translation>
 <translation id="5509914365760201064">Թողարկող` <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">Ստացեք պատկերների նկարագրությունները Google-ից</translation>
@@ -4255,6 +4260,7 @@
 <translation id="5565735124758917034">Ակտիվ է</translation>
 <translation id="5567989639534621706">Հավելվածի քեշեր</translation>
 <translation id="5568069709869097550">Չհաջողվեց մուտք գործել</translation>
+<translation id="5571092938913434726">Մեդիաֆայլերի կառավարման ընդհանուր տարրեր</translation>
 <translation id="5571832155627049070">Անհատականացրեք ձեր պրոֆիլը</translation>
 <translation id="5572851009514199876">Մուտք գործեք Chrome, որպեսզի վերջինս կարողանա ստուգել՝ արդյոք դուք այս կայքը բացելու թույլտվություն ունեք։</translation>
 <translation id="5575473780076478375">Ինկոգնիտո ընդլայնում` <ph name="EXTENSION_NAME" /></translation>
@@ -4519,6 +4525,7 @@
 <translation id="5869522115854928033">Պահված գաղտնաբառեր</translation>
 <translation id="5870086504539785141">Փակել մատչելիության ցանկը</translation>
 <translation id="5870155679953074650">Սարքակազմի սխալ</translation>
+<translation id="5875534259258494936">Էկրանի ցուցադրումն ավարտվել է</translation>
 <translation id="5876576639916258720">Ստուգվում է…</translation>
 <translation id="5876851302954717356">Նոր ներդիր աջ կողմում</translation>
 <translation id="5877064549588274448">Վարկածը փոխվել է: Փոփոխությունները կիրառելու համար վերագործարկեք սարքը:</translation>
@@ -5378,6 +5385,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" />-ը չի կարող գործարկվել արմատային գրացուցակից:</translation>
 <translation id="6812841287760418429">Պահպանել փոփոխությունները</translation>
 <translation id="6813907279658683733">Ամբողջ էկրանը</translation>
+<translation id="6814033694018386318">Ինչ տեղեկություններ են փոխանցվում Google-ին</translation>
 <translation id="6817174620439930047">Հարցնել, երբ որևէ կայք ուզում է օգտագործել համակարգի բացառիկ հաղորդագրությունները՝ MIDI սարքեր մուտք գործելու համար (խորհուրդ է տրվում)</translation>
 <translation id="6818198425579322765">Թարգմանվող էջի լեզուն</translation>
 <translation id="6818802132960437751">Վիրուսներից պաշտպանության ներկառուցված համակարգ</translation>
@@ -5873,6 +5881,7 @@
 <translation id="7374376573160927383">Կառավարել USB սարքերը</translation>
 <translation id="7374461526650987610">Հաղորդակարգերի մշակիչներ</translation>
 <translation id="7375235221357833624">{0,plural, =1{Թարմացրեք սարքը մեկ ժամվա ընթացքում}one{Թարմացրեք սարքը # ժամվա ընթացքում}other{Թարմացրեք սարքը # ժամվա ընթացքում}}</translation>
+<translation id="7376543451826039186">Ավելի արագ դիտարկում․ օրինակ՝ ընթացիկ էջի տվյալների հիման վրա որոշակի բովանդակություն բեռնվում է նախօրոք</translation>
 <translation id="7376553024552204454">Ընդգծել մկնիկի նշորդը, երբ այն շարժվում է</translation>
 <translation id="737728204345822099">Անվտանգության բանալու վրա կարող է պահվել նշում այս կայքի այցելության մասին։</translation>
 <translation id="7377451353532943397">Միշտ արգելել տվիչների օգտագործումը</translation>
@@ -5930,6 +5939,7 @@
 <translation id="7427798576651127129">Զանգել <ph name="DEVICE_NAME" />-ից</translation>
 <translation id="7431719494109538750">HID սարքեր չեն գտնվել</translation>
 <translation id="7431991332293347422">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը և այլ ծառայություններ անհատականացնելու համար</translation>
+<translation id="7432200167665670017">Ձեր ադմինիստրատորն արգելափակել է «<ph name="EXTENSION_NAME" />» ընդլայնումը (ID-ն՝ <ph name="EXTENSION_ID" />)</translation>
 <translation id="7433708794692032816">Տեղադրեք խելացի քարտը, որպեսզի շարունակեք օգտվել <ph name="DEVICE_TYPE" /> սարքից</translation>
 <translation id="7433957986129316853">Պահպանել</translation>
 <translation id="7434509671034404296">Մշակողների համար</translation>
@@ -5959,6 +5969,7 @@
 <translation id="7460045493116006516">Ձեր տեղադրած ընթացիկ թեման</translation>
 <translation id="7461924472993315131">Ամրացնել</translation>
 <translation id="746216226901520237">Smart Lock-ը միացնելու համար մուտքագրեք ձեր գաղտնաբառը։ Դրանից հետո ձեր հեռախոսով կարող եք ապակողպել <ph name="DEVICE_TYPE" /> սարքը։ Smart Lock-ը կարող եք անջատել կարգավորումներում։</translation>
+<translation id="7464637891177137294">Պահեք այն ձեր Google հաշվում (<ph name="ACCOUNT" />)</translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# բաց ներդիր: Սեղմեք՝ ներդիրների հատվածը ցուցադրելու/թաքցնելու համար:}one{# բաց ներդիր: Սեղմեք՝ ներդիրների հատվածը ցուցադրելու/թաքցնելու համար:}other{# բաց ներդիր: Սեղմեք՝ ներդիրների հատվածը ցուցադրելու/թաքցնելու համար:}}</translation>
 <translation id="7465635034594602553">Սխալ առաջացավ։ Սպասեք մի քանի րոպե և նորից գործարկեք <ph name="APP_NAME" /> հավելվածը։</translation>
 <translation id="7465778193084373987">Netscape-ի վկայագրի ետկանչման URL</translation>
@@ -6022,6 +6033,7 @@
 <translation id="7525625923260515951">Լսել ընտրված տեքստը</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{Եվս 1}one{Եվս {NUM_DOWNLOADS}}other{Եվս {NUM_DOWNLOADS}}}</translation>
 <translation id="7526989658317409655">Տեղապահ</translation>
+<translation id="7527758104894292229">Թարմացրեք այն ձեր Google հաշվում (<ph name="ACCOUNT" />)</translation>
 <translation id="7529411698175791732">Ստուգեք ձեր ինտերնետ կապը։ Եթե խնդիրը չվերանա, դուրս եկեք հաշվից ու նորից մտեք։</translation>
 <translation id="7529876053219658589">{0,plural, =1{Փակել հյուրի պատուհանը}one{Փակել հյուրի պատուհանը}other{Փակել հյուրի պատուհանները}}</translation>
 <translation id="7530016656428373557">Լիցքաթափման արագությունը վատտերով</translation>
@@ -6407,6 +6419,7 @@
 <translation id="7898725031477653577">Միշտ թարգմանել</translation>
 <translation id="790040513076446191">Կառավարել գաղտնիությանն առնչվող կարգավորումները</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
+<translation id="7901914889562552258">Բարելավված Chrome՝ էջերի ցուցանիշների շնորհիվ</translation>
 <translation id="7903345046358933331">Էջը չի պատասխանում: Կարող եք սպասել պատասխանին կամ փակել էջը:</translation>
 <translation id="7903742244674067440">Ձեր պահված հավաստագրերում նշված են այս հավաստագրման կենտրոնները</translation>
 <translation id="7903859912536385558">կայուն տարբերակ (վստահված փորձարկող)</translation>
@@ -6872,6 +6885,7 @@
 <translation id="8392364544846746346">Հարցնել, երբ որևէ կայք ուզենա փոփոխել ձեր սարքի ֆայլերը և պանակները</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" />-ի ընտրանքների ցանկ</translation>
 <translation id="8393511274964623038">Դադարեցնել փլագինը</translation>
+<translation id="839363317075970734">Տեղեկություններ Bluetooth սարքի մասին</translation>
 <translation id="8393700583063109961">Ուղարկել հաղորդագրություն</translation>
 <translation id="8397825320644530257">Չեղարկել հեռախոսի հետ կապը</translation>
 <translation id="8398877366907290961">Շարունակել</translation>
@@ -7122,6 +7136,7 @@
 <translation id="8681614230122836773">Chrome-ը ձեր համակարգչում վնասաբեր ծրագիր է հայտնաբերել։</translation>
 <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> տպիչը միացված է և պատրաստ է օգտագործման</translation>
 <translation id="8683081248374354009">Զրոյացնել խմբի կարգավորումները</translation>
+<translation id="8683526617475118045">Գործառույթի առավելությունները</translation>
 <translation id="8688672835843460752">Հասանելի</translation>
 <translation id="8690129572193755009">Կայքերը կարող են հաղորդակարգերը մշակելու թույլտվություն հայցել</translation>
 <translation id="8695139659682234808">Ավելացրեք ծնողական վերահսկողությունը՝ կարգավորումն ավարտելուց հետո</translation>
@@ -7175,6 +7190,7 @@
 <translation id="8737685506611670901">Բացել <ph name="PROTOCOL" /> -ի հղումները <ph name="REPLACED_HANDLER_TITLE" />-ի փոխարեն</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Ընտրեք լեզու, որով պետք է թարգմանել էջը</translation>
+<translation id="8737916108453753541">URL-ները փոխանցվում են Google-ին, քանի որ դրանք օգնում են վերլուծել օգտատերերի գործողությունները դիտարկիչում</translation>
 <translation id="8740247629089392745">Դուք կարող եք տալ այս Chromebook-ը <ph name="SUPERVISED_USER_NAME" />-ին։ Կարգավորումը գրեթե ավարտված է։ Սարքը շուտով պատրաստ կլինի օգտագործման։</translation>
 <translation id="8741944563400125534">Switch Access-ի կարգավորման ուղեցույց</translation>
 <translation id="8742998548129056176">Սրանք ընդհանուր տեղեկություններ են ձեր սարքի և դրա օգտագործման (օրինակ՝ մարտկոցի լիցքի, համակարգի ու հավելվածների օգտագործման և սխալների) մասին։ Տեղեկություններն օգտագործվելու են Android-ի ծառայությունների աշխատանքը բարելավելու համար։ Տվյալների մի մասը օգտակար կլինի մեր գործընկերների, օրինակ, Android ծրագրավորողների համար և կօգնի բարելավել նաև նրանց հավելվածներն ու արտադրանքները։</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 3cf3ff9..62f239f 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Aktif</translation>
 <translation id="5567989639534621706">Cache aplikasi</translation>
 <translation id="5568069709869097550">Tidak dapat sign in</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Sesuaikan profil Anda</translation>
 <translation id="5572851009514199876">Mulai dan login ke Chrome agar Chrome dapat memeriksa apakah Anda diizinkan untuk mengakses situs ini atau tidak.</translation>
 <translation id="5575473780076478375">Ekstensi Samaran: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index d313f54c..a18d498 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Virkt</translation>
 <translation id="5567989639534621706">Skyndiminni forrita</translation>
 <translation id="5568069709869097550">Innskráning mistókst</translation>
+<translation id="5571092938913434726">Altækar efnisstýringar</translation>
 <translation id="5571832155627049070">Útbúðu prófílinn þinn</translation>
 <translation id="5572851009514199876">Byrjaðu á að skrá þig inn á Chrome svo Chrome geti athugað hvort þú hafir leyfi til að skoða þetta vefsvæði.</translation>
 <translation id="5575473780076478375">Huliðsviðbót: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 553151a..26b60a5 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4256,6 +4256,7 @@
 <translation id="5565735124758917034">Attivo</translation>
 <translation id="5567989639534621706">Cache applicazione</translation>
 <translation id="5568069709869097550">Non riesco a effettuare l'accesso</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Personalizza il tuo profilo</translation>
 <translation id="5572851009514199876">Accedi a Chrome per consentire al browser di verificare che tu sia autorizzato ad accedere a questo sito.</translation>
 <translation id="5575473780076478375">Estensione in incognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 64b4e974..a9c9d8a 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">פעילה</translation>
 <translation id="5567989639534621706">קובצי מטמון של יישום</translation>
 <translation id="5568069709869097550">אי אפשר להיכנס</translation>
+<translation id="5571092938913434726">פקדי מדיה גלובליים</translation>
 <translation id="5571832155627049070">התאמה אישית של הפרופיל</translation>
 <translation id="5572851009514199876">‏תחילה עליך להיכנס לחשבונך ב-Chrome כדי לאפשר ל-Chrome לבדוק אם יש לך הרשאה לגשת לאתר הזה.</translation>
 <translation id="5575473780076478375">תוסף של גלישה פרטית: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 30053c25..e89dadb 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4250,6 +4250,7 @@
 <translation id="5565735124758917034">有効</translation>
 <translation id="5567989639534621706">アプリケーション キャッシュ</translation>
 <translation id="5568069709869097550">ログインできない</translation>
+<translation id="5571092938913434726">グローバル メディア コントロール</translation>
 <translation id="5571832155627049070">プロファイルのカスタマイズ</translation>
 <translation id="5572851009514199876">このサイトへのアクセス権があるかどうかを Chrome で確認できるように、Chrome を起動してログインしてください。</translation>
 <translation id="5575473780076478375">シークレット モード拡張機能: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index bd09717..caa7e25e 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -443,6 +443,7 @@
 <translation id="1476088332184200792">თქვენს მოწყობილობაზე კოპირება</translation>
 <translation id="1476607407192946488">&amp;ენის პარამეტრები</translation>
 <translation id="1477446329585670721"><ph name="DOMAIN" /> მოითხოვს, რომ თქვენი სმარტ-ბარათი ჩასმული იყოს.</translation>
+<translation id="1477654881618305065">ამ კონტენტის გაზიარება დაუშვებელია თქვენი ორგანიზაციის მიერ. თუ დახმარება გჭირდებათ, დაუკავშირდით თქვენს ადმინისტრატორს.</translation>
 <translation id="1478340334823509079">დეტალები: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">ინსტალაცია არ არის ჩართული</translation>
 <translation id="1480571698637441426">შეკითხვების დასმისას თქვენზე მორგებული პასუხები რომ მიიღოთ, დართეთ ასისტენტს თქვენი ეკრანის ანაბეჭდზე წვდომის ნებართვა. აღნიშნული, შესაძლოა, მოიცავდეს იმ სიმღერების ან ვიდეოების შესახებ ინფორმაციასაც, რომლებიც გაშვებულია.</translation>
@@ -618,6 +619,7 @@
 <translation id="1643921258693943800">მახლობლად გაზიარების გამოსაყენებლად ჩართეთ Bluetooth და Wi-Fi</translation>
 <translation id="1644574205037202324">ისტორია</translation>
 <translation id="1645516838734033527"><ph name="DEVICE_TYPE" />-ის უსაფრთხოების უზრუნველსაყოფად, Smart Lock საჭიროებს თქვენს ტელეფონზე ეკრანის დაბლოკვის მეთოდის გამოყენებას.</translation>
+<translation id="1646793251510634025">შეამოწმეთ პარამეტრები ძიებისა და ვების დათვალიერების ოპტიმიზაციისთვის</translation>
 <translation id="1646982517418478057">ამ სერტიფიკატის დასაშიფრად, გთხოვთ, შეიყვანოთ პაროლი</translation>
 <translation id="1648528859488547844">მდებარეობის დასადგენად Wi-Fi ან მობილური ქსელების გამოყენება</translation>
 <translation id="164936512206786300">Bluetooth მოწყობილობის დაწყვილების გაუქმება</translation>
@@ -1461,6 +1463,7 @@
 <translation id="2514326558286966059">განბლოკეთ უფრო სწრაფად თითის ანაბეჭდის მეშვეობით</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">ერთი დამატებითი გადამრთველის მიკუთვნება</translation>
+<translation id="251722524540674480">დაადასტურეთ თქვენი მომხმარებლის სახელი</translation>
 <translation id="2517472476991765520">სკანირება</translation>
 <translation id="2518024842978892609">გამოიყენეთ თქვენი კლიენტის სერთიფიკატები</translation>
 <translation id="2519517390894391510">სერტიფიკატის პროფილის სახელი</translation>
@@ -2165,6 +2168,7 @@
 <translation id="3288047731229977326">დეველოპერის რეჟიმში გაშვებულმა გაფართოებებმა შეიძლება დააზიანოს თქვენი კომპიუტერი. თუ თქვენ არ ხართ დეველოპერი, უსაფრთხოების შენარჩუნებისათვის თქვენ უნდა გამორთოთ დეველოპერულ რეჟიმში გაშვებული გაფართოებები.</translation>
 <translation id="3289668031376215426">ავტომატური გამთავრულება</translation>
 <translation id="3289856944988573801">განახლებების შესამოწმებლად გამოიყენეთ Ethernet ან Wi-Fi.</translation>
+<translation id="3291436823898732747">ვების გაუმჯობესებული დათვალიერება: მაგალითად, Omnibox-ში ტექსტის აკრეფის დაწყებამდე შემოთავაზებებს იხილავთ</translation>
 <translation id="3293644607209440645">ამ გვერდის გაგზავნა</translation>
 <translation id="32939749466444286">Linux კონტეინერის გაშვება ვერ მოხერხდა. გთხოვთ, ცადოთ ხელახლა.</translation>
 <translation id="3294437725009624529">სტუმარი</translation>
@@ -4199,6 +4203,7 @@
 <translation id="5505307013568720083">მელანი ამოიწურა</translation>
 <translation id="5505794066310932198">Commander-ის გადართვა</translation>
 <translation id="5507756662695126555">არა უარყოფილი</translation>
+<translation id="5507795078844206688">თქვენ მიერ მონახულებული გვერდების URL-ები, მაგ. https://www.google.com</translation>
 <translation id="5509693895992845810">შენ&amp;ახვა როგორც…</translation>
 <translation id="5509914365760201064">გამცემი: <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">სურათების აღწერილობების მიღება Google-ისგან</translation>
@@ -4251,6 +4256,7 @@
 <translation id="5565735124758917034">აქტიური</translation>
 <translation id="5567989639534621706">პროგრამის შეცდომები</translation>
 <translation id="5568069709869097550">სისტემაში შესვლა ვერ მოხერხდა</translation>
+<translation id="5571092938913434726">მედიის მართვის გლობალური საშუალებები</translation>
 <translation id="5571832155627049070">მოირგეთ პროფილი</translation>
 <translation id="5572851009514199876">გთხოვთ, გაუშვათ Chrome და შეხვიდეთ მასში, რათა Chrome-მა შეამოწმოს, გაქვთ თუ არა ამ საიტზე წვდომის უფლება.</translation>
 <translation id="5575473780076478375">ინკოგნიტო გაფართოება: <ph name="EXTENSION_NAME" /></translation>
@@ -4515,6 +4521,7 @@
 <translation id="5869522115854928033">შენახული პაროლები</translation>
 <translation id="5870086504539785141">სპეციალური შესაძლებლობების მენიუს დახურვა</translation>
 <translation id="5870155679953074650">მყარი უწესივრობები</translation>
+<translation id="5875534259258494936">ეკრანის გაზიარება დასრულდა</translation>
 <translation id="5876576639916258720">გაშვებულია...</translation>
 <translation id="5876851302954717356">ახალი ჩანართი მარჯვნივ</translation>
 <translation id="5877064549588274448">არხი შეიცვალა. გადატვირთეთ მოწყობილობა ცვლილებების გამოსაყენებლად.</translation>
@@ -5374,6 +5381,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> არ შეიძლება გაიშვას, როგორც ძირეული.</translation>
 <translation id="6812841287760418429">ცვლილებების შენახვა</translation>
 <translation id="6813907279658683733">მთელი ეკრანი</translation>
+<translation id="6814033694018386318">თქვენ მიერ Google-თან გაზიარებული კონტენტი</translation>
 <translation id="6817174620439930047">შეკითხვა, როცა საიტს MIDI მოწყობილობებზე წვდომისთვის სისტემის ექსკლუზიური შეტყობინების გამოყენება სურს (რეკომენდებულია)</translation>
 <translation id="6818198425579322765">სათარგმნი გვერდის ენა</translation>
 <translation id="6818802132960437751">ვირუსებისგან ჩაშენებული დაცვა</translation>
@@ -5869,6 +5877,7 @@
 <translation id="7374376573160927383">USB-მოწყობილობების მართვა</translation>
 <translation id="7374461526650987610">პროტოკოლის მარკერები</translation>
 <translation id="7375235221357833624">{0,plural, =1{განაახლეთ მოწყობილობა 1 საათის განმავლობაში}other{განაახლეთ მოწყობილობა # საათის განმავლობაში}}</translation>
+<translation id="7376543451826039186">ვების უფრო სწრაფად დათვალიერება: მაგალითად, კონკრეტული მომდევნო კონტენტი პროაქტიურად ჩაიტვირთება ამჟამინდელი გვერდის საფუძველზე</translation>
 <translation id="7376553024552204454">მოძრაობისას მაუსის კურსორის გამოყოფა</translation>
 <translation id="737728204345822099">შესაძლოა, თქვენს უსაფრთხოების გასაღებზე ჩაიწეროს ამ საიტზე ვიზიტი.</translation>
 <translation id="7377451353532943397">სენსორებზე წვდომის აკრძალვის გაგრძელება</translation>
@@ -5926,6 +5935,7 @@
 <translation id="7427798576651127129">ზარი <ph name="DEVICE_NAME" />-ისგან</translation>
 <translation id="7431719494109538750">HID მოწყობილობები ვერ მოიძებნა</translation>
 <translation id="7431991332293347422">მართეთ თქვენი დათვალიერების ისტორიის გამოყენების ხერხები Search-ისა და სხვა სერვისების პერსონალიზებისთვის</translation>
+<translation id="7432200167665670017">თქვენმა ადმინისტრატორმა დაბლოკა „<ph name="EXTENSION_NAME" />“ — აპის ID: <ph name="EXTENSION_ID" /></translation>
 <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> კვლავ რომ გამოიყენოთ, ჩასვით სმარტ-ბარათი</translation>
 <translation id="7433957986129316853">შენარჩუნება</translation>
 <translation id="7434509671034404296">შემმუშავებელი</translation>
@@ -5955,6 +5965,7 @@
 <translation id="7460045493116006516">თქვენ მიერ ამჟამად დაინსტალირებული თემა</translation>
 <translation id="7461924472993315131">პინი</translation>
 <translation id="746216226901520237">შემდეგში <ph name="DEVICE_TYPE" /> განიბლოკება თქვენი ტელეფონის მეშვეობით. Smart Lock-ის გამორთვა შესაძლებელია პარამეტრებიდან.</translation>
+<translation id="7464637891177137294">შეინახეთ ის თქვენს Google ანგარიშში (<ph name="ACCOUNT" />)</translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# გახსნილი ჩანართი, დააჭირეთ ჩანართების ზოლის გადასართველად}other{# გახსნილი ჩანართი, დააჭირეთ ჩანართების ზოლის გადასართველად}}</translation>
 <translation id="7465635034594602553">წარმოიქმნა შეფერხება. ცადეთ <ph name="APP_NAME" />-ის ხელახლა გაშვება რამდენიმე წუთის შემდეგ.</translation>
 <translation id="7465778193084373987">Netscape სერტიფიკატის გაუქმების URL</translation>
@@ -6018,6 +6029,7 @@
 <translation id="7525625923260515951">არჩეული ტექსტის მოსმენა</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 სხვა}other{{NUM_DOWNLOADS} სხვა}}</translation>
 <translation id="7526989658317409655">ჩანაცვლების ველი</translation>
+<translation id="7527758104894292229">განაახლეთ ის თქვენს Google ანგარიშში (<ph name="ACCOUNT" />)</translation>
 <translation id="7529411698175791732">შეამოწმეთ კავშირი ინტერნეტთან. თუ პრობლემა გამეორდება, ცადეთ გამოსვლა და ხელახლა შესვლა.</translation>
 <translation id="7529876053219658589">{0,plural, =1{სტუმრის ფანჯრების დახურვა}other{სტუმრის ფანჯრების დახურვა}}</translation>
 <translation id="7530016656428373557">განტვირთვის მაჩვენებელი (ვატი)</translation>
@@ -6404,6 +6416,7 @@
 <translation id="7898725031477653577">ყოველთვის თარგმნე</translation>
 <translation id="790040513076446191">კონფიდენციალურობასთან დაკავშირებულ პარამეტრებზე მანიპულაცია</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
+<translation id="7901914889562552258">გვერდების მეტრიკის მეშვეობით გაუმჯობესებული Chrome</translation>
 <translation id="7903345046358933331">გვერდი აღარ რეაგირებს. შეგიძლიათ დაელოდოთ მისგან პასუხს ან დახუროთ იგი.</translation>
 <translation id="7903742244674067440">თქვენ შენახული გაქვთ სერტიფიკატები, რომლებიც ქვემოთ ჩამოთვლილი სერტიფიკატთა ცენტრების ამოცნობას ახორციელებს</translation>
 <translation id="7903859912536385558">სტაბილური (სანდო ტესტერი)</translation>
@@ -6869,6 +6882,7 @@
 <translation id="8392364544846746346">შეკითხვის მიღება, როცა საიტს სურს თქვენს მოწყობილობაზე არსებული ფაილების ან საქაღალდეების რედაქტირება</translation>
 <translation id="8392451568018454956">პარამეტრების მენიუ მომხმარებლისთვის: <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">დანამატის შეჩერება</translation>
+<translation id="839363317075970734">Bluetooth მოწყობილობის დეტალები</translation>
 <translation id="8393700583063109961">შეტყობინების გაგზავნა</translation>
 <translation id="8397825320644530257">დაკავშირებულ ტელეფონთან კავშირის გაწყვეტა</translation>
 <translation id="8398877366907290961">მაინც გაგრძელება</translation>
@@ -7119,6 +7133,7 @@
 <translation id="8681614230122836773">Chrome-მა თქვენს კომპიუტერზე აღმოაჩინა საზიანო პროგრამული უზრუნველყოფა.</translation>
 <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> დაკავშირებულია და მზადაა</translation>
 <translation id="8683081248374354009">ჯგუფის გადაყენება</translation>
+<translation id="8683526617475118045">თქვენი უპირატესობები</translation>
 <translation id="8688672835843460752">ხელმისაწვდომი</translation>
 <translation id="8690129572193755009">საიტებს შეუძლია პროტოკოლების დამუშავების თხოვნა</translation>
 <translation id="8695139659682234808">დაყენების შემდეგ დაამატეთ მშობელთა მიერ კონტროლი</translation>
@@ -7172,6 +7187,7 @@
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />-ის ნაცვლად, <ph name="PROTOCOL" />-ის ბმულების გახსნა</translation>
 <translation id="8737709691285775803">ცრუმაგიერი მომხმარებლები</translation>
 <translation id="8737914367566358838">აირჩიეთ, რა ენაზე ითარგმნოს გვერდი</translation>
+<translation id="8737916108453753541">URL-ები ზიარდება Google-თან, რომ ბრაუზერში თქვენი ქმედებები გაანალიზდეს</translation>
 <translation id="8740247629089392745">შეგიძლიათ გადასცეთ ეს Chromebook <ph name="SUPERVISED_USER_NAME" />-ს. დაყენება თითქმის დასრულდა, მომდევნო ეტაპი გაცნობაა.</translation>
 <translation id="8741944563400125534">გადამრთველით წვდომის დაყენების სახელმძღვანელო</translation>
 <translation id="8742998548129056176">ეს არის ზოგადი ინფორმაცია თქვენი მოწყობილობისა და თქვენ მიერ მისი გამოყენების შესახებ (მაგ. ბატარეის დონე, სისტემისა და აპების აქტივობა თუ შეცდომები). აღნიშნული მონაცემები ხელს შეუწყობს Android-ის გაუმჯობესებას, ხოლო შეჯამებული ინფორმაციის ნაწილი ასევე სასარგებლო იქნება Google-ის აპებისა და პარტნიორებისთვის, მაგალითად, Android-ის დეველოპერებისთვის, რომლებიც შეძლებენ საკუთარი აპებისა და პროდუქტების დახვეწას.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 335b28f..59690699 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -4252,6 +4252,7 @@
 <translation id="5565735124758917034">Белсенді</translation>
 <translation id="5567989639534621706">Қолданба кэштері</translation>
 <translation id="5568069709869097550">Кіру мүмкін емес</translation>
+<translation id="5571092938913434726">Мультимедианы басқарудың жалпы элементтері</translation>
 <translation id="5571832155627049070">Профильді реттеу</translation>
 <translation id="5572851009514199876">Chrome браузері сіздің сайтқа кіруге рұқсатыңыз барын тексере алуы үшін Chrome жүйесін іске қосып, оған кіріңіз.</translation>
 <translation id="5575473780076478375">Инкогнито кеңейтімі: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 9b702f3..6bd9ada 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">សកម្ម</translation>
 <translation id="5567989639534621706">ឃ្លាំងសម្ងាត់កម្មវិធី</translation>
 <translation id="5568069709869097550">មិនអាចចូលបានទេ</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">ប្ដូរ​កម្រងព័ត៌មាន​របស់អ្នក​តាមបំណង</translation>
 <translation id="5572851009514199876">សូម​ចាប់ផ្តើម​ ហើយបញ្ចូល​គណនីទៅក្នុង Chrome នោះ Chrome នឹងអាច​ពិនិត្យថា​តើអ្នក​អាច​ចូល​ប្រើទំព័រ​នេះបាន​ដែរឬទេ។</translation>
 <translation id="5575473780076478375">កម្មវិធីបន្ថែមអនាមិក៖ <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 038ab30..fb3598a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4260,6 +4260,7 @@
 <translation id="5565735124758917034">ಸಕ್ರಿಯ</translation>
 <translation id="5567989639534621706">ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹಗಳು</translation>
 <translation id="5568069709869097550">ಸೈನ್ ಇನ್ ಆಗಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
+<translation id="5571092938913434726">ಜಾಗತಿಕ ಮಾಧ್ಯಮ ನಿಯಂತ್ರಣಗಳು</translation>
 <translation id="5571832155627049070">ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation>
 <translation id="5572851009514199876">ದಯವಿಟ್ಟು Chrome  ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಸೈನ್ ಇನ್ ಮಾಡಿ ಈ ಮೂಲಕ ಈ ಸೈಟ್‌ಗೆ ಪ್ರವೇಶಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು Chrome ಪರಿಶೀಲಿಸಬಹುದು.</translation>
 <translation id="5575473780076478375">ಅದೃಶ್ಯ ವಿಸ್ತರಣೆ: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 4df9f1cb..7873afd3 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -4269,6 +4269,7 @@
 <translation id="5565735124758917034">활성</translation>
 <translation id="5567989639534621706">애플리케이션 캐시</translation>
 <translation id="5568069709869097550">로그인할 수 없음</translation>
+<translation id="5571092938913434726">전체 미디어 컨트롤</translation>
 <translation id="5571832155627049070">프로필 맞춤설정</translation>
 <translation id="5572851009514199876">이 사이트에 액세스할 수 있는지 확인할 수 있도록 Chrome을 시작하고 로그인하세요.</translation>
 <translation id="5575473780076478375">시크릿 모드 확장 프로그램: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 2499fcf..f5d2492 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Жигердүү</translation>
 <translation id="5567989639534621706">Колдонмо кэштери</translation>
 <translation id="5568069709869097550">Аккаунтка кирбей жатат</translation>
+<translation id="5571092938913434726">Жалпы медианы башкаруу элементтери</translation>
 <translation id="5571832155627049070">Профилиңизди ыңгайлаштырыңыз</translation>
 <translation id="5572851009514199876">Chrome'ду иштетип, аккаунтка кириңиз. Chrome бул сайтка кирүүгө уруксатыңыз бар-жогун текшериши керек.</translation>
 <translation id="5575473780076478375">Жашыруун кеңейтүү: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index e06d9cf..0674a01 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -4269,6 +4269,7 @@
 <translation id="5565735124758917034">ເປີດຢູ່</translation>
 <translation id="5567989639534621706">ແຄຊ໌ແອັບພລິເຄຊັນ</translation>
 <translation id="5568069709869097550">ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້</translation>
+<translation id="5571092938913434726">ການຄວບຄຸມສື່ສ່ວນກາງ</translation>
 <translation id="5571832155627049070">ປັບແຕ່ງໂປຣໄຟລ໌ຂອງທ່ານ</translation>
 <translation id="5572851009514199876">ກະລຸນາເລີ່ມຕົ້ນ ແລະ ເຂົ້າສູ່ລະບົບ Chrome ເພື່ອໃຫ້ Chrome ສາມາດກວດເບິ່ງວ່າທ່ານໄດ້ຮັບອະນຸຍາດໃຫ້ເຂົ້າຫາເວັບໄຊນີ້ຫຼືບໍ່.</translation>
 <translation id="5575473780076478375">ສ່ວນຂະຫຍາຍທີ່​ບໍ່​ເຜີຍ​ຕົນ​ຕົວ: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 9740789..728342e9 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4275,6 +4275,7 @@
 <translation id="5565735124758917034">Aktyvus</translation>
 <translation id="5567989639534621706">Programos talpyklos</translation>
 <translation id="5568069709869097550">Nepavyksta prisijungti</translation>
+<translation id="5571092938913434726">Bendrieji medijos valdikliai</translation>
 <translation id="5571832155627049070">Tinkinkite savo profilį</translation>
 <translation id="5572851009514199876">Pirmiausia prisijunkite prie „Chrome“, kad „Chrome“ galėtų patikrinti, ar jums leidžiama pasiekti šią svetainę.</translation>
 <translation id="5575473780076478375">Inkognito plėtinys: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 3df8947..3b569fc 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -445,6 +445,7 @@
 <translation id="1476088332184200792">Kopēt uz jūsu ierīci</translation>
 <translation id="1476607407192946488">&amp;Valodas iestatījumi</translation>
 <translation id="1477446329585670721">Saskaņā ar domēna <ph name="DOMAIN" /> prasībām viedkartei ir jābūt ievietotai.</translation>
+<translation id="1477654881618305065">Jūsu organizācija neatļauj kopīgot šo saturu. Ja jums ir nepieciešama palīdzība, sazinieties ar administratoru.</translation>
 <translation id="1478340334823509079">Detalizēta informācija: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Instalēšana nav iespējota</translation>
 <translation id="1480571698637441426">Lai saņemtu pielāgotas atbildes, kad uzdodat jautājumus, ļaujiet Asistentam piekļūt ekrānā redzamās informācijas ekrānuzņēmumam. Ekrānuzņēmums var ietvert arī informāciju par atskaņotajām dziesmām vai videoklipiem.</translation>
@@ -620,6 +621,7 @@
 <translation id="1643921258693943800">Lai varētu izmantot funkciju Kopīgošana tuvumā, ieslēdziet Bluetooth un Wi-Fi savienojumu</translation>
 <translation id="1644574205037202324">Vēsture</translation>
 <translation id="1645516838734033527">Lai Smart Lock varētu saglabāt jūsu ierīces (<ph name="DEVICE_TYPE" />) drošību, tālrunī jāiestata ekrāna bloķēšana.</translation>
+<translation id="1646793251510634025">Pārskatiet meklēšanas un pārlūkošanas optimizācijas iestatījumus</translation>
 <translation id="1646982517418478057">Lūdzu, ievadiet paroli, lai šifrētu šo sertifikātu</translation>
 <translation id="1648528859488547844">Izmantot Wi‑Fi vai mobilos tīklus, lai noteiktu atrašanās vietu</translation>
 <translation id="164936512206786300">Savienošanas pārī atcelšana ar Bluetooth ierīci</translation>
@@ -1463,6 +1465,7 @@
 <translation id="2514326558286966059">Ātrāka atbloķēšana, izmantojot pirksta nospiedumu</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">Piešķirt vēl vienu slēdzi</translation>
+<translation id="251722524540674480">Lietotājvārda apstiprināšana</translation>
 <translation id="2517472476991765520">Meklēt</translation>
 <translation id="2518024842978892609">Izmantot jūsu klientu sertifikātus</translation>
 <translation id="2519517390894391510">Sertifikāta profila nosaukums</translation>
@@ -2167,6 +2170,7 @@
 <translation id="3288047731229977326">Paplašinājumi, kas darbojas izstrādātāja režīmā, var kaitēt jūsu datoram. Ja neesat izstrādātājs, drošības nolūkos atspējojiet šos paplašinājumus, kas darbojas izstrādātāja režīmā.</translation>
 <translation id="3289668031376215426">Automātisks lielo burtu lietojums</translation>
 <translation id="3289856944988573801">Lai pārbaudītu, vai ir pieejami atjauninājumi, lūdzu, izmantojiet tīklu Ethernet vai Wi-Fi.</translation>
+<translation id="3291436823898732747">Uzlabota pārlūkošana: piemēram, ieteikumi universālajā lodziņā, pirms sākat rakstīt</translation>
 <translation id="3293644607209440645">Sūtīt šo lapu</translation>
 <translation id="32939749466444286">Linux konteiners netika startēts. Lūdzu, mēģiniet vēlreiz.</translation>
 <translation id="3294437725009624529">Viesis</translation>
@@ -4201,6 +4205,7 @@
 <translation id="5505307013568720083">Beigusies tinte</translation>
 <translation id="5505794066310932198">Pārslēgt Commander</translation>
 <translation id="5507756662695126555">Neatteikšanās</translation>
+<translation id="5507795078844206688">Apmeklēto vietņu vietrāži URL, piemēram, https://www.google.com</translation>
 <translation id="5509693895992845810">S&amp;aglabāt kā...</translation>
 <translation id="5509914365760201064">Izdevējs: <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">Iegūt attēlu aprakstus no Google</translation>
@@ -4253,6 +4258,7 @@
 <translation id="5565735124758917034">Aktīvs</translation>
 <translation id="5567989639534621706">Lietojumprogrammu kešatmiņas</translation>
 <translation id="5568069709869097550">Nevarat pieteikties</translation>
+<translation id="5571092938913434726">Globālās multivides vadīklas</translation>
 <translation id="5571832155627049070">Profila pielāgošana</translation>
 <translation id="5572851009514199876">Lūdzu, palaidiet pārlūku Chrome un pierakstieties tajā, lai pārlūkā Chrome varētu pārbaudīt, vai jums ir atļauja piekļūt šai vietnei.</translation>
 <translation id="5575473780076478375">Inkognito paplašinājums: <ph name="EXTENSION_NAME" /></translation>
@@ -4517,6 +4523,7 @@
 <translation id="5869522115854928033">Saglabātās paroles</translation>
 <translation id="5870086504539785141">Aizvērt pieejamības izvēlni</translation>
 <translation id="5870155679953074650">Nopietnas kļūdas</translation>
+<translation id="5875534259258494936">Ekrāna kopīgošana ir beigusies</translation>
 <translation id="5876576639916258720">Darbojas...</translation>
 <translation id="5876851302954717356">Jauna cilne pa labi</translation>
 <translation id="5877064549588274448">Kanāls tika mainīts. Lai lietotu izmaiņas, restartējiet ierīci.</translation>
@@ -5376,6 +5383,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> nevar darboties kā sakne.</translation>
 <translation id="6812841287760418429">Saglabāt izmaiņas</translation>
 <translation id="6813907279658683733">Viss ekrāns</translation>
+<translation id="6814033694018386318">Saturs, kas tiek kopīgots ar Google</translation>
 <translation id="6817174620439930047">Jautāt, ja vietnē tiek mēģināts izmantot ekskluzīvus sistēmas ziņojumus, lai piekļūtu MIDI ierīcēm (ieteicams)</translation>
 <translation id="6818198425579322765">Lapas valoda, no kuras jātulko saturs</translation>
 <translation id="6818802132960437751">Iebūvēta aizsardzība pret vīrusiem</translation>
@@ -5871,6 +5879,7 @@
 <translation id="7374376573160927383">Pārvaldīt USB ierīces</translation>
 <translation id="7374461526650987610">Protokolu apdarinātāji</translation>
 <translation id="7375235221357833624">{0,plural, =1{Ierīce jāatjaunina stundas laikā}zero{Ierīce jāatjaunina # stundu laikā}one{Ierīce jāatjaunina # stundas laikā}other{Ierīce jāatjaunina # stundu laikā}}</translation>
+<translation id="7376543451826039186">Ātrāka pārlūkošana: piemēram, iepriekš ielādējiet konkrētu papildu saturu, pamatojoties uz pašreizējo lapu</translation>
 <translation id="7376553024552204454">Izcelt peles kursoru, kad tas tiek kustināts</translation>
 <translation id="737728204345822099">Ieraksts par jūsu apmeklējumu šajā vietnē var tikt reģistrēts jūsu drošības atslēgā.</translation>
 <translation id="7377451353532943397">Turpināt bloķēt piekļuvi sensoriem</translation>
@@ -5928,6 +5937,7 @@
 <translation id="7427798576651127129">Zvanīt no ierīces <ph name="DEVICE_NAME" /></translation>
 <translation id="7431719494109538750">Netika atrasta neviena HID ierīce.</translation>
 <translation id="7431991332293347422">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas un cita satura personalizēšanai</translation>
+<translation id="7432200167665670017">Jūsu administrators ir bloķējis paplašinājumu “<ph name="EXTENSION_NAME" />” — lietotnes ID: <ph name="EXTENSION_ID" /></translation>
 <translation id="7433708794692032816">Lai jūs varētu turpināt izmantot savu <ph name="DEVICE_TYPE" /> ierīci, ievietojiet viedkarti</translation>
 <translation id="7433957986129316853">Paturēt</translation>
 <translation id="7434509671034404296">Izstrādātājs</translation>
@@ -5957,6 +5967,7 @@
 <translation id="7460045493116006516">Pašlaik instalētais motīvs</translation>
 <translation id="7461924472993315131">Piespraust</translation>
 <translation id="746216226901520237">Nākamajā reizē šīs ierīces <ph name="DEVICE_TYPE" /> atbloķēšanai tiks izmantots jūsu tālrunis. Iestatījumos varat izslēgt Smart Lock.</translation>
+<translation id="7464637891177137294">Saglabājiet to savā Google kontā (<ph name="ACCOUNT" />).</translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# atvērta cilne. Nospiediet, lai pārslēgtos uz ciļņu joslu.}zero{# atvērtas cilnes. Nospiediet, lai pārslēgtos uz ciļņu joslu.}one{# atvērta cilne. Nospiediet, lai pārslēgtos uz ciļņu joslu.}other{# atvērtas cilnes. Nospiediet, lai pārslēgtos uz ciļņu joslu.}}</translation>
 <translation id="7465635034594602553">Radās kļūda. Lūdzu, uzgaidiet dažas minūtes un vēlreiz palaidiet lietotni <ph name="APP_NAME" />.</translation>
 <translation id="7465778193084373987">Netscape sertifikāta atsaukšanas URL</translation>
@@ -6020,6 +6031,7 @@
 <translation id="7525625923260515951">Klausīties atlasīto tekstu</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{Vēl 1}zero{Vēl {NUM_DOWNLOADS}}one{Vēl {NUM_DOWNLOADS}}other{Vēl {NUM_DOWNLOADS}}}</translation>
 <translation id="7526989658317409655">Vietturis</translation>
+<translation id="7527758104894292229">Atjauniniet to savā Google kontā (<ph name="ACCOUNT" />).</translation>
 <translation id="7529411698175791732">Pārbaudiet interneta savienojumu. Ja neizdodas novērst problēmu, izrakstieties un atkārtoti pierakstieties.</translation>
 <translation id="7529876053219658589">{0,plural, =1{Aizvērt viesa režīma logu}zero{Aizvērt viesa režīma logus}one{Aizvērt viesa režīma logus}other{Aizvērt viesa režīma logu}}</translation>
 <translation id="7530016656428373557">Izlādes ātrums vatos</translation>
@@ -6406,6 +6418,7 @@
 <translation id="7898725031477653577">Vienmēr tulkot</translation>
 <translation id="790040513076446191">Manipulēt ar konfidencialitāti saistītus iestatījumus</translation>
 <translation id="7901405293566323524">Tālruņu centrāle</translation>
+<translation id="7901914889562552258">Uzlabota Chrome darbība, izmantojot lapas rādītājus</translation>
 <translation id="7903345046358933331">Lapa vairs nereaģē. Varat uzgaidīt, līdz tā atsāks reaģēt, vai aizvērt to.</translation>
 <translation id="7903742244674067440">Sistēmā ir sertifikāti, kas identificē šīs sertifikātu izdevējiestādes</translation>
 <translation id="7903859912536385558">stabils (uzticams testētājs)</translation>
@@ -6872,6 +6885,7 @@
 <translation id="8392364544846746346">Vaicāt, ja vietne vēlas rediģēt ierīces failus vai mapes</translation>
 <translation id="8392451568018454956">Opciju izvēlne kontam <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Apturēt spraudņa darbību</translation>
+<translation id="839363317075970734">Bluetooth ierīces dati</translation>
 <translation id="8393700583063109961">Sūtīt ziņojumu</translation>
 <translation id="8397825320644530257">Saistīta tālruņa atvienošana</translation>
 <translation id="8398877366907290961">Turpināt jebkurā gadījumā</translation>
@@ -7122,6 +7136,7 @@
 <translation id="8681614230122836773">Chrome atrada jūsu datorā kaitīgu programmatūru</translation>
 <translation id="8682730193597992579">Printeris <ph name="PRINTER_NAME" /> ir pievienots un gatavs darbam</translation>
 <translation id="8683081248374354009">Atiestatīt grupu</translation>
+<translation id="8683526617475118045">Ieguvumi</translation>
 <translation id="8688672835843460752">Pieejams</translation>
 <translation id="8690129572193755009">Atļaut vietnēm pieprasīt atļauju apstrādāt protokolus</translation>
 <translation id="8695139659682234808">Vecāku kontroles pievienošana pēc iestatīšanas</translation>
@@ -7175,6 +7190,7 @@
 <translation id="8737685506611670901">atvērt <ph name="PROTOCOL" /> saites, nevis <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Izvēlieties valodu, kurā tulkot lapu</translation>
+<translation id="8737916108453753541">Vietrāži URL tiek kopīgoti ar Google, lai izprastu pārlūkošanas darbību</translation>
 <translation id="8740247629089392745">Varat iedot šo Chromebook datoru lietotājam <ph name="SUPERVISED_USER_NAME" />. Kad iestatīšana būs pabeigta, šo datoru varēs izmantot.</translation>
 <translation id="8741944563400125534">Slēdžu piekļuves iestatīšanas ceļvedis</translation>
 <translation id="8742998548129056176">Šī ir vispārīga informācija par jūsu ierīci un tās lietojumu (piemēram, par akumulatora uzlādes līmeni, sistēmas darbībām, lietotņu izmantojumu un kļūdām). Dati tiks izmantoti, lai uzlabotu Android darbību. Noteiktu apkopotu informāciju izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji, lai uzlabotu lietotnes un produktus.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 94dbbaf..18b74342 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -4273,6 +4273,7 @@
 <translation id="5565735124758917034">Активно</translation>
 <translation id="5567989639534621706">Кешови на апликација</translation>
 <translation id="5568069709869097550">Не може да се најавите</translation>
+<translation id="5571092938913434726">Глобални контроли за аудиовизуелни содржини</translation>
 <translation id="5571832155627049070">Приспособете го вашиот профил</translation>
 <translation id="5572851009514199876">Започнете и најавете се на Chrome за да може Chrome да провери дали ви е дозволено да пристапите на сајтов.</translation>
 <translation id="5575473780076478375">Наставка на таен идентитет: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 0e3e382..3a02aa47 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -4254,6 +4254,7 @@
 <translation id="5565735124758917034">സജീവമാണ്</translation>
 <translation id="5567989639534621706">ആപ്പ് കാഷെകള്‍‌</translation>
 <translation id="5568069709869097550">സൈൻ ഇൻ ചെയ്യാനായില്ല</translation>
+<translation id="5571092938913434726">ആഗോള മീഡിയാ നിയന്ത്രണങ്ങൾ</translation>
 <translation id="5571832155627049070">നിങ്ങളുടെ പ്രൊഫൈൽ ഇഷ്‌ടാനുസൃതമാക്കുക</translation>
 <translation id="5572851009514199876">ആരംഭിച്ച് Chrome-ൽ സൈൻ ഇൻ ചെയ്യുന്നതിലൂടെ, നിങ്ങൾക്ക് ഈ സൈറ്റ് ആക്‌സസ് ചെയ്യാൻ അനുവാദമുണ്ടോയെന്ന് Chrome-ന് പരിശോധിക്കാനാവും.</translation>
 <translation id="5575473780076478375">ആള്‍മാറാട്ട വിപുലീകരണം: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 29e8993..af20d44 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -4267,6 +4267,7 @@
 <translation id="5565735124758917034">Идэвхтэй</translation>
 <translation id="5567989639534621706">Аппликейшний кэшүүд</translation>
 <translation id="5568069709869097550">Нэвтрэх боломжгүй</translation>
+<translation id="5571092938913434726">Глобал медиа хяналт</translation>
 <translation id="5571832155627049070">Профайлаа өөрчлөх</translation>
 <translation id="5572851009514199876">Chrome-г эхлүүлж, нэвтэрснээр Chrome таныг энэ сайтад хандах эрхтэй эсэхийг шалгах болно.</translation>
 <translation id="5575473780076478375">Нууцлалтай өргөтгөл: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 5a15c99..0c081db 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -4264,6 +4264,7 @@
 <translation id="5565735124758917034">सक्रिय</translation>
 <translation id="5567989639534621706">ॲप्लिकेशन कॅशे</translation>
 <translation id="5568069709869097550">साइन इन करणे शक्य नाही</translation>
+<translation id="5571092938913434726">जागतिक मीडिया नियंत्रणे</translation>
 <translation id="5571832155627049070">तुमची प्रोफाइल कस्टमाइझ करा</translation>
 <translation id="5572851009514199876">कृपया सुरुवात करा आणि Chrome मध्‍ये साइन इन करा जेणेकरून तुम्हाला या साइट ॲक्सेस करण्‍याची परवानगी  आहे किंवा नाही ते Chrome तपासू शकेल.</translation>
 <translation id="5575473780076478375">गुप्त एक्स्टेंशन: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 44aa595b..87529ba 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Aktif</translation>
 <translation id="5567989639534621706">Cache aplikasi</translation>
 <translation id="5568069709869097550">Tidak boleh log masuk</translation>
+<translation id="5571092938913434726">Kawalan Media Global</translation>
 <translation id="5571832155627049070">Sesuaikan profil anda</translation>
 <translation id="5572851009514199876">Sila mulakan dan log masuk ke Chrome supaya Chrome boleh menyemak sama ada anda dibenarkan mengakses tapak ini.</translation>
 <translation id="5575473780076478375">Sambungan Inkognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 86686f58..61e1f4c 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -4269,6 +4269,7 @@
 <translation id="5565735124758917034">အသက်ဝင်နေ</translation>
 <translation id="5567989639534621706">အပလီကေးရှင်း ကက်ရှ်များ</translation>
 <translation id="5568069709869097550">လက်မှတ်ထိုးဝင်၍ မရပါ။</translation>
+<translation id="5571092938913434726">အထွေထွေ မီဒီယာ ထိန်းချုပ်မှုများ</translation>
 <translation id="5571832155627049070">သင့်ပရိုဖိုင်ကို စိတ်ကြိုက်ပြင်ရန်</translation>
 <translation id="5572851009514199876">သင်သည် ဤဆိုက်ကို ကြည့်ရှုခွင့်ရှိမရှိ Chrome က စစ်ဆေးပေးရန် စတင်၍ Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။</translation>
 <translation id="5575473780076478375">Incognito အိတ်စတန်းရှင်း: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 65c71e9..2f0115a4 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -4253,6 +4253,7 @@
 <translation id="5565735124758917034">सक्रिय</translation>
 <translation id="5567989639534621706">एप क्यासहरू</translation>
 <translation id="5568069709869097550">साइन इन गर्न सक्दैन</translation>
+<translation id="5571092938913434726">मिडियासम्बन्धी वैश्विक नियन्त्रणहरू</translation>
 <translation id="5571832155627049070">आफ्नो प्रोफाइल आफ्नो रोजाइ अनुकूल पार्नुहोस्</translation>
 <translation id="5572851009514199876">Chrome ले तपाईंलाई यस साइटमाथि पहुँच राख्ने अनुमति छ वा छैन भनी जाँच्न सकोस् भन्नका लागि कृपया Chrome सुरु गरी साइन इन गर्नुहोस्।</translation>
 <translation id="5575473780076478375">इंकोग्निटो एक्स्टेन्शन: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index ab6685ca..fca2799 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> altijd vertalen</translation>
 <translation id="1108600514891325577">&amp;Stop</translation>
 <translation id="1110155001042129815">Wachten</translation>
+<translation id="1111781754511998498">Projector</translation>
 <translation id="1112420131909513020">Achtergrondtabblad gebruikt Bluetooth</translation>
 <translation id="1113892970288677790">Selecteer beheerde kunstwerken en afbeeldingen</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -531,6 +532,7 @@
 <translation id="156793199942386351">'<ph name="CURRENTKEY" />' is al toegewezen aan de actie '<ph name="ACTION" />'. Druk op een willekeurige toets om <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">JavaScript-console</translation>
 <translation id="1568323446248056064">Weergave-instellingen van apparaat openen</translation>
+<translation id="1570604804919108255">Negeren van meldingen opheffen</translation>
 <translation id="1571738973904005196">Tabblad bekijken: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (gast)</translation>
 <translation id="1572266655485775982">Wifi aanzetten</translation>
@@ -588,6 +590,7 @@
 <translation id="1621485112342885423">Je winkelwagens</translation>
 <translation id="1621729191093924223">Functies waarvoor een microfoon nodig is, werken niet</translation>
 <translation id="1621831347985899379"><ph name="DEVICE_TYPE" />-gegevens worden verwijderd</translation>
+<translation id="1621984899599015181">Opties voor delen worden beheerd door je organisatie. Sommige items zijn misschien verborgen.</translation>
 <translation id="1622054403950683339">Wifi-netwerk vergeten</translation>
 <translation id="1623132449929929218">De afbeeldingen zijn momenteel niet beschikbaar. Maak opnieuw verbinding om collecties van achtergronden te bekijken.</translation>
 <translation id="1623723619460186680">Blauw licht verminderen</translation>
@@ -825,6 +828,7 @@
 <translation id="1850508293116537636">Rechtsom &amp;draaien</translation>
 <translation id="1852141627593563189">Schadelijke software zoeken</translation>
 <translation id="1852799913675865625">Er is een fout opgetreden bij het lezen van het bestand: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Ga door waar je gebleven was. Je kunt in Instellingen instellen dat apps altijd worden hersteld bij het starten of herstellen uitzetten.</translation>
 <translation id="1854180393107901205">Casten stoppen</translation>
 <translation id="1855079636134697549">Camera staat aan</translation>
 <translation id="1856715684130786728">Locatie toevoegen...</translation>
@@ -953,6 +957,7 @@
 <translation id="1989113344093894667">Kan geen content opnemen</translation>
 <translation id="1990046457226896323">Spraakbestanden gedownload</translation>
 <translation id="1990512225220753005">Geen snelkoppelingen op deze pagina tonen</translation>
+<translation id="199191324030140441">Niet storen uitzetten</translation>
 <translation id="1992397118740194946">Niet ingesteld</translation>
 <translation id="1992924914582925289">Van apparaat verwijderen</translation>
 <translation id="1994173015038366702">Site-URL</translation>
@@ -994,6 +999,7 @@
 
 Je kunt de instellingen van dit account beheren door de Family Link-app op je apparaat te installeren.  We hebben je een e-mail met instructies gestuurd.</translation>
 <translation id="2040460856718599782">Er is iets verkeerd gegaan tijdens de verificatie. Controleer je inloggegevens en probeer het opnieuw.</translation>
+<translation id="2040894699575719559">Locatie geblokkeerd</translation>
 <translation id="2042279886444479655">Actieve profielen</translation>
 <translation id="2044014337866019681">Zorg dat je <ph name="ACCOUNT" /> verifieert om de sessie te ontgrendelen.</translation>
 <translation id="204497730941176055">Sjabloonnaam van Microsoft-certificaat</translation>
@@ -1477,6 +1483,7 @@
 <translation id="2527167509808613699">Elk soort verbinding</translation>
 <translation id="2530166226437958497">Problemen oplossen</translation>
 <translation id="2532589005999780174">Modus voor hoog contrast</translation>
+<translation id="2533649878691950253">Deze site heeft geen toegang tot je exacte locatie omdat je dit gewoonlijk niet toestaat</translation>
 <translation id="253434972992662860">&amp;Onderbreken</translation>
 <translation id="253557089021624350">Aantal keepalive-activiteiten</translation>
 <translation id="2535799430745250929">Er bestaat geen mobiel netwerk</translation>
@@ -1663,6 +1670,7 @@
 <translation id="2738771556149464852">Niet na</translation>
 <translation id="2739191690716947896">Foutopsporing</translation>
 <translation id="2739240477418971307">Je toegankelijkheidsinstellingen wijzigen</translation>
+<translation id="2739965161385757621">Mijn instellingen controleren</translation>
 <translation id="274029851662193272">Verlaagd</translation>
 <translation id="2740531572673183784">OK</translation>
 <translation id="2741713322780029189">Herstelterminal openen</translation>
@@ -1787,6 +1795,7 @@
 <translation id="2864601841139725659">Je profielfoto instellen</translation>
 <translation id="2865919525181940183">Screenshot van programma's die momenteel op het scherm staan</translation>
 <translation id="286674810810214575">Voedingsbronnen controleren…</translation>
+<translation id="2866876751734765554">Privacycontrole</translation>
 <translation id="2867768963760577682">Openen als vastgezet tabblad</translation>
 <translation id="2868746137289129307">Deze extensie is verouderd en uitgezet op basis van bedrijfsbeleid. De extensie kan automatisch worden aangezet wanneer er een nieuwere versie beschikbaar komt.</translation>
 <translation id="2870560284913253234">Site</translation>
@@ -2316,6 +2325,7 @@
 <translation id="3446274660183028131">Start Parallels Desktop om Windows te installeren.</translation>
 <translation id="344630545793878684">Je gegevens voor een aantal websites lezen</translation>
 <translation id="3446650212859500694">Dit bestand bevat gevoelige content</translation>
+<translation id="3446827946208017735">Je kunt op 1 plaats inzicht krijgen in de meest essentiële privacyinstellingen en ze controleren</translation>
 <translation id="3448086340637592206">Aanvullende voorwaarden van Google Chrome en Chrome OS</translation>
 <translation id="3448492834076427715">Account updaten</translation>
 <translation id="3449393517661170867">Nieuw venster met tabbladen</translation>
@@ -3743,6 +3753,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Geen <ph name="VM_TYPE" />-VM's gevonden}=1{1 <ph name="VM_TYPE" />-VM gevonden: <ph name="VM_NAME_LIST" />}other{{NUM_VMS} <ph name="VM_TYPE" />-VM's gevonden: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Geen internetverbinding.</translation>
 <translation id="4998430619171209993">Aan</translation>
+<translation id="4999804342505941663">Niet storen aanzetten</translation>
 <translation id="5000922062037820727">Geblokkeerd (aanbevolen)</translation>
 <translation id="5005498671520578047">Wachtwoord kopiëren</translation>
 <translation id="5006218871145547804">Android-app-ADB voor Crostini</translation>
@@ -4253,6 +4264,7 @@
 <translation id="5565735124758917034">Actief</translation>
 <translation id="5567989639534621706">Applicatiecaches</translation>
 <translation id="5568069709869097550">Kan niet aanmelden</translation>
+<translation id="5571092938913434726">Algemene mediabediening</translation>
 <translation id="5571832155627049070">Je profiel aanpassen</translation>
 <translation id="5572851009514199876">Start Chrome en log in zodat Chrome kan controleren of je deze site mag openen.</translation>
 <translation id="5575473780076478375">Incognito-extensie: <ph name="EXTENSION_NAME" /></translation>
@@ -5066,6 +5078,7 @@
 <translation id="6468485451923838994">Lettertypen</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> bestanden</translation>
 <translation id="6469557521904094793">Mobiel netwerk aanzetten</translation>
+<translation id="6470823736074966819">Meldingen negeren</translation>
 <translation id="6472893788822429178">Homepage-knop tonen</translation>
 <translation id="6474498546677193336">Kan het delen niet opheffen omdat een app deze map gebruikt. Het delen van de map wordt opgeheven als Linux weer wordt uitgezet.</translation>
 <translation id="6474884162850599008">Google Drive-account ontkoppelen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index c317b9d..9301b3d 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -4263,6 +4263,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Programbuffere</translation>
 <translation id="5568069709869097550">Kan ikke logge på</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Tilpass profilen din</translation>
 <translation id="5572851009514199876">Start og logg på Chrome, så Chrome kan sjekke om du har tillatelse til å gå til dette nettstedet.</translation>
 <translation id="5575473780076478375">Inkognitoutvidelse: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index adf278a..b351a6b 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -4249,6 +4249,7 @@
 <translation id="5565735124758917034">ସକ୍ରିୟ ଅଛି</translation>
 <translation id="5567989639534621706">ଆପ୍ଲିକେସନ୍ କେଚ୍‍</translation>
 <translation id="5568069709869097550">ସାଇନ୍ ଇନ୍ କରିପାରିବ ନାହିଁ</translation>
+<translation id="5571092938913434726">ଗ୍ଲୋବାଲ୍ ମିଡିଆ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ</translation>
 <translation id="5571832155627049070">ଆପଣଙ୍କ ପ୍ରୋଫାଇଲ୍ କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ</translation>
 <translation id="5572851009514199876">ଦୟାକରି Chromeରେ ସାଇନ୍‌ ଇନ୍‍ କରି ଆରମ୍ଭ କରନ୍ତୁ ଯାହା ଦ୍ୱାରା Chrome ଏହା ଯାଞ୍ଚ କରିପାରିବ ଯେ ଆପଣଙ୍କୁ ଏହି ସାଇଟ୍‌ ଆକ୍ସେସ୍‌ କରିବାକୁ ଅନୁମତି ଅଛି କି ନାହିଁ।</translation>
 <translation id="5575473780076478375">ଇନ୍‌କଗ୍‌ନିଟୋ ଏକ୍ସଟେନ୍‌ସନ୍: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index b49777df..8b7b0d69 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -4267,6 +4267,7 @@
 <translation id="5565735124758917034">ਸਕਿਰਿਆ</translation>
 <translation id="5567989639534621706">ਐਪਲੀਕੇਸ਼ਨ ਕੈਸ਼ੇ</translation>
 <translation id="5568069709869097550">ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation>
+<translation id="5571092938913434726">ਗਲੋਬਲ ਮੀਡੀਆ ਕੰਟਰੋਲ</translation>
 <translation id="5571832155627049070">ਆਪਣੇ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation>
 <translation id="5572851009514199876">ਕਿਰਪਾ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ Chrome 'ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ ਤਾਂ ਕਿ Chrome ਇਹ ਜਾਂਚ ਸਕੇ ਕਿ ਤੁਹਾਨੂੰ ਇਸ ਸਾਈਟ 'ਤੇ ਪਹੁੰਚ ਲਈ ਇਜਾਜ਼ਤ ਹੈ ਜਾਂ ਨਹੀਂ।</translation>
 <translation id="5575473780076478375">ਇਨਕੋਗਨਿਟੋ ਐਕਸਟੈਂਸ਼ਨ: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 4972e570..13c51bc 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -4253,6 +4253,7 @@
 <translation id="5565735124758917034">Aktywny</translation>
 <translation id="5567989639534621706">Pamięci podręczne aplikacji</translation>
 <translation id="5568069709869097550">Nie można się zalogować</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Dostosuj profil</translation>
 <translation id="5572851009514199876">Uruchom Chrome i zaloguj się w nim, by mógł sprawdzić, czy masz uprawnienia dostępu do tej strony.</translation>
 <translation id="5575473780076478375">Rozszerzenie w trybie incognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 38db0f2..3fb1e0f 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -4274,6 +4274,7 @@
 <translation id="5565735124758917034">Ativo</translation>
 <translation id="5567989639534621706">Caches de aplicativos</translation>
 <translation id="5568069709869097550">Não consigo acessar</translation>
+<translation id="5571092938913434726">Controles globais de mídia</translation>
 <translation id="5571832155627049070">Personalize seu perfil</translation>
 <translation id="5572851009514199876">Inicie e faça login no Chrome para que ele possa verificar se você tem permissão para acessar este site.</translation>
 <translation id="5575473780076478375">Extensão anônima: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 9740b1a..e16c2b2 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4257,6 +4257,7 @@
 <translation id="5565735124758917034">Ativo</translation>
 <translation id="5567989639534621706">Caches de aplicações</translation>
 <translation id="5568069709869097550">Não é possível iniciar sessão</translation>
+<translation id="5571092938913434726">Controlos de multimédia globais</translation>
 <translation id="5571832155627049070">Personalize o seu perfil</translation>
 <translation id="5572851009514199876">Comece e inicie sessão no Chrome para que este possa verificar se tem autorização para aceder a este site.</translation>
 <translation id="5575473780076478375">Extensão da navegação anónima: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 0215a14..7d43b098 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314">Tradu întotdeauna din <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Oprește</translation>
 <translation id="1110155001042129815">Așteaptă</translation>
+<translation id="1111781754511998498">Projector</translation>
 <translation id="1112420131909513020">O filă din fundal folosește Bluetooth</translation>
 <translation id="1113892970288677790">Selectează imagini recomandate</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -532,6 +533,7 @@
 <translation id="156793199942386351">Tasta <ph name="CURRENTKEY" /> a fost deja asociată acțiunii „<ph name="ACTION" />”. Apasă pe orice tastă pentru <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Consolă JavaScript</translation>
 <translation id="1568323446248056064">Deschide setările dispozitivului privind afișajul</translation>
+<translation id="1570604804919108255">Activează sunetul notificărilor</translation>
 <translation id="1571738973904005196">Vezi fila: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (invitat)</translation>
 <translation id="1572266655485775982">Activează Wi-Fi</translation>
@@ -589,6 +591,7 @@
 <translation id="1621485112342885423">Coșurile tale de cumpărături</translation>
 <translation id="1621729191093924223">Funcțiile care au nevoie de microfon nu vor funcționa</translation>
 <translation id="1621831347985899379">Datele de pe <ph name="DEVICE_TYPE" /> se vor șterge</translation>
+<translation id="1621984899599015181">Opțiunile de distribuire sunt gestionate de organizația ta. Este posibil ca unele elemente să fie ascunse.</translation>
 <translation id="1622054403950683339">Elimină rețeaua Wi-Fi</translation>
 <translation id="1623132449929929218">Imaginile sunt momentan indisponibile. Conectează-te din nou la internet ca să vezi colecțiile de imagini de fundal.</translation>
 <translation id="1623723619460186680">Reducerea luminii albastre</translation>
@@ -826,6 +829,7 @@
 <translation id="1850508293116537636">Rotiți în sensul acelor de &amp;ceasornic</translation>
 <translation id="1852141627593563189">Găsește software-ul dăunător</translation>
 <translation id="1852799913675865625">A apărut o eroare la citirea fișierului: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Continuă de unde ai rămas. Poți seta aplicațiile să se restabilească întotdeauna la pornire sau să dezactivezi restabilirea din Setări.</translation>
 <translation id="1854180393107901205">Nu mai trimite</translation>
 <translation id="1855079636134697549">Camera este activată</translation>
 <translation id="1856715684130786728">Adăugați o locație...</translation>
@@ -954,6 +958,7 @@
 <translation id="1989113344093894667">Nu se poate captura conținutul</translation>
 <translation id="1990046457226896323">Fișierele de redare în scris a vorbirii s-au descărcat</translation>
 <translation id="1990512225220753005">Nu afișa comenzi rapide pe această pagină</translation>
+<translation id="199191324030140441">Dezactivează funcția Nu deranja</translation>
 <translation id="1992397118740194946">Nu este setat</translation>
 <translation id="1992924914582925289">Elimină de pe dispozitiv</translation>
 <translation id="1994173015038366702">Adresa URL a site-ului</translation>
@@ -995,6 +1000,7 @@
 
 Poți gestiona setările contului dacă instalezi aplicația Family Link pe dispozitiv.  Ți-am trimis instrucțiuni într-un e-mail.</translation>
 <translation id="2040460856718599782">Hopa! A apărut o eroare la autentificarea dvs. Verificați încă o dată datele de conectare și încercați din nou.</translation>
+<translation id="2040894699575719559">Accesul la locație a fost blocat</translation>
 <translation id="2042279886444479655">Profiluri active</translation>
 <translation id="2044014337866019681">Confirmă <ph name="ACCOUNT" /> pentru a debloca sesiunea.</translation>
 <translation id="204497730941176055">Nume șablon de certificat Microsoft</translation>
@@ -1478,6 +1484,7 @@
 <translation id="2527167509808613699">Orice fel de conexiune</translation>
 <translation id="2530166226437958497">Remedierea erorilor</translation>
 <translation id="2532589005999780174">Mod de contrast ridicat</translation>
+<translation id="2533649878691950253">Accesul acestui site la locația exactă a fost blocat, deoarece nu acorzi de obicei această permisiune</translation>
 <translation id="253434972992662860">&amp;Întrerupe</translation>
 <translation id="253557089021624350">Număr necesar pentru stare activă</translation>
 <translation id="2535799430745250929">Nu există nicio rețea celulară</translation>
@@ -1665,6 +1672,7 @@
 <translation id="2738771556149464852">Nu după</translation>
 <translation id="2739191690716947896">Remediați erorile</translation>
 <translation id="2739240477418971307">Modifică setările de accesibilitate</translation>
+<translation id="2739965161385757621">Examinează setările</translation>
 <translation id="274029851662193272">Adâncită</translation>
 <translation id="2740531572673183784">OK</translation>
 <translation id="2741713322780029189">Deschide terminalul de recuperare</translation>
@@ -1789,6 +1797,7 @@
 <translation id="2864601841139725659">Setează fotografia de profil</translation>
 <translation id="2865919525181940183">Captură de ecran a programelor afișate pe ecran</translation>
 <translation id="286674810810214575">Se verifică sursele de alimentare…</translation>
+<translation id="2866876751734765554">Examinarea confidențialității</translation>
 <translation id="2867768963760577682">Deschideți ca filă fixată</translation>
 <translation id="2868746137289129307">Această extensie este învechită și a fost dezactivată de o politică de companie. Dacă este disponibilă o nouă versiune, extensia ar putea fi activată automat.</translation>
 <translation id="2870560284913253234">Site</translation>
@@ -2318,6 +2327,7 @@
 <translation id="3446274660183028131">Lansează Parallels Desktop pentru a instala Windows.</translation>
 <translation id="344630545793878684">Citește datele de pe un număr de site-uri</translation>
 <translation id="3446650212859500694">Acest fișier include conținut sensibil</translation>
+<translation id="3446827946208017735">Înțelege și examinează setările de confidențialitate esențiale într-un singur loc</translation>
 <translation id="3448086340637592206">Condițiile suplimentare pentru Google Chrome și Sistemul de operare Chrome</translation>
 <translation id="3448492834076427715">Actualizează contul</translation>
 <translation id="3449393517661170867">Fereastră nouă cu file</translation>
@@ -3747,6 +3757,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Nu s-a găsit nicio mașină virtuală <ph name="VM_TYPE" />}=1{S-a găsit o mașină virtuală <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}few{S-au găsit {NUM_VMS} mașini virtuale <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{S-au găsit {NUM_VMS} de mașini virtuale <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Nu există conexiune la internet.</translation>
 <translation id="4998430619171209993">Activat</translation>
+<translation id="4999804342505941663">Activează funcția Nu deranja</translation>
 <translation id="5000922062037820727">Blocată (recomandat)</translation>
 <translation id="5005498671520578047">Copiază parola</translation>
 <translation id="5006218871145547804">ADB în aplicațiile pentru Android în Crostini</translation>
@@ -4257,6 +4268,7 @@
 <translation id="5565735124758917034">Activ</translation>
 <translation id="5567989639534621706">Memoriile cache ale aplicației</translation>
 <translation id="5568069709869097550">Nu se poate conecta</translation>
+<translation id="5571092938913434726">Comenzi media globale</translation>
 <translation id="5571832155627049070">Personalizează-ți profilul</translation>
 <translation id="5572851009514199876">Pornește și conectează-te la Chrome, ca acesta să verifice dacă ai permisiunea să accesezi site-ul.</translation>
 <translation id="5575473780076478375">Extensie incognito: <ph name="EXTENSION_NAME" /></translation>
@@ -5070,6 +5082,7 @@
 <translation id="6468485451923838994">Fonturi</translation>
 <translation id="6468773105221177474"><ph name="FILE_COUNT" /> fișiere</translation>
 <translation id="6469557521904094793">Activează rețeaua mobilă</translation>
+<translation id="6470823736074966819">Dezactivează sunetul notificărilor</translation>
 <translation id="6472893788822429178">Afișează butonul Pagina principală</translation>
 <translation id="6474498546677193336">Distribuirea nu s-a putut anula, deoarece o aplicație folosește acest dosar. Distribuirea dosarului va fi anulată la următoarea închidere a sistemului de operare Linux.</translation>
 <translation id="6474884162850599008">Deconectează contul Google Drive</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index f0c484b..fc1be1f8 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -4257,6 +4257,7 @@
 <translation id="5565735124758917034">Активен</translation>
 <translation id="5567989639534621706">Кеш приложений</translation>
 <translation id="5568069709869097550">Не удается войти</translation>
+<translation id="5571092938913434726">Универсальные элементы управления медиафайлами</translation>
 <translation id="5571832155627049070">Настройте профиль</translation>
 <translation id="5572851009514199876">Выполните вход, чтобы Chrome определил, разрешен ли вам доступ к этому сайту.</translation>
 <translation id="5575473780076478375">Расширение в режиме инкогнито: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 21de601..2fc6c85 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -4260,6 +4260,7 @@
 <translation id="5565735124758917034">සක්‍රියයි</translation>
 <translation id="5567989639534621706">යෙදුම් කැෂේ</translation>
 <translation id="5568069709869097550">පුරනය විය නොහැක</translation>
+<translation id="5571092938913434726">ගෝලීය මාධ්‍ය පාලන</translation>
 <translation id="5571832155627049070">ඔබේ පැතිකඩ අභිරුචිකරණය කරන්න</translation>
 <translation id="5572851009514199876">ඔබට මෙම අඩවියට පිවිසීමට ඉඩ දෙන්නේද යන්න පරීක්ෂා කිරීමට Chrome හට හැකි වන ලෙස කරුණාකර Chrome ආරම්භ කර පුරන්න.</translation>
 <translation id="5575473780076478375">Incognito දිගුව: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 2a8da5c..8e664a7 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -4258,6 +4258,7 @@
 <translation id="5565735124758917034">Aktívne</translation>
 <translation id="5567989639534621706">Vyrovnávacie pamäte aplikácií</translation>
 <translation id="5568069709869097550">Nedá sa prihlásiť</translation>
+<translation id="5571092938913434726">Globálne ovládacie prvky médií</translation>
 <translation id="5571832155627049070">Prispôsobenie profilu</translation>
 <translation id="5572851009514199876">Začnite a prihláste sa do Chromu, aby skontroloval, či môžete navštíviť tento web.</translation>
 <translation id="5575473780076478375">Rozšírenie inkognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 3e07baa..8177342 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -101,6 +101,7 @@
 <translation id="1103523840287552314">Vedno prevedi ta jezik: <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Ustavi</translation>
 <translation id="1110155001042129815">Počakaj</translation>
+<translation id="1111781754511998498">Projektor</translation>
 <translation id="1112420131909513020">Zavihek v ozadju uporablja Bluetooth</translation>
 <translation id="1113892970288677790">Izberite izbrani slikovni material in slike</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -537,6 +538,7 @@
 <translation id="156793199942386351">Tipka »<ph name="CURRENTKEY" />« je že dodeljena dejanju »<ph name="ACTION" />«. Pritisnite poljubno tipko, če želite <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">Konzola JavaScript</translation>
 <translation id="1568323446248056064">Odpiranje nastavitev zaslona v napravi</translation>
+<translation id="1570604804919108255">Vklop zvoka obvestil</translation>
 <translation id="1571738973904005196">Ogled zavihka: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (gost)</translation>
 <translation id="1572266655485775982">Omogočanje Wi-Fi-ja</translation>
@@ -594,6 +596,7 @@
 <translation id="1621485112342885423">Vaši vozički</translation>
 <translation id="1621729191093924223">Funkcije, ki potrebujejo mikrofon, ne bodo delovale</translation>
 <translation id="1621831347985899379">Izbrisani bodo podatki v napravi <ph name="DEVICE_TYPE" /></translation>
+<translation id="1621984899599015181">Možnosti za deljenje z drugimi upravlja vaša organizacija. Nekateri elementi so morda skriti.</translation>
 <translation id="1622054403950683339">Pozaba omrežja Wi-Fi</translation>
 <translation id="1623132449929929218">Slike trenutno niso na voljo. Znova vzpostavite povezavo z internetom, če si želite ogledati zbirke ozadij.</translation>
 <translation id="1623723619460186680">Zmanjšanje modre svetlobe</translation>
@@ -839,6 +842,7 @@
 <translation id="1850508293116537636">&amp;Zasukaj v smeri urinega kazalca</translation>
 <translation id="1852141627593563189">Iskanje škodljive programske opreme</translation>
 <translation id="1852799913675865625">Pri poskusu branja datoteke je prišlo do napake: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Nadaljujte, kjer ste končali. V nastavitvah lahko nastavite, da se aplikacije ob zagonu vedno obnovijo, ali pa izklopite obnovitev.</translation>
 <translation id="1854180393107901205">Ustavi predvajanje</translation>
 <translation id="1855079636134697549">Kamera je vklopljena.</translation>
 <translation id="1856715684130786728">Dodaj lokacijo ...</translation>
@@ -968,6 +972,7 @@
 <translation id="1989113344093894667">Vsebine ni mogoče zajeti</translation>
 <translation id="1990046457226896323">Datoteke za govor so bile prenesene.</translation>
 <translation id="1990512225220753005">Ne prikaži bližnjic na tej strani</translation>
+<translation id="199191324030140441">Izklop načina Ne moti</translation>
 <translation id="1992397118740194946">Ni nastavljeno</translation>
 <translation id="1992924914582925289">Odstrani iz naprave</translation>
 <translation id="1994173015038366702">URL spletnega mesta</translation>
@@ -1009,6 +1014,7 @@
 
 Nastavitve tega računa je mogoče upravljati z namestitvijo aplikacije Family Link v napravi.  Po e-pošti smo vam poslali navodila.</translation>
 <translation id="2040460856718599782">Pri preverjanju pristnosti je prišlo do težav. Še enkrat preverite poverilnice za prijavo in poskusite znova.</translation>
+<translation id="2040894699575719559">Lokacija je blokirana</translation>
 <translation id="2042279886444479655">Aktivni profili</translation>
 <translation id="2044014337866019681">Prepričajte se, da zaradi odklepanja seje preverjate račun <ph name="ACCOUNT" />.</translation>
 <translation id="204497730941176055">Microsoftovo ime predloge potrdila</translation>
@@ -1495,6 +1501,7 @@
 <translation id="2527167509808613699">Kakršna koli povezava</translation>
 <translation id="2530166226437958497">Odpravljanje težav</translation>
 <translation id="2532589005999780174">Visokokontrastni način</translation>
+<translation id="2533649878691950253">Temu spletnemu mestu je onemogočen dostop do vaše natančne lokacije, ker običajno tega ne dovolite.</translation>
 <translation id="253434972992662860">&amp;Premor</translation>
 <translation id="253557089021624350">Štetje ohranjanja dejavnosti</translation>
 <translation id="2535799430745250929">Ni nobenega mobilnega omrežja</translation>
@@ -1682,6 +1689,7 @@
 <translation id="2738771556149464852">Ne po</translation>
 <translation id="2739191690716947896">Odpravljanje napak</translation>
 <translation id="2739240477418971307">Sprememba nastavitev funkcij za ljudi s posebnimi potrebami</translation>
+<translation id="2739965161385757621">Pregled nastavitev</translation>
 <translation id="274029851662193272">Znižano</translation>
 <translation id="2740531572673183784">V redu</translation>
 <translation id="2741713322780029189">Odpri terminal za obnovitev</translation>
@@ -1806,6 +1814,7 @@
 <translation id="2864601841139725659">Nastavitev slike za profil</translation>
 <translation id="2865919525181940183">Posnetek zaslona s programi, ki so trenutno na zaslon</translation>
 <translation id="286674810810214575">Preverjanje virov napajanja ...</translation>
+<translation id="2866876751734765554">Pregled zasebnosti</translation>
 <translation id="2867768963760577682">Odpri v pripetem zavihku</translation>
 <translation id="2868746137289129307">Ta razširitev je zastarela in jo je onemogočil pravilnik podjetja. Ko bo na voljo novejša različica, bo morda samodejno omogočena.</translation>
 <translation id="2870560284913253234">Spletno mesto</translation>
@@ -2335,6 +2344,7 @@
 <translation id="3446274660183028131">Zaženite program Parallels Desktop, če želite namestiti sistem Windows.</translation>
 <translation id="344630545793878684">Branje vaših podatkov na več spletnih mestih</translation>
 <translation id="3446650212859500694">V tej datoteki je občutljiva vsebina</translation>
+<translation id="3446827946208017735">Razlaga in pregled bistvenih nastavitev zasebnosti na enem mestu.</translation>
 <translation id="3448086340637592206">Dodatni pogoji za Google Chrome in Chrome OS</translation>
 <translation id="3448492834076427715">Posodobi račun</translation>
 <translation id="3449393517661170867">Novo okno z zavihki</translation>
@@ -3765,6 +3775,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Najden ni bil noben navidezni računalnik <ph name="VM_TYPE" />.}=1{Najden je bil 1 navidezni računalnik <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />.}one{Najden je bil {NUM_VMS} navidezni računalnik <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />.}two{Najdena sta bila {NUM_VMS} navideznega računalnika <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />.}few{Najdeno so bili {NUM_VMS} navidezni računalniki <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />.}other{Najdenih je bilo {NUM_VMS} navideznih računalnikov <ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />.}}</translation>
 <translation id="4997086284911172121">Ni internetne povezave.</translation>
 <translation id="4998430619171209993">Vklopljeno</translation>
+<translation id="4999804342505941663">Vklop načina Ne moti</translation>
 <translation id="5000922062037820727">Blokirano (priporočeno)</translation>
 <translation id="5005498671520578047">Kopiranje gesla</translation>
 <translation id="5006218871145547804">ADB za aplikacije za Android v Crostiniju</translation>
@@ -4275,6 +4286,7 @@
 <translation id="5565735124758917034">Aktivno</translation>
 <translation id="5567989639534621706">Predpomnilniki aplikacij</translation>
 <translation id="5568069709869097550">Vpis ni mogoč</translation>
+<translation id="5571092938913434726">Globalni kontrolniki predstavnosti</translation>
 <translation id="5571832155627049070">Prilagodite svoj profil</translation>
 <translation id="5572851009514199876">Začnite s prijavo v Chrome, da lahko Chrome preveri, ali vam je dovoljeno dostopati do tega spletnega mesta.</translation>
 <translation id="5575473780076478375">Anonimna razširitev: <ph name="EXTENSION_NAME" /></translation>
@@ -5090,6 +5102,7 @@
 <translation id="6468485451923838994">Pisave</translation>
 <translation id="6468773105221177474">Št. datotek: <ph name="FILE_COUNT" /></translation>
 <translation id="6469557521904094793">Vklop mobilnega omrežja</translation>
+<translation id="6470823736074966819">Izklop zvoka obvestil</translation>
 <translation id="6472893788822429178">Pokaži gumb »Domov«</translation>
 <translation id="6474498546677193336">Skupne rabe mape ni bilo mogoče preklicati, ker jo uporablja določena aplikacija. Skupna raba mape bo preklicana ob naslednji zaustavitvi Linuxa.</translation>
 <translation id="6474884162850599008">Prekinitev povezave z računom za Google Drive</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 7af42e1..3a9ad32 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -443,6 +443,7 @@
 <translation id="1476088332184200792">Kopjo te pajisja jote</translation>
 <translation id="1476607407192946488">&amp;Cilësimet e gjuhës</translation>
 <translation id="1477446329585670721"><ph name="DOMAIN" /> kërkon që ti ta mbash kartën tënde smart të futur.</translation>
+<translation id="1477654881618305065">Organizata jote nuk të lejon ta shpërndash këtë përmbajtje. Nëse ke nevojë për ndihmë, kontakto me administratorin.</translation>
 <translation id="1478340334823509079">Detajet: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Instalimi nuk është aktivizuar</translation>
 <translation id="1480571698637441426">Për të marrë përgjigje të personalizuara kur bën pyetje, lejo që "Asistenti" yt të ketë qasje te një pamje e gjërave që janë në ekran. Kjo mund të përfshijë informacione për këngët ose videot që janë duke u luajtur.</translation>
@@ -615,6 +616,7 @@
 <translation id="1643921258693943800">Për të përdorur "Ndarjen në afërsi", aktivizo Bluetooth-in dhe Wi-Fi</translation>
 <translation id="1644574205037202324">Historiku</translation>
 <translation id="1645516838734033527">Për ta mbajtur <ph name="DEVICE_TYPE" /> të sigurt, Smart Lock kërkon një kyçje ekrani në telefonin tënd.</translation>
+<translation id="1646793251510634025">Shqyrto cilësimet për optimizimin e kërkimit dhe të shfletimit</translation>
 <translation id="1646982517418478057">Fut një fjalëkalimin për të enkriptuar këtë certifikatë</translation>
 <translation id="1648528859488547844">Përdor Wi‑Fi ose rrjetet celulare për të përcaktuar vendndodhjen</translation>
 <translation id="164936512206786300">Anulo çiftimin me pajisjen me Bluetooth</translation>
@@ -1459,6 +1461,7 @@
 <translation id="2514326558286966059">Shkyç më shpejt me gjurmën e gishtit</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">Cakto edhe një çelës tjetër</translation>
+<translation id="251722524540674480">Konfirmo emrin tënd të përdoruesit</translation>
 <translation id="2517472476991765520">Skano</translation>
 <translation id="2518024842978892609">Përdor certifikatat e klientit</translation>
 <translation id="2519517390894391510">Emri i profilit të certifikatës</translation>
@@ -2162,6 +2165,7 @@
 <translation id="3288047731229977326">Shtesat që ekzekutohen në modalitetin e zhvilluesit mund ta dëmtojnë kompjuterin tënd. Nëse nuk je zhvillues, duhet t'i çaktivizosh këto shtesa që ekzekutohen në modalitetin "si zhvillues" për të qenë i sigurt.</translation>
 <translation id="3289668031376215426">Kapitalizim automatik</translation>
 <translation id="3289856944988573801">Për të kontrolluar për përditësime, përdor rrjetin Ethernet ose Wi-Fi.</translation>
+<translation id="3291436823898732747">Shfletim i përmirësuar: Për shembull, sugjerime në Omnibox përpara se të fillosh së shkruari</translation>
 <translation id="3293644607209440645">Dërgoje këtë faqe</translation>
 <translation id="32939749466444286">Kontejneri i Linux nuk filloi. Provo sërish.</translation>
 <translation id="3294437725009624529">Vizitor</translation>
@@ -4196,6 +4200,7 @@
 <translation id="5505307013568720083">Nuk ka bojë</translation>
 <translation id="5505794066310932198">Aktivizo/çaktivizo Commander</translation>
 <translation id="5507756662695126555">Anulimi i mospranimit</translation>
+<translation id="5507795078844206688">URL-ja e faqeve që viziton, p.sh. https://www.google.com</translation>
 <translation id="5509693895992845810">Ruaje &amp;si...</translation>
 <translation id="5509914365760201064">Lëshuesi: <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">Merr përshkrimet e imazhit nga Google</translation>
@@ -4248,6 +4253,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Memoriet specifike të aplikacionit</translation>
 <translation id="5568069709869097550">Nuk mund të identifkohet</translation>
+<translation id="5571092938913434726">Kontrollet globale të medias</translation>
 <translation id="5571832155627049070">Personalizo profilin tënd</translation>
 <translation id="5572851009514199876">Fillo dhe identifikohu në Chrome që Chrome të mund të kontrollojë nëse lejohesh të kesh qasje në këtë sajt.</translation>
 <translation id="5575473780076478375">Shtesë e fshehtë: <ph name="EXTENSION_NAME" /></translation>
@@ -4512,6 +4518,7 @@
 <translation id="5869522115854928033">Fjalëkalimet e ruajtura</translation>
 <translation id="5870086504539785141">Mbylle menynë e qasjes</translation>
 <translation id="5870155679953074650">Defekte të harduerit</translation>
+<translation id="5875534259258494936">Ndarja e ekranit mbaroi</translation>
 <translation id="5876576639916258720">Po ekzekutohet...</translation>
 <translation id="5876851302954717356">Skedë e re djathtas</translation>
 <translation id="5877064549588274448">Kanali ndryshoi. Rinise pajisjen tënde për të zbatuar ndryshimet.</translation>
@@ -5371,6 +5378,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> nuk mund të ekzekutohet si një rrënjë.</translation>
 <translation id="6812841287760418429">Mbaji ndryshimet</translation>
 <translation id="6813907279658683733">Ekrani i plotë</translation>
+<translation id="6814033694018386318">Çfarë ndan me Google</translation>
 <translation id="6817174620439930047">Pyet kur një faqe kërkon të përdorë mesazhe ekskluzive të sistemit për t'u qasur në pajisjet MIDI (rekomandohet)</translation>
 <translation id="6818198425579322765">Faqja "Gjuha në të cilën do të përkthehet"</translation>
 <translation id="6818802132960437751">Mbrojtje e integruar kundër viruseve</translation>
@@ -5866,6 +5874,7 @@
 <translation id="7374376573160927383">Menaxho pajisjet USB</translation>
 <translation id="7374461526650987610">Përpunuesit e protokollit</translation>
 <translation id="7375235221357833624">{0,plural, =1{Përditëso pajisjen brenda një ore}other{Përditëso pajisjen brenda # orësh}}</translation>
+<translation id="7376543451826039186">Shfletim më i shpejtë: Për shembull, ngarkim proaktiv i përmbajtjeje të mëtejshme specifike sipas faqes aktuale</translation>
 <translation id="7376553024552204454">Thekso kursorin e miut kur është në lëvizje</translation>
 <translation id="737728204345822099">Një regjistrim i vizitës sate në këtë sajt mund të ruhet në çelësin tënd të sigurisë.</translation>
 <translation id="7377451353532943397">Vazhdo të bllokosh qasjen te sensorët</translation>
@@ -5923,6 +5932,7 @@
 <translation id="7427798576651127129">Telefonatë nga <ph name="DEVICE_NAME" /></translation>
 <translation id="7431719494109538750">Nuk u gjetën pajisje HID</translation>
 <translation id="7431991332293347422">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin" dhe shumë të tjera</translation>
+<translation id="7432200167665670017">Administratori yt e ka bllokuar "<ph name="EXTENSION_NAME" />" - ID-ja e aplikacionit <ph name="EXTENSION_ID" /></translation>
 <translation id="7433708794692032816">Fut kartën smart për të vazhduar përdorimin e pajisjes sate <ph name="DEVICE_TYPE" /></translation>
 <translation id="7433957986129316853">Mbaje</translation>
 <translation id="7434509671034404296">Zhvilluesi</translation>
@@ -5952,6 +5962,7 @@
 <translation id="7460045493116006516">Tema aktuale që ke instaluar</translation>
 <translation id="7461924472993315131">Gozhdoje</translation>
 <translation id="746216226901520237">Herën tjetër, telefoni yt do të shkyçë pajisjen tënde <ph name="DEVICE_TYPE" />. Mund ta çaktivizosh Smart Lock te "Cilësimet".</translation>
+<translation id="7464637891177137294">Ruaje në "Llogarinë tënde të Google", <ph name="ACCOUNT" /></translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# skedë e hapur. Shtyp për të kaluar te shiriti i skedës.}other{# skeda të hapura. Shtyp për të kaluar te shiriti i skedës.}}</translation>
 <translation id="7465635034594602553">Ndodhi një gabim. Prit disa minuta dhe ekzekutoje përsëri <ph name="APP_NAME" />.</translation>
 <translation id="7465778193084373987">URL-ja e revokimit të certifikatës së Netscape</translation>
@@ -6015,6 +6026,7 @@
 <translation id="7525625923260515951">Dëgjo tekstin e zgjedhur</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 tjetër}other{{NUM_DOWNLOADS} të tjera}}</translation>
 <translation id="7526989658317409655">Vendmbajtësi</translation>
+<translation id="7527758104894292229">Përditësoje në "Llogarinë tënde të Google", <ph name="ACCOUNT" /></translation>
 <translation id="7529411698175791732">Kontrollo lidhjen e internetit. Nëse problemi vazhdon, provo të dalësh dhe të identifikohesh përsëri.</translation>
 <translation id="7529876053219658589">{0,plural, =1{Mbyll vizitorin}other{Mbyll vizitorin}}</translation>
 <translation id="7530016656428373557">Norma e shkarkimit në vat</translation>
@@ -6400,6 +6412,7 @@
 <translation id="7898725031477653577">Përkthe gjithmonë</translation>
 <translation id="790040513076446191">Manipulo cilësimet në lidhje me privatësinë</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
+<translation id="7901914889562552258">Përmirësim i Chrome duke përdorur metrikën e faqes</translation>
 <translation id="7903345046358933331">Faqja nuk po reagon. Mund të presësh deri sa të reagojë ose mund ta mbyllësh.</translation>
 <translation id="7903742244674067440">Ke certifikata në skedar që identifikojnë këto autoritete të certifikatave</translation>
 <translation id="7903859912536385558">i qëndrueshëm (testues i besuar)</translation>
@@ -6865,6 +6878,7 @@
 <translation id="8392364544846746346">Pyet kur një sajt dëshiron të modifikojë skedarë ose dosje në pajisjen tënde</translation>
 <translation id="8392451568018454956">Menyja e opsioneve për <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ndalo përbërësin shtesë</translation>
+<translation id="839363317075970734">Detajet e pajisjes me Bluetooth</translation>
 <translation id="8393700583063109961">Dërgo mesazh</translation>
 <translation id="8397825320644530257">Shkëput telefonin e lidhur</translation>
 <translation id="8398877366907290961">Vazhdo gjithsesi</translation>
@@ -7115,6 +7129,7 @@
 <translation id="8681614230122836773">Chrome gjeti softuer keqdashës në kompjuterin tënd</translation>
 <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> është lidhur dhe është gati</translation>
 <translation id="8683081248374354009">Rivendos grupin</translation>
+<translation id="8683526617475118045">Çfarë përfiton</translation>
 <translation id="8688672835843460752">E disponueshme</translation>
 <translation id="8690129572193755009">Sajtet mund të kërkojnë të menaxhojnë protokollet</translation>
 <translation id="8695139659682234808">Shto kontrollet prindërore pas konfigurimit</translation>
@@ -7168,6 +7183,7 @@
 <translation id="8737685506611670901">Hap lidhjet e <ph name="PROTOCOL" /> në vend të <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Promovuesi</translation>
 <translation id="8737914367566358838">Zgjidh gjuhën në të cilën do të përkthesh faqen</translation>
+<translation id="8737916108453753541">URL-të ndahen me Google për të kuptuar sjelljen e shfletimit</translation>
 <translation id="8740247629089392745">Këtë Chromebook mund t'ia dorëzosh <ph name="SUPERVISED_USER_NAME" />. Konfigurimi pothuajse mbaroi, më pas është koha për eksplorim.</translation>
 <translation id="8741944563400125534">Udhëzuesi i konfigurimit të "Qasjes me çelës"</translation>
 <translation id="8742998548129056176">Këto janë informacione të përgjithshme për pajisjen tënde dhe se si e përdor ti atë (si p.sh. niveli i baterisë, aktiviteti i sistemit dhe aplikacioneve dhe gabimet). Të dhënat do të përdoren për të përmirësuar Android dhe disa informacionet të përmbledhura do të ndihmojnë po ashtu aplikacionet dhe partnerët e Google, si p.sh. zhvilluesit e Android, të përmirësojnë aplikacionet dhe produktet e tyre.</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index f4ba17ad..0418f65 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314">Uvek prevodi <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Stop (Zaustavi)</translation>
 <translation id="1110155001042129815">Sačekaj</translation>
+<translation id="1111781754511998498">Projektor</translation>
 <translation id="1112420131909513020">Kartica u pozadini koristi Bluetooth</translation>
 <translation id="1113892970288677790">Odaberite neke od izabranih ilustracija i slika</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -530,6 +531,7 @@
 <translation id="156793199942386351">Taster <ph name="CURRENTKEY" /> je već dodeljen radnji <ph name="ACTION" />. Pritisnite bilo koji taster da biste <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">JavaScript konzola</translation>
 <translation id="1568323446248056064">Otvori podešavanja uređaja za ekran</translation>
+<translation id="1570604804919108255">Uključite zvuk obaveštenja</translation>
 <translation id="1571738973904005196">Prikaži karticu: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (gost)</translation>
 <translation id="1572266655485775982">Omogući WiFi</translation>
@@ -587,6 +589,7 @@
 <translation id="1621485112342885423">Korpe</translation>
 <translation id="1621729191093924223">Funkcije kojima je potreban mikrofon neće raditi</translation>
 <translation id="1621831347985899379">Podaci na uređaju <ph name="DEVICE_TYPE" /> će biti izbrisani</translation>
+<translation id="1621984899599015181">Opcijama za deljenje upravlja organizacija. Neke stavke će možda biti skrivene.</translation>
 <translation id="1622054403950683339">Zaboravi WiFi mrežu</translation>
 <translation id="1623132449929929218">Slike trenutno nisu dostupne. Ponovo se povežite na internet da biste pregledali kolekcije pozadina.</translation>
 <translation id="1623723619460186680">Smanjivanje plavog svetla</translation>
@@ -824,6 +827,7 @@
 <translation id="1850508293116537636">Okreći &amp;u smeru kretanja kazaljke na satu</translation>
 <translation id="1852141627593563189">Pronađite štetan softver</translation>
 <translation id="1852799913675865625">Došlo je do greške pri pokušaju čitanja datoteke: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Nastavite tamo gde ste stali. Možete da podesite aplikacije tako da se uvek vraćaju pri pokretanju ili da isključite vraćanje u Podešavanjima.</translation>
 <translation id="1854180393107901205">Zaustavi prebacivanje</translation>
 <translation id="1855079636134697549">Kamera je uključena</translation>
 <translation id="1856715684130786728">Dodaj lokaciju...</translation>
@@ -952,6 +956,7 @@
 <translation id="1989113344093894667">Snimanje sadržaja nije uspelo</translation>
 <translation id="1990046457226896323">Preuzeti su fajlovi govora</translation>
 <translation id="1990512225220753005">Ne prikazujte prečice na ovoj stranici</translation>
+<translation id="199191324030140441">Isključite režim Ne uznemiravaj</translation>
 <translation id="1992397118740194946">Nije podešeno</translation>
 <translation id="1992924914582925289">Ukloni sa uređaja</translation>
 <translation id="1994173015038366702">URL sajta</translation>
@@ -993,6 +998,7 @@
 
 Možete da upravljate podešavanjima ovog naloga ako instalirate aplikaciju Family Link na uređaju.  Poslali smo vam uputstva u imejlu.</translation>
 <translation id="2040460856718599782">Ups! Nešto je pošlo naopako dok smo pokušavali da potvrdimo vašu autentičnost. Proverite ponovo akreditive za prijavljivanje i pokušajte ponovo.</translation>
+<translation id="2040894699575719559">Lokacija je blokirana</translation>
 <translation id="2042279886444479655">Aktivni profili</translation>
 <translation id="2044014337866019681">Uverite se da verifikujete <ph name="ACCOUNT" /> da biste otključali sesiju.</translation>
 <translation id="204497730941176055">Naziv šablona Microsoft sertifikata</translation>
@@ -1476,6 +1482,7 @@
 <translation id="2527167509808613699">Bilo koja vrsta veze</translation>
 <translation id="2530166226437958497">Rešavanje problema</translation>
 <translation id="2532589005999780174">Režim visokog kontrasta</translation>
+<translation id="2533649878691950253">Ovom sajtu je zabranjen pristup vašoj preciznoj lokaciji jer obično to ne dozvoljavate</translation>
 <translation id="253434972992662860">&amp;Pauziraj</translation>
 <translation id="253557089021624350">Broj keepalive signala</translation>
 <translation id="2535799430745250929">Ne postoji nijedna mobilna mreža</translation>
@@ -1663,6 +1670,7 @@
 <translation id="2738771556149464852">Ne posle</translation>
 <translation id="2739191690716947896">Otkloni greške</translation>
 <translation id="2739240477418971307">Menjanje podešavanja pristupačnosti</translation>
+<translation id="2739965161385757621">Prikaži moja podešavanja</translation>
 <translation id="274029851662193272">Udubljeno</translation>
 <translation id="2740531572673183784">Potvrdi</translation>
 <translation id="2741713322780029189">Otvori terminal za oporavak</translation>
@@ -1787,6 +1795,7 @@
 <translation id="2864601841139725659">Podesite sliku profila</translation>
 <translation id="2865919525181940183">Snimak ekrana programa koji su trenutno na ekranu</translation>
 <translation id="286674810810214575">Proveravaju se izvori napajanja...</translation>
+<translation id="2866876751734765554">Pregled privatnosti</translation>
 <translation id="2867768963760577682">Otvori kao zakačenu karticu</translation>
 <translation id="2868746137289129307">Ovaj dodatak je zastareo i smernice za preduzeća ga onemogućavaju. Možda će automatski postati omogućen kada novija verzija postane dostupna.</translation>
 <translation id="2870560284913253234">Sajt</translation>
@@ -2316,6 +2325,7 @@
 <translation id="3446274660183028131">Pokrenite Parallels Desktop da biste instalirali Windows.</translation>
 <translation id="344630545793878684">Čitanje vaših podataka na više veb-sajtova</translation>
 <translation id="3446650212859500694">Ova datoteka sadrži osetljiv sadržaj</translation>
+<translation id="3446827946208017735">Razumite i pregledajte najvažnija podešavanja privatnosti na jednom mestu</translation>
 <translation id="3448086340637592206">Dodatni uslovi za Google Chrome i Chrome OS</translation>
 <translation id="3448492834076427715">Ažuriraj nalog</translation>
 <translation id="3449393517661170867">Novi prozor sa karticama</translation>
@@ -3745,6 +3755,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Nije pronađena nijedna virtuelna mašina <ph name="VM_TYPE" />}=1{Pronađena je 1 virtuelna mašina<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}one{Pronađena je{NUM_VMS} virtuelna mašina<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}few{Pronađene su{NUM_VMS} virtuelne mašine<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{Pronađeno je{NUM_VMS} virtuelnih mašina<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Nema internet veze.</translation>
 <translation id="4998430619171209993">Uključeno</translation>
+<translation id="4999804342505941663">Uključite režim Ne uznemiravaj</translation>
 <translation id="5000922062037820727">Blokirano (preporučeno)</translation>
 <translation id="5005498671520578047">Kopiranje lozinke</translation>
 <translation id="5006218871145547804">ADB za Android aplikacije za Crostini</translation>
@@ -4255,6 +4266,7 @@
 <translation id="5565735124758917034">Aktivno</translation>
 <translation id="5567989639534621706">Keševi aplikacija</translation>
 <translation id="5568069709869097550">Ne mogu da se prijavim</translation>
+<translation id="5571092938913434726">Globalne kontrole za medije</translation>
 <translation id="5571832155627049070">Prilagodite profil</translation>
 <translation id="5572851009514199876">Otvorite i prijavite se u Chrome da bi Chrome mogao da proveri da li imate dozvolu za pristup ovom sajtu.</translation>
 <translation id="5575473780076478375">Dodatak u režimu bez arhiviranja: <ph name="EXTENSION_NAME" /></translation>
@@ -5069,6 +5081,7 @@
 <translation id="6468485451923838994">Fontovi</translation>
 <translation id="6468773105221177474">Fajlova: <ph name="FILE_COUNT" /></translation>
 <translation id="6469557521904094793">Uključi mobilnu mrežu</translation>
+<translation id="6470823736074966819">Isključite zvuk obaveštenja</translation>
 <translation id="6472893788822429178">Prikaži dugme Početak</translation>
 <translation id="6474498546677193336">Opozivanje deljenja nije uspelo jer jedna aplikacija koristi ovaj direktorijum. Deljenje direktorijuma će biti opozvano kada se Linux sledeći put zatvori.</translation>
 <translation id="6474884162850599008">Prekini vezu sa nalogom Google diska</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index b3603e7..13cc2a5 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -99,6 +99,7 @@
 <translation id="1103523840287552314">Увек преводи <ph name="LANGUAGE" /></translation>
 <translation id="1108600514891325577">&amp;Stop (Заустави)</translation>
 <translation id="1110155001042129815">Сачекај</translation>
+<translation id="1111781754511998498">Пројектор</translation>
 <translation id="1112420131909513020">Картица у позадини користи Bluetooth</translation>
 <translation id="1113892970288677790">Одаберите неке од изабраних илустрација и слика</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
@@ -530,6 +531,7 @@
 <translation id="156793199942386351">Тастер <ph name="CURRENTKEY" /> је већ додељен радњи <ph name="ACTION" />. Притисните било који тастер да бисте <ph name="RESPONSE" />.</translation>
 <translation id="1567993339577891801">JavaScript конзола</translation>
 <translation id="1568323446248056064">Отвори подешавања уређаја за екран</translation>
+<translation id="1570604804919108255">Укључите звук обавештења</translation>
 <translation id="1571738973904005196">Прикажи картицу: <ph name="TAB_ORIGIN" /></translation>
 <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (гост)</translation>
 <translation id="1572266655485775982">Омогући WiFi</translation>
@@ -587,6 +589,7 @@
 <translation id="1621485112342885423">Корпе</translation>
 <translation id="1621729191093924223">Функције којима је потребан микрофон неће радити</translation>
 <translation id="1621831347985899379">Подаци на уређају <ph name="DEVICE_TYPE" /> ће бити избрисани</translation>
+<translation id="1621984899599015181">Опцијама за дељење управља организација. Неке ставке ће можда бити скривене.</translation>
 <translation id="1622054403950683339">Заборави WiFi мрежу</translation>
 <translation id="1623132449929929218">Слике тренутно нису доступне. Поново се повежите на интернет да бисте прегледали колекције позадина.</translation>
 <translation id="1623723619460186680">Смањивање плавог светла</translation>
@@ -824,6 +827,7 @@
 <translation id="1850508293116537636">Окрећи &amp;у смеру кретања казаљке на сату</translation>
 <translation id="1852141627593563189">Пронађите штетан софтвер</translation>
 <translation id="1852799913675865625">Дошло је до грешке при покушају читања датотеке: <ph name="ERROR_TEXT" />.</translation>
+<translation id="1854049213067042715">Наставите тамо где сте стали. Можете да подесите апликације тако да се увек враћају при покретању или да искључите враћање у Подешавањима.</translation>
 <translation id="1854180393107901205">Заустави пребацивање</translation>
 <translation id="1855079636134697549">Камера је укључена</translation>
 <translation id="1856715684130786728">Додај локацију...</translation>
@@ -952,6 +956,7 @@
 <translation id="1989113344093894667">Снимање садржаја није успело</translation>
 <translation id="1990046457226896323">Преузети су фајлови говора</translation>
 <translation id="1990512225220753005">Не приказујте пречице на овој страници</translation>
+<translation id="199191324030140441">Искључите режим Не узнемиравај</translation>
 <translation id="1992397118740194946">Није подешено</translation>
 <translation id="1992924914582925289">Уклони са уређаја</translation>
 <translation id="1994173015038366702">URL сајта</translation>
@@ -993,6 +998,7 @@
 
 Можете да управљате подешавањима овог налога ако инсталирате апликацију Family Link на уређају.  Послали смо вам упутства у имејлу.</translation>
 <translation id="2040460856718599782">Упс! Нешто је пошло наопако док смо покушавали да потврдимо вашу аутентичност. Проверите поново акредитиве за пријављивање и покушајте поново.</translation>
+<translation id="2040894699575719559">Локација је блокирана</translation>
 <translation id="2042279886444479655">Активни профили</translation>
 <translation id="2044014337866019681">Уверите се да верификујете <ph name="ACCOUNT" /> да бисте откључали сесију.</translation>
 <translation id="204497730941176055">Назив шаблона Microsoft сертификата</translation>
@@ -1476,6 +1482,7 @@
 <translation id="2527167509808613699">Било која врста везе</translation>
 <translation id="2530166226437958497">Решавање проблема</translation>
 <translation id="2532589005999780174">Режим високог контраста</translation>
+<translation id="2533649878691950253">Овом сајту је забрањен приступ вашој прецизној локацији јер обично то не дозвољавате</translation>
 <translation id="253434972992662860">&amp;Паузирај</translation>
 <translation id="253557089021624350">Број keepalive сигнала</translation>
 <translation id="2535799430745250929">Не постоји ниједна мобилна мрежа</translation>
@@ -1663,6 +1670,7 @@
 <translation id="2738771556149464852">Не после</translation>
 <translation id="2739191690716947896">Отклони грешке</translation>
 <translation id="2739240477418971307">Мењање подешавања приступачности</translation>
+<translation id="2739965161385757621">Прикажи моја подешавања</translation>
 <translation id="274029851662193272">Удубљено</translation>
 <translation id="2740531572673183784">Потврди</translation>
 <translation id="2741713322780029189">Отвори терминал за опоравак</translation>
@@ -1787,6 +1795,7 @@
 <translation id="2864601841139725659">Подесите слику профила</translation>
 <translation id="2865919525181940183">Снимак екрана програма који су тренутно на екрану</translation>
 <translation id="286674810810214575">Проверавају се извори напајања...</translation>
+<translation id="2866876751734765554">Преглед приватности</translation>
 <translation id="2867768963760577682">Отвори као закачену картицу</translation>
 <translation id="2868746137289129307">Овај додатак је застарео и смернице за предузећа га онемогућавају. Можда ће аутоматски постати омогућен када новија верзија постане доступна.</translation>
 <translation id="2870560284913253234">Сајт</translation>
@@ -2316,6 +2325,7 @@
 <translation id="3446274660183028131">Покрените Parallels Desktop да бисте инсталирали Windows.</translation>
 <translation id="344630545793878684">Читање ваших података на више веб-сајтова</translation>
 <translation id="3446650212859500694">Ова датотека садржи осетљив садржај</translation>
+<translation id="3446827946208017735">Разумите и прегледајте најважнија подешавања приватности на једном месту</translation>
 <translation id="3448086340637592206">Додатни услови за Google Chrome и Chrome ОС</translation>
 <translation id="3448492834076427715">Ажурирај налог</translation>
 <translation id="3449393517661170867">Нови прозор са картицама</translation>
@@ -3745,6 +3755,7 @@
 <translation id="4996851818599058005">{NUM_VMS,plural, =0{Није пронађена ниједна виртуелна машина <ph name="VM_TYPE" />}=1{Пронађена је 1 виртуелна машина<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}one{Пронађена је{NUM_VMS} виртуелна машина<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}few{Пронађене су{NUM_VMS} виртуелне машине<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}other{Пронађено је{NUM_VMS} виртуелних машина<ph name="VM_TYPE" />: <ph name="VM_NAME_LIST" />}}</translation>
 <translation id="4997086284911172121">Нема интернет везе.</translation>
 <translation id="4998430619171209993">Укључено</translation>
+<translation id="4999804342505941663">Укључите режим Не узнемиравај</translation>
 <translation id="5000922062037820727">Блокирано (препоручено)</translation>
 <translation id="5005498671520578047">Копирање лозинке</translation>
 <translation id="5006218871145547804">ADB за Android апликације за Crostini</translation>
@@ -4255,6 +4266,7 @@
 <translation id="5565735124758917034">Активно</translation>
 <translation id="5567989639534621706">Кешеви апликација</translation>
 <translation id="5568069709869097550">Не могу да се пријавим</translation>
+<translation id="5571092938913434726">Глобалне контроле за медије</translation>
 <translation id="5571832155627049070">Прилагодите профил</translation>
 <translation id="5572851009514199876">Отворите и пријавите се у Chrome да би Chrome могао да провери да ли имате дозволу за приступ овом сајту.</translation>
 <translation id="5575473780076478375">Додатак у режиму без архивирања: <ph name="EXTENSION_NAME" /></translation>
@@ -5069,6 +5081,7 @@
 <translation id="6468485451923838994">Фонтови</translation>
 <translation id="6468773105221177474">Фајлова: <ph name="FILE_COUNT" /></translation>
 <translation id="6469557521904094793">Укључи мобилну мрежу</translation>
+<translation id="6470823736074966819">Искључите звук обавештења</translation>
 <translation id="6472893788822429178">Прикажи дугме Почетак</translation>
 <translation id="6474498546677193336">Опозивање дељења није успело јер једна апликација користи овај директоријум. Дељење директоријума ће бити опозвано када се Linux следећи пут затвори.</translation>
 <translation id="6474884162850599008">Прекини везу са налогом Google диска</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 8a4c74c..e5e49b2b 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5567989639534621706">Programmets cacheminnen</translation>
 <translation id="5568069709869097550">Kan inte logga in</translation>
+<translation id="5571092938913434726">Globala mediareglage</translation>
 <translation id="5571832155627049070">Anpassa din profil</translation>
 <translation id="5572851009514199876">Logga in på Chrome så att Chrome kan kontrollera om du har tillgång till den här webbplatsen.</translation>
 <translation id="5575473780076478375">Inkognitotilläggsprogram: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 6e98813..de80a65 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -4266,6 +4266,7 @@
 <translation id="5565735124758917034">Inatumika</translation>
 <translation id="5567989639534621706">Akiba za programu</translation>
 <translation id="5568069709869097550">Siwezi kuingia</translation>
+<translation id="5571092938913434726">Vidhibiti vya Jumla vya Maudhui</translation>
 <translation id="5571832155627049070">Weka mapendeleo kwenye wasifu wako</translation>
 <translation id="5572851009514199876">Tafadhali anza na uingie katika Chrome ili Chrome iangalie ikiwa unaruhusiwa kufikia tovuti hii.</translation>
 <translation id="5575473780076478375">Kiendelezi kilicho katika hali fiche: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 466b356..0c02fbf 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -4267,6 +4267,7 @@
 <translation id="5565735124758917034">செயலில் உள்ளது</translation>
 <translation id="5567989639534621706">ஆப்ஸ் தற்காலிக சேமிப்புகள்</translation>
 <translation id="5568069709869097550">உள்நுழைய முடியவில்லை</translation>
+<translation id="5571092938913434726">மொத்த மீடியாவின் கட்டுப்பாடுகள்</translation>
 <translation id="5571832155627049070">உங்கள் சுயவிவரத்தைப் பிரத்தியேகமாக்குங்கள்</translation>
 <translation id="5572851009514199876">Chromeமைத் தொடங்கி உள்நுழையவும். அப்போதுதான் இந்தத் தளத்தை அணுகுவதற்கு உங்களுக்கு அனுமதி உள்ளதா என்பதை Chrome சரிபார்க்க முடியும்.</translation>
 <translation id="5575473780076478375">மறைநிலை நீட்டிப்பு: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index da1261f1..3c932d0 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4266,6 +4266,7 @@
 <translation id="5565735124758917034">సక్రియం</translation>
 <translation id="5567989639534621706">అప్లికేషన్ కాష్‌లు</translation>
 <translation id="5568069709869097550">సైన్ ఇన్ చేయడం సాధ్యపడలేదు</translation>
+<translation id="5571092938913434726">గ్లోబల్ మీడియా నియంత్రణలు</translation>
 <translation id="5571832155627049070">మీ ప్రొఫైల్‌ను తగినట్టుగా మార్చుకోండి</translation>
 <translation id="5572851009514199876">దయచేసి Chromeను ప్రారంభించి, దానికి సైన్ ఇన్ చేయండి, అప్పుడు ఈ సైట్‌ను యాక్సెస్ చేయడానికి మీకు అనుమతి ఉందో లేదో Chrome తనిఖీ చేయగలదు.</translation>
 <translation id="5575473780076478375">అజ్ఞాత ఎక్స్‌టెన్‌షన్: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 76efbcd..608c746 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -4255,6 +4255,7 @@
 <translation id="5565735124758917034">ใช้งานอยู่</translation>
 <translation id="5567989639534621706">แคชของแอปพลิเคชัน</translation>
 <translation id="5568069709869097550">ไม่สามารถลงชื่อเข้าใช้</translation>
+<translation id="5571092938913434726">การควบคุมสื่อส่วนกลาง</translation>
 <translation id="5571832155627049070">กำหนดค่าโปรไฟล์ของคุณ</translation>
 <translation id="5572851009514199876">โปรดเปิดและลงชื่อเข้าใช้ Chrome เพื่อให้ Chrome ตรวจสอบได้ว่าคุณได้รับอนุญาตให้เข้าถึงไซต์นี้หรือไม่</translation>
 <translation id="5575473780076478375">ส่วนขยายแบบไม่ระบุตัวตน: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 53998323..336d24c 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4254,6 +4254,7 @@
 <translation id="5565735124758917034">Etkin</translation>
 <translation id="5567989639534621706">Uygulama önbellekleri</translation>
 <translation id="5568069709869097550">Oturum açılamıyor</translation>
+<translation id="5571092938913434726">Genel Medya Denetimleri</translation>
 <translation id="5571832155627049070">Profilinizi özelleştirin</translation>
 <translation id="5572851009514199876">Chrome'un bu siteye erişmenize izin verilip verilmediğini kontrol edebilmesi için lütfen Chrome'u başlatıp oturum açın.</translation>
 <translation id="5575473780076478375">Gizli Mod Uzantısı: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 02deff2..6e962c4 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -4275,6 +4275,7 @@
 <translation id="5565735124758917034">Активний клієнт</translation>
 <translation id="5567989639534621706">Кеші програми</translation>
 <translation id="5568069709869097550">Не вдалося ввійти</translation>
+<translation id="5571092938913434726">Загальні елементи керування медіа</translation>
 <translation id="5571832155627049070">Налаштуйте свій профіль</translation>
 <translation id="5572851009514199876">Увійдіть в обліковий запис Chrome, щоб веб-переглядач міг перевірити, чи ви маєте дозвіл відвідувати цей сайт.</translation>
 <translation id="5575473780076478375">Розширення в режимі анонімного перегляду: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index ae1eff2d..a0a637c 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -4250,6 +4250,7 @@
 <translation id="5565735124758917034">فعال</translation>
 <translation id="5567989639534621706">ایپلیکیشن کیشیز</translation>
 <translation id="5568069709869097550">سائن نہیں کیا جا سکتا ہے</translation>
+<translation id="5571092938913434726">گلوبل میڈیا کنٹرولز</translation>
 <translation id="5571832155627049070">اپنی پروفائل حسب ضرورت بنائیں</translation>
 <translation id="5572851009514199876">‏براہ کرم شروع کریں اور Chrome میں سائن ان کریں تاکہ Chrome یہ چیک کر سکے کہ آیا آپ کو اس سائٹ تک رسائی کی اجازت ہے۔</translation>
 <translation id="5575473780076478375">پوشیدگی ایکسٹینشن: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 1d6f377..da1399a 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -4259,6 +4259,7 @@
 <translation id="5565735124758917034">Faol</translation>
 <translation id="5567989639534621706">Ilova keshlari</translation>
 <translation id="5568069709869097550">Kirish amalga oshmadi</translation>
+<translation id="5571092938913434726">Global media boshqaruv elementlari</translation>
 <translation id="5571832155627049070">Profilingizni moslang</translation>
 <translation id="5572851009514199876">Chrome brauzerini ishga tushiring va hisobingizga kiring. Shundan keyin Chrome bu saytga ruxsat berilganini tekshira oladi.</translation>
 <translation id="5575473780076478375">Inkognito rejimidagi kengaytma: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 53470ae..ade3345 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -446,6 +446,7 @@
 <translation id="1476088332184200792">Sao chép vào Thiết bị của bạn</translation>
 <translation id="1476607407192946488">&amp;Cài đặt ngôn ngữ</translation>
 <translation id="1477446329585670721"><ph name="DOMAIN" /> yêu cầu bạn không tháo thẻ thông minh.</translation>
+<translation id="1477654881618305065">Tổ chức của bạn không cho phép bạn chia sẻ nội dung này. Nếu bạn cần trợ giúp, hãy liên hệ với quản trị viên của mình.</translation>
 <translation id="1478340334823509079">Chi tiết: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Cài đặt chưa được bật</translation>
 <translation id="1480571698637441426">Để nhận được các câu trả lời phù hợp khi bạn đặt câu hỏi, hãy cho phép Trợ lý truy cập vào ảnh chụp những thông tin có trên màn hình của bạn. Trợ lý cũng có thể dùng thông tin về các bài hát hoặc video đang phát.</translation>
@@ -621,6 +622,7 @@
 <translation id="1643921258693943800">Để dùng tính năng Chia sẻ lân cận, hãy bật Bluetooth và Wi-Fi</translation>
 <translation id="1644574205037202324">Nhật ký</translation>
 <translation id="1645516838734033527">Để giữ an toàn cho <ph name="DEVICE_TYPE" />, Smart Lock yêu cầu phải bật khóa màn hình trên điện thoại của bạn.</translation>
+<translation id="1646793251510634025">Xem xét các chế độ cài đặt để tối ưu hóa tìm kiếm và duyệt web</translation>
 <translation id="1646982517418478057">Vui lòng nhập mật khẩu để mã hóa chứng chỉ này</translation>
 <translation id="1648528859488547844">Sử dụng Wi‑Fi hoặc mạng di động để xác định vị trí</translation>
 <translation id="164936512206786300">Hủy ghép nối thiết bị Bluetooth</translation>
@@ -1476,6 +1478,7 @@
 <translation id="2514326558286966059">Mở khóa nhanh hơn bằng vân tay</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">Chỉ định một công tắc khác</translation>
+<translation id="251722524540674480">Xác nhận tên người dùng</translation>
 <translation id="2517472476991765520">Quét</translation>
 <translation id="2518024842978892609">Sử dụng chứng chỉ ứng dụng</translation>
 <translation id="2519517390894391510">Tên hồ sơ chứng chỉ</translation>
@@ -2180,6 +2183,7 @@
 <translation id="3288047731229977326">Tiện ích chạy ở chế độ nhà phát triển có thể gây hại cho máy tính của bạn. Nếu bạn không phải là nhà phát triển, bạn nên vô hiệu hóa các tiện ích này chạy trong chế độ nhà phát triển để giữ an toàn.</translation>
 <translation id="3289668031376215426">Tự động viết hoa</translation>
 <translation id="3289856944988573801">Để kiểm tra các cập nhật, hãy sử dụng kết nối Ethernet hoặc Wi-Fi.</translation>
+<translation id="3291436823898732747">Duyệt web dễ dàng hơn: Chẳng hạn, các đề xuất sẽ xuất hiện trong Thanh địa chỉ trước khi bạn bắt đầu nhập</translation>
 <translation id="3293644607209440645">Gửi trang này</translation>
 <translation id="32939749466444286">Vùng chứa Linux không khởi động. Vui lòng thử lại.</translation>
 <translation id="3294437725009624529">Khách</translation>
@@ -4215,6 +4219,7 @@
 <translation id="5505307013568720083">Hết mực</translation>
 <translation id="5505794066310932198">Bật/tắt tính năng Commander</translation>
 <translation id="5507756662695126555">Không tuân thủ</translation>
+<translation id="5507795078844206688">URL của các trang bạn truy cập, ví dụ: https://www.google.com</translation>
 <translation id="5509693895992845810">Lưu &amp;Dưới dạng...</translation>
 <translation id="5509914365760201064">Nhà cung cấp: <ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">Lấy nội dung mô tả hình ảnh từ Google</translation>
@@ -4267,6 +4272,7 @@
 <translation id="5565735124758917034">Đang hoạt động</translation>
 <translation id="5567989639534621706">Bộ nhớ đệm của ứng dụng</translation>
 <translation id="5568069709869097550">Không thể đăng nhập</translation>
+<translation id="5571092938913434726">Global Media Controls</translation>
 <translation id="5571832155627049070">Tùy chỉnh hồ sơ của bạn</translation>
 <translation id="5572851009514199876">Vui lòng khởi động và đăng nhập vào Chrome để Chrome có thể kiểm tra xem bạn có được phép truy cập trang web này không.</translation>
 <translation id="5575473780076478375">Tiện ích Ẩn danh: <ph name="EXTENSION_NAME" /></translation>
@@ -4531,6 +4537,7 @@
 <translation id="5869522115854928033">Mật khẩu đã lưu</translation>
 <translation id="5870086504539785141">Đóng trình đơn hỗ trợ tiếp cận</translation>
 <translation id="5870155679953074650">Lỗi phần cứng</translation>
+<translation id="5875534259258494936">Đã dừng chia sẻ màn hình</translation>
 <translation id="5876576639916258720">Đang chạy...</translation>
 <translation id="5876851302954717356">Thẻ mới ở bên phải</translation>
 <translation id="5877064549588274448">Kênh đã thay đổi. Hãy khởi động lại thiết bị để áp dụng thay đổi.</translation>
@@ -5390,6 +5397,7 @@
 <translation id="6812349420832218321">Không thể chạy <ph name="PRODUCT_NAME" /> như chương trình gốc.</translation>
 <translation id="6812841287760418429">Lưu thay đổi</translation>
 <translation id="6813907279658683733">Toàn màn hình</translation>
+<translation id="6814033694018386318">Những gì bạn chia sẻ với Google</translation>
 <translation id="6817174620439930047">Hỏi tôi khi có trang web muốn sử dụng thông báo dành riêng cho hệ thống để truy cập thiết bị MIDI (được đề xuất)</translation>
 <translation id="6818198425579322765">Ngôn ngữ trang cần dịch</translation>
 <translation id="6818802132960437751">Tính năng chống vi-rút tích hợp sẵn</translation>
@@ -5885,6 +5893,7 @@
 <translation id="7374376573160927383">Quản lý các thiết bị USB</translation>
 <translation id="7374461526650987610">Trình xử lý giao thức</translation>
 <translation id="7375235221357833624">{0,plural, =1{Cập nhật thiết bị trong vòng một giờ}other{Cập nhật thiết bị trong vòng # giờ}}</translation>
+<translation id="7376543451826039186">Duyệt web nhanh hơn: Chẳng hạn, trình duyệt sẽ chủ động tải thêm nội dung cụ thể dựa trên trang hiện tại</translation>
 <translation id="7376553024552204454">Đánh dấu con trỏ chuột khi đang di chuyển</translation>
 <translation id="737728204345822099">Khóa bảo mật có thể lưu giữ bản ghi lượt truy cập của bạn vào trang web này.</translation>
 <translation id="7377451353532943397">Tiếp tục chặn quyền sử dụng cảm biến</translation>
@@ -5942,6 +5951,7 @@
 <translation id="7427798576651127129">Gọi từ <ph name="DEVICE_NAME" /></translation>
 <translation id="7431719494109538750">Không tìm thấy thiết bị HID</translation>
 <translation id="7431991332293347422">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm và các dịch vụ khác</translation>
+<translation id="7432200167665670017">Quản trị viên đã chặn "<ph name="EXTENSION_NAME" />" – Mã ứng dụng <ph name="EXTENSION_ID" /></translation>
 <translation id="7433708794692032816">Lắp thẻ thông minh để tiếp tục sử dụng <ph name="DEVICE_TYPE" /> của bạn</translation>
 <translation id="7433957986129316853">Giữ nguyên</translation>
 <translation id="7434509671034404296">Nhà phát triển</translation>
@@ -5971,6 +5981,7 @@
 <translation id="7460045493116006516">Giao diện hiện tại mà bạn đã cài đặt</translation>
 <translation id="7461924472993315131">Ghim</translation>
 <translation id="746216226901520237">Vào lần tới, điện thoại của bạn sẽ mở khóa <ph name="DEVICE_TYPE" />. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation>
+<translation id="7464637891177137294">Lưu mật khẩu vào Tài khoản Google của bạn, <ph name="ACCOUNT" /></translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# thẻ đang mở, nhấn để ẩn/hiện thanh thẻ}other{# thẻ đang mở, nhấn để ẩn/hiện thanh thẻ}}</translation>
 <translation id="7465635034594602553">Đã xảy ra lỗi. Vui lòng đợi vài phút rồi chạy lại <ph name="APP_NAME" />.</translation>
 <translation id="7465778193084373987">ULR Thu hồi của Tổ chức Cấp Chứng chỉ Netscape</translation>
@@ -6034,6 +6045,7 @@
 <translation id="7525625923260515951">Nghe văn bản đã chọn</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 mục khác}other{{NUM_DOWNLOADS} mục khác}}</translation>
 <translation id="7526989658317409655">Trình giữ chỗ</translation>
+<translation id="7527758104894292229">Cập nhật mật khẩu trong Tài khoản Google của bạn, <ph name="ACCOUNT" /></translation>
 <translation id="7529411698175791732">Kiểm tra kết nối Internet. Nếu sự cố vẫn tiếp diễn, hãy thử đăng xuất và đăng nhập lại.</translation>
 <translation id="7529876053219658589">{0,plural, =1{Đóng cửa sổ khách}other{Đóng cửa sổ khách}}</translation>
 <translation id="7530016656428373557">Tốc độ phóng điện tính bằng Watt</translation>
@@ -6421,6 +6433,7 @@
 <translation id="7898725031477653577">Luôn dịch</translation>
 <translation id="790040513076446191">Thực hiện cài đặt liên quan đến bảo mật</translation>
 <translation id="7901405293566323524">Trung tâm điều khiển điện thoại</translation>
+<translation id="7901914889562552258">Cải thiện Chrome bằng cách sử dụng các chỉ số trang</translation>
 <translation id="7903345046358933331">Trang không hồi đáp. Bạn có thể chờ trang hồi đáp hoặc đóng trang.</translation>
 <translation id="7903742244674067440">Bạn có các chứng chỉ trên tệp có thể nhận dạng các tổ chức cấp chứng chỉ này</translation>
 <translation id="7903859912536385558">chính thức (người kiểm tra tin cậy)</translation>
@@ -6887,6 +6900,7 @@
 <translation id="8392364544846746346">Hỏi khi một trang web muốn chỉnh sửa tệp hoặc thư mục trên thiết bị</translation>
 <translation id="8392451568018454956">Menu tùy chọn dành cho <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ngừng plugin</translation>
+<translation id="839363317075970734">Thông tin chi tiết về thiết bị Bluetooth</translation>
 <translation id="8393700583063109961">Gửi tin nhắn</translation>
 <translation id="8397825320644530257">Ngắt kết nối điện thoại đã kết nối</translation>
 <translation id="8398877366907290961">Tiếp tục truy cập</translation>
@@ -7137,6 +7151,7 @@
 <translation id="8681614230122836773">Chrome đã phát hiện thấy phần mềm có hại trên máy tính của bạn</translation>
 <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> đã kết nối và sẵn sàng sử dụng</translation>
 <translation id="8683081248374354009">Đặt lại nhóm</translation>
+<translation id="8683526617475118045">Lợi ích dành cho bạn</translation>
 <translation id="8688672835843460752">Có sẵn</translation>
 <translation id="8690129572193755009">Trang web có thể yêu cầu xử lý các giao thức</translation>
 <translation id="8695139659682234808">Thêm các quyền kiểm soát của cha mẹ sau khi thiết lập</translation>
@@ -7190,6 +7205,7 @@
 <translation id="8737685506611670901">Mở đường liên kết <ph name="PROTOCOL" /> thay vì <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Chọn ngôn ngữ mà trang sẽ được dịch sang</translation>
+<translation id="8737916108453753541">Các URL được chia sẻ với Google để giúp chúng tôi hiểu về hành vi duyệt web</translation>
 <translation id="8740247629089392745">Bạn có thể đưa lại Chromebook này cho <ph name="SUPERVISED_USER_NAME" />. Sắp thiết lập xong. Hãy chuẩn bị khám phá.</translation>
 <translation id="8741944563400125534">Hướng dẫn thiết lập tính năng Tiếp cận bằng công tắc</translation>
 <translation id="8742998548129056176">Đây là thông tin chung về thiết bị và cách bạn sử dụng thiết bị (như mức pin, hoạt động của ứng dụng và hệ thống cũng như các lỗi). Dữ liệu này sẽ dùng để cải thiện Android và một số thông tin tổng hợp cũng sẽ giúp các ứng dụng và đối tác của Google, chẳng hạn như nhà phát triển Android, cải thiện ứng dụng và sản phẩm của họ.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 12fede7..06413c0 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -4246,6 +4246,7 @@
 <translation id="5565735124758917034">主动</translation>
 <translation id="5567989639534621706">应用缓存</translation>
 <translation id="5568069709869097550">无法登录</translation>
+<translation id="5571092938913434726">全局媒体控件</translation>
 <translation id="5571832155627049070">自定义您的个人资料</translation>
 <translation id="5572851009514199876">请启动并登录 Chrome,以便 Chrome 能够检查您是否可以访问此网站。</translation>
 <translation id="5575473780076478375">隐身模式下使用的应用...<ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index ed27214f..793f9b2e 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -4271,6 +4271,7 @@
 <translation id="5565735124758917034">啟用</translation>
 <translation id="5567989639534621706">應用程式快取</translation>
 <translation id="5568069709869097550">無法登入</translation>
+<translation id="5571092938913434726">全域媒體控制項</translation>
 <translation id="5571832155627049070">自訂你的設定檔</translation>
 <translation id="5572851009514199876">請啟動 Chrome 並登入帳戶,讓 Chrome 確認您是否擁有此網站的存取權。</translation>
 <translation id="5575473780076478375">無痕模式擴充功能:<ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 83cecdf..d64787a 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -443,6 +443,7 @@
 <translation id="1476088332184200792">複製到你的裝置</translation>
 <translation id="1476607407192946488">語言設定(&amp;L)</translation>
 <translation id="1477446329585670721"><ph name="DOMAIN" /> 需要你插入智慧型卡片,不得拔出。</translation>
+<translation id="1477654881618305065">貴機構不允許你分享這項內容。如需協助,請與系統管理員聯絡。</translation>
 <translation id="1478340334823509079">詳細資料:<ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">未啟用安裝功能</translation>
 <translation id="1480571698637441426">如要在提問後取得更貼近個人需求的回覆,請允許 Google 助理存取畫面內容的螢幕截圖,這也包括當下所播放歌曲或影片的相關資訊。</translation>
@@ -618,6 +619,7 @@
 <translation id="1643921258693943800">如要使用鄰近分享功能,請開啟藍牙功能和 Wi-Fi</translation>
 <translation id="1644574205037202324">歷史記錄</translation>
 <translation id="1645516838734033527">為了確保你的 <ph name="DEVICE_TYPE" /> 安全無虞,你必須為手機啟用螢幕鎖定,才能使用 Smart Lock。</translation>
+<translation id="1646793251510634025">查看搜尋和瀏覽最佳化設定</translation>
 <translation id="1646982517418478057">請輸入加密這個憑證時所使用的密碼</translation>
 <translation id="1648528859488547844">使用 Wi-Fi 或行動網路判斷所在位置</translation>
 <translation id="164936512206786300">取消配對藍牙裝置</translation>
@@ -1461,6 +1463,7 @@
 <translation id="2514326558286966059">使用指紋快速解鎖</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2515807442171220586">再多指派一個開關</translation>
+<translation id="251722524540674480">確認你的使用者名稱</translation>
 <translation id="2517472476991765520">掃描</translation>
 <translation id="2518024842978892609">使用您的用戶端憑證</translation>
 <translation id="2519517390894391510">憑證設定檔名稱</translation>
@@ -2165,6 +2168,7 @@
 <translation id="3288047731229977326">在開發人員模式中執行擴充功能可能會損害你的電腦。如果你不是開發人員,最好在開發人員模式中停用這些擴充功能,以策安全。</translation>
 <translation id="3289668031376215426">自動大寫</translation>
 <translation id="3289856944988573801">如要檢查更新,請使用乙太網路或 Wi-Fi。</translation>
+<translation id="3291436823898732747">提升瀏覽體驗:舉例來說,在你開始輸入內容前,系統會在網址列顯示建議</translation>
 <translation id="3293644607209440645">傳送這個頁面</translation>
 <translation id="32939749466444286">無法啟動 Linux 容器,請再試一次。</translation>
 <translation id="3294437725009624529">訪客</translation>
@@ -4198,6 +4202,7 @@
 <translation id="5505307013568720083">墨水已用盡</translation>
 <translation id="5505794066310932198">切換指令工具</translation>
 <translation id="5507756662695126555">不可否認性</translation>
+<translation id="5507795078844206688">你造訪的網頁網址,例如 https://www.google.com</translation>
 <translation id="5509693895992845810">另存為(&amp;A)...</translation>
 <translation id="5509914365760201064">發行者:<ph name="CERTIFICATE_AUTHORITY" /></translation>
 <translation id="5510775624736435856">從 Google 取得圖片說明</translation>
@@ -4250,6 +4255,7 @@
 <translation id="5565735124758917034">管理中</translation>
 <translation id="5567989639534621706">應用程式快取</translation>
 <translation id="5568069709869097550">無法登入</translation>
+<translation id="5571092938913434726">全域媒體控制項</translation>
 <translation id="5571832155627049070">自訂你的設定檔</translation>
 <translation id="5572851009514199876">請啟動 Chrome 並登入帳戶,Chrome 將確認你是否可存取這個網站。</translation>
 <translation id="5575473780076478375">無痕模式擴充功能:<ph name="EXTENSION_NAME" /></translation>
@@ -4514,6 +4520,7 @@
 <translation id="5869522115854928033">已儲存的密碼</translation>
 <translation id="5870086504539785141">關閉無障礙選單</translation>
 <translation id="5870155679953074650">硬性錯誤數</translation>
+<translation id="5875534259258494936">已終止分享螢幕畫面</translation>
 <translation id="5876576639916258720">執行中…</translation>
 <translation id="5876851302954717356">在右側新增分頁</translation>
 <translation id="5877064549588274448">版本已變更。請重新啟動裝置以套用變更。</translation>
@@ -5373,6 +5380,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> 無法以根使用者的身分執行。</translation>
 <translation id="6812841287760418429">保留變更</translation>
 <translation id="6813907279658683733">整個螢幕畫面</translation>
+<translation id="6814033694018386318">提供給 Google 的資訊</translation>
 <translation id="6817174620439930047">每當有網站要使用系統專用訊息存取 MIDI 裝置時詢問我 (建議使用)</translation>
 <translation id="6818198425579322765">要翻譯的網頁語言</translation>
 <translation id="6818802132960437751">內建防毒機制</translation>
@@ -5868,6 +5876,7 @@
 <translation id="7374376573160927383">管理 USB 裝置</translation>
 <translation id="7374461526650987610">通訊協定處理常式</translation>
 <translation id="7375235221357833624">{0,plural, =1{請在 1 小時內更新裝置}other{請在 # 小時內更新裝置}}</translation>
+<translation id="7376543451826039186">加快瀏覽速度:舉例來說,系統會根據當前網頁主動載入特定的詳細內容</translation>
 <translation id="7376553024552204454">滑鼠游標移動時醒目顯示</translation>
 <translation id="737728204345822099">安全金鑰可能保留你造訪這個網站的記錄。</translation>
 <translation id="7377451353532943397">繼續禁止存取感應器</translation>
@@ -5925,6 +5934,7 @@
 <translation id="7427798576651127129">用「<ph name="DEVICE_NAME" />」撥打電話</translation>
 <translation id="7431719494109538750">找不到 HID 裝置</translation>
 <translation id="7431991332293347422">控制 Google 使用瀏覽記錄提供個人化搜尋服務和其他內容的方式</translation>
+<translation id="7432200167665670017">你的管理員已封鎖「<ph name="EXTENSION_NAME" />」(應用程式 ID:<ph name="EXTENSION_ID" />)</translation>
 <translation id="7433708794692032816">插入智慧型卡片才能繼續使用 <ph name="DEVICE_TYPE" /></translation>
 <translation id="7433957986129316853">保留</translation>
 <translation id="7434509671034404296">開發人員選項</translation>
@@ -5954,6 +5964,7 @@
 <translation id="7460045493116006516">你目前安裝的主題</translation>
 <translation id="7461924472993315131">固定</translation>
 <translation id="746216226901520237">下次手機會為你的 <ph name="DEVICE_TYPE" /> 解鎖。你可以在「設定」中停用 Smart Lock。</translation>
+<translation id="7464637891177137294">將密碼儲存在你的 Google 帳戶 (<ph name="ACCOUNT" />) 中</translation>
 <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{已開啟 # 個分頁,按下即可切換分頁列}other{已開啟 # 個分頁,按下即可切換分頁列}}</translation>
 <translation id="7465635034594602553">發生錯誤,請過幾分鐘後再重新執行「<ph name="APP_NAME" />」。</translation>
 <translation id="7465778193084373987">Netscape 憑證撤銷網址</translation>
@@ -6017,6 +6028,7 @@
 <translation id="7525625923260515951">聆聽所選文字</translation>
 <translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{還有 1 項}other{還有 {NUM_DOWNLOADS} 項}}</translation>
 <translation id="7526989658317409655">預留位置</translation>
+<translation id="7527758104894292229">更新 Google 帳戶 (<ph name="ACCOUNT" />) 中的密碼</translation>
 <translation id="7529411698175791732">檢查你的網際網路連線。如果問題持續發生,請嘗試登出,然後再次登入。</translation>
 <translation id="7529876053219658589">{0,plural, =1{關閉訪客視窗}other{關閉訪客視窗}}</translation>
 <translation id="7530016656428373557">放電速率 (瓦特)</translation>
@@ -6404,6 +6416,7 @@
 <translation id="7898725031477653577">一律翻譯</translation>
 <translation id="790040513076446191">操控隱私權相關設定</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
+<translation id="7901914889562552258">根據網頁指標改善 Chrome</translation>
 <translation id="7903345046358933331">網頁無回應。您可以等待網頁回應,或是直接關閉網頁。</translation>
 <translation id="7903742244674067440">您儲存了這些憑證授權單位的識別憑證</translation>
 <translation id="7903859912536385558">穩定版 (信任的測試人員)</translation>
@@ -6870,6 +6883,7 @@
 <translation id="8392364544846746346">網站必須先詢問你,才能編輯裝置上的檔案或資料夾</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> 的選項選單</translation>
 <translation id="8393511274964623038">停止外掛程式</translation>
+<translation id="839363317075970734">藍牙裝置詳細資料</translation>
 <translation id="8393700583063109961">傳送訊息</translation>
 <translation id="8397825320644530257">中斷與已連結手機的連線</translation>
 <translation id="8398877366907290961">仍要繼續</translation>
@@ -7120,6 +7134,7 @@
 <translation id="8681614230122836773">Chrome 發現你的電腦安裝了有害軟體</translation>
 <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> 已連接且準備就緒</translation>
 <translation id="8683081248374354009">重設群組</translation>
+<translation id="8683526617475118045">本功能的優點</translation>
 <translation id="8688672835843460752">可用空間</translation>
 <translation id="8690129572193755009">網站可以要求處理通訊協定</translation>
 <translation id="8695139659682234808">在設定完成後新增家長監護功能</translation>
@@ -7173,6 +7188,7 @@
 <translation id="8737685506611670901">開啟<ph name="PROTOCOL" />連結 (取代 <ph name="REPLACED_HANDLER_TITLE" />)</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">請選擇網頁的譯文語言</translation>
+<translation id="8737916108453753541">系統會將網址提供給 Google,藉此瞭解瀏覽行為</translation>
 <translation id="8740247629089392745">你可以將這部 Chromebook 交給「<ph name="SUPERVISED_USER_NAME" />」。設定即將完成,完成後即可開始探索。</translation>
 <translation id="8741944563400125534">開關功能設定導覽</translation>
 <translation id="8742998548129056176">這個頁面會顯示裝置和裝置使用情況的一般資訊 (例如電池電量、系統和應用程式活動,以及錯誤資訊)。這些資料將用於改善 Android,且部分匯總資訊還能協助 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提高應用程式和產品的服務品質。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index c85e173..c2442c8c 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -4272,6 +4272,7 @@
 <translation id="5565735124758917034">Kuyasebenza</translation>
 <translation id="5567989639534621706">Izinqolobane zohlelo lokusebenza</translation>
 <translation id="5568069709869097550">Ayikwazi ukungena ngemvume</translation>
+<translation id="5571092938913434726">Izilawuli zemidiya zomhlaba jikelele</translation>
 <translation id="5571832155627049070">Yenza iphrofayela lakho ngokwezifiso</translation>
 <translation id="5572851009514199876">Sicela uqalise futhi ungene ngemvume ku-Chrome ukuze i-Chrome ikwazi ukuhlola ukuthi ingabe uvunyelwe ukufinyelela leli sayithi.</translation>
 <translation id="5575473780076478375">Isandiso se-Incognito: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/theme/default_100_percent/common/paste_scanning.png b/chrome/app/theme/default_100_percent/common/paste_scanning.png
deleted file mode 100644
index 853dbc0..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_scanning.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/paste_scanning_dark.png b/chrome/app/theme/default_100_percent/common/paste_scanning_dark.png
deleted file mode 100644
index d79f5d31..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_scanning_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/paste_success.png b/chrome/app/theme/default_100_percent/common/paste_success.png
deleted file mode 100644
index 10edcb6..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_success.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/paste_success_dark.png b/chrome/app/theme/default_100_percent/common/paste_success_dark.png
deleted file mode 100644
index ce8675d..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_success_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/paste_violation.png b/chrome/app/theme/default_100_percent/common/paste_violation.png
deleted file mode 100644
index 6b43c78..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_violation.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/paste_violation_dark.png b/chrome/app/theme/default_100_percent/common/paste_violation_dark.png
deleted file mode 100644
index 11d554d..0000000
--- a/chrome/app/theme/default_100_percent/common/paste_violation_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_scanning.png b/chrome/app/theme/default_100_percent/common/upload_scanning.png
index a9eeb75c..631dd3e 100644
--- a/chrome/app/theme/default_100_percent/common/upload_scanning.png
+++ b/chrome/app/theme/default_100_percent/common/upload_scanning.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_scanning_dark.png b/chrome/app/theme/default_100_percent/common/upload_scanning_dark.png
index 463c894..69be8df 100644
--- a/chrome/app/theme/default_100_percent/common/upload_scanning_dark.png
+++ b/chrome/app/theme/default_100_percent/common/upload_scanning_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_success.png b/chrome/app/theme/default_100_percent/common/upload_success.png
index d0b51c18..471be3d 100644
--- a/chrome/app/theme/default_100_percent/common/upload_success.png
+++ b/chrome/app/theme/default_100_percent/common/upload_success.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_success_dark.png b/chrome/app/theme/default_100_percent/common/upload_success_dark.png
index 79734c2..6b6664a9 100644
--- a/chrome/app/theme/default_100_percent/common/upload_success_dark.png
+++ b/chrome/app/theme/default_100_percent/common/upload_success_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_violation.png b/chrome/app/theme/default_100_percent/common/upload_violation.png
index 18aadfc..d10c38c 100644
--- a/chrome/app/theme/default_100_percent/common/upload_violation.png
+++ b/chrome/app/theme/default_100_percent/common/upload_violation.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_violation_dark.png b/chrome/app/theme/default_100_percent/common/upload_violation_dark.png
index 5cd8396f..5992f2de 100644
--- a/chrome/app/theme/default_100_percent/common/upload_violation_dark.png
+++ b/chrome/app/theme/default_100_percent/common/upload_violation_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_warning.png b/chrome/app/theme/default_100_percent/common/upload_warning.png
new file mode 100644
index 0000000..bcf64e3
--- /dev/null
+++ b/chrome/app/theme/default_100_percent/common/upload_warning.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/upload_warning_dark.png b/chrome/app/theme/default_100_percent/common/upload_warning_dark.png
new file mode 100644
index 0000000..20da7ba
--- /dev/null
+++ b/chrome/app/theme/default_100_percent/common/upload_warning_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_scanning.png b/chrome/app/theme/default_200_percent/common/paste_scanning.png
deleted file mode 100644
index d2a27b0..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_scanning.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_scanning_dark.png b/chrome/app/theme/default_200_percent/common/paste_scanning_dark.png
deleted file mode 100644
index de8dd187..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_scanning_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_success.png b/chrome/app/theme/default_200_percent/common/paste_success.png
deleted file mode 100644
index f4bab2d8..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_success.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_success_dark.png b/chrome/app/theme/default_200_percent/common/paste_success_dark.png
deleted file mode 100644
index cf13601..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_success_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_violation.png b/chrome/app/theme/default_200_percent/common/paste_violation.png
deleted file mode 100644
index 2214677..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_violation.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/paste_violation_dark.png b/chrome/app/theme/default_200_percent/common/paste_violation_dark.png
deleted file mode 100644
index 0c48472be..0000000
--- a/chrome/app/theme/default_200_percent/common/paste_violation_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_scanning.png b/chrome/app/theme/default_200_percent/common/upload_scanning.png
index 0ba0211b..bf0b1187 100644
--- a/chrome/app/theme/default_200_percent/common/upload_scanning.png
+++ b/chrome/app/theme/default_200_percent/common/upload_scanning.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_scanning_dark.png b/chrome/app/theme/default_200_percent/common/upload_scanning_dark.png
index 1edaa5b9..b70211c3 100644
--- a/chrome/app/theme/default_200_percent/common/upload_scanning_dark.png
+++ b/chrome/app/theme/default_200_percent/common/upload_scanning_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_success.png b/chrome/app/theme/default_200_percent/common/upload_success.png
index d44b691d..3e5e5c0 100644
--- a/chrome/app/theme/default_200_percent/common/upload_success.png
+++ b/chrome/app/theme/default_200_percent/common/upload_success.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_success_dark.png b/chrome/app/theme/default_200_percent/common/upload_success_dark.png
index 6804674..f007e155 100644
--- a/chrome/app/theme/default_200_percent/common/upload_success_dark.png
+++ b/chrome/app/theme/default_200_percent/common/upload_success_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_violation.png b/chrome/app/theme/default_200_percent/common/upload_violation.png
index 6d96e89..af42172 100644
--- a/chrome/app/theme/default_200_percent/common/upload_violation.png
+++ b/chrome/app/theme/default_200_percent/common/upload_violation.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_violation_dark.png b/chrome/app/theme/default_200_percent/common/upload_violation_dark.png
index 3581c68..ae6caff 100644
--- a/chrome/app/theme/default_200_percent/common/upload_violation_dark.png
+++ b/chrome/app/theme/default_200_percent/common/upload_violation_dark.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_warning.png b/chrome/app/theme/default_200_percent/common/upload_warning.png
new file mode 100644
index 0000000..9fe10421
--- /dev/null
+++ b/chrome/app/theme/default_200_percent/common/upload_warning.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/upload_warning_dark.png b/chrome/app/theme/default_200_percent/common/upload_warning_dark.png
new file mode 100644
index 0000000..1438004
--- /dev/null
+++ b/chrome/app/theme/default_200_percent/common/upload_warning_dark.png
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index 46d57659..b7b4fc4f 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -337,16 +337,12 @@
       <if expr="not is_android">
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_SCANNING" file="common/upload_scanning.png" />
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_SUCCESS" file="common/upload_success.png" />
+        <structure type="chrome_scaled_image" name="IDR_UPLOAD_WARNING" file="common/upload_warning.png" />
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_VIOLATION" file="common/upload_violation.png" />
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_SCANNING_DARK" file="common/upload_scanning_dark.png" />
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_SUCCESS_DARK" file="common/upload_success_dark.png" />
+        <structure type="chrome_scaled_image" name="IDR_UPLOAD_WARNING_DARK" file="common/upload_warning_dark.png" />
         <structure type="chrome_scaled_image" name="IDR_UPLOAD_VIOLATION_DARK" file="common/upload_violation_dark.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_SCANNING" file="common/paste_scanning.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_SUCCESS" file="common/paste_success.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_VIOLATION" file="common/paste_violation.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_SCANNING_DARK" file="common/paste_scanning_dark.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_SUCCESS_DARK" file="common/paste_success_dark.png" />
-        <structure type="chrome_scaled_image" name="IDR_PASTE_VIOLATION_DARK" file="common/paste_violation_dark.png" />
       </if>
       <if expr="not _google_chrome">
         <if expr="not is_android">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 4cf26c21..a91452b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4941,6 +4941,7 @@
     deps += [
       "//chromeos/crosapi/cpp",
       "//chromeos/crosapi/mojom",
+      "//chromeos/dbus/constants",
     ]
   }
 
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 3a4be844..be2aaf3a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3104,10 +3104,6 @@
      flag_descriptions::kDisableOfficeEditingComponentAppName,
      flag_descriptions::kDisableOfficeEditingComponentAppDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kDisableOfficeEditingComponentApp)},
-    {"updated_cellular_activation_ui",
-     flag_descriptions::kUpdatedCellularActivationUiName,
-     flag_descriptions::kUpdatedCellularActivationUiDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kUpdatedCellularActivationUi)},
     {"use_messages_staging_url", flag_descriptions::kUseMessagesStagingUrlName,
      flag_descriptions::kUseMessagesStagingUrlDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kUseMessagesStagingUrl)},
@@ -4233,10 +4229,6 @@
      flag_descriptions::kEnableGenericSensorExtraClassesName,
      flag_descriptions::kEnableGenericSensorExtraClassesDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kGenericSensorExtraClasses)},
-    {"expensive-background-timer-throttling",
-     flag_descriptions::kExpensiveBackgroundTimerThrottlingName,
-     flag_descriptions::kExpensiveBackgroundTimerThrottlingDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kExpensiveBackgroundTimerThrottling)},
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     {ui_devtools::switches::kEnableUiDevTools,
@@ -6751,6 +6743,12 @@
      flag_descriptions::kIncognitoBrandConsistencyForAndroidDescription,
      kOsAndroid,
      FEATURE_VALUE_TYPE(features::kIncognitoBrandConsistencyForAndroid)},
+
+    {"incognito-reauthentication-for-android",
+     flag_descriptions::kIncognitoReauthenticationForAndroidName,
+     flag_descriptions::kIncognitoReauthenticationForAndroidDescription,
+     kOsAndroid,
+     FEATURE_VALUE_TYPE(features::kIncognitoReauthenticationForAndroid)},
 #endif
 
 #if defined(OS_MAC) || defined(OS_WIN) || defined(OS_LINUX) || \
diff --git a/chrome/browser/accuracy_tips/accuracy_service_delegate.cc b/chrome/browser/accuracy_tips/accuracy_service_delegate.cc
index 7f27cabd..2d9a9aa7 100644
--- a/chrome/browser/accuracy_tips/accuracy_service_delegate.cc
+++ b/chrome/browser/accuracy_tips/accuracy_service_delegate.cc
@@ -4,18 +4,23 @@
 
 #include "chrome/browser/accuracy_tips/accuracy_service_delegate.h"
 
+#include "chrome/browser/engagement/site_engagement_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/hats/hats_service.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
 #include "chrome/browser/ui/page_info/chrome_accuracy_tip_ui.h"
 #include "components/site_engagement/content/site_engagement_service.h"
 
 AccuracyServiceDelegate::~AccuracyServiceDelegate() = default;
 
-AccuracyServiceDelegate::AccuracyServiceDelegate(
-    site_engagement::SiteEngagementService* site_engagement_service)
-    : site_engagement_service_(site_engagement_service) {}
+AccuracyServiceDelegate::AccuracyServiceDelegate(Profile* profile)
+    : profile_(profile) {}
 
 bool AccuracyServiceDelegate::IsEngagementHigh(const GURL& url) {
+  auto* engagement_service =
+      site_engagement::SiteEngagementServiceFactory::GetForProfile(profile_);
   // TODO(crbug.com/1210891): Decide on the proper minimum engagement level.
-  return site_engagement_service_->IsEngagementAtLeast(
+  return engagement_service->IsEngagementAtLeast(
       url, blink::mojom::EngagementLevel::MEDIUM);
 }
 
@@ -28,3 +33,18 @@
   ShowAccuracyTipDialog(web_contents, type, show_opt_out,
                         std::move(close_callback));
 }
+
+void AccuracyServiceDelegate::ShowSurvey(
+    const std::map<std::string, bool>& product_specific_bits_data,
+    const std::map<std::string, std::string>& product_specific_string_data) {
+  auto* hats_service =
+      HatsServiceFactory::GetForProfile(profile_, /*create_if_necessary=*/true);
+  if (!hats_service)
+    return;
+
+  hats_service->LaunchSurvey(kHatsSurveyTriggerAccuracyTips,
+                             /*success_callback=*/base::DoNothing(),
+                             /*failure_callback=*/base::DoNothing(),
+                             product_specific_bits_data,
+                             product_specific_string_data);
+}
diff --git a/chrome/browser/accuracy_tips/accuracy_service_delegate.h b/chrome/browser/accuracy_tips/accuracy_service_delegate.h
index 5b67ab72..e953d1c9 100644
--- a/chrome/browser/accuracy_tips/accuracy_service_delegate.h
+++ b/chrome/browser/accuracy_tips/accuracy_service_delegate.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_ACCURACY_TIPS_ACCURACY_SERVICE_DELEGATE_H_
 #define CHROME_BROWSER_ACCURACY_TIPS_ACCURACY_SERVICE_DELEGATE_H_
 
+#include <map>
+
 #include "components/accuracy_tips/accuracy_service.h"
 #include "components/accuracy_tips/accuracy_tip_interaction.h"
 #include "components/accuracy_tips/accuracy_tip_status.h"
@@ -13,15 +15,12 @@
 class WebContents;
 }
 
-namespace site_engagement {
-class SiteEngagementService;
-}
+class Profile;
 
 class AccuracyServiceDelegate
     : public accuracy_tips::AccuracyService::Delegate {
  public:
-  explicit AccuracyServiceDelegate(
-      site_engagement::SiteEngagementService* site_engagement_service);
+  explicit AccuracyServiceDelegate(Profile* profile);
   ~AccuracyServiceDelegate() override;
 
   AccuracyServiceDelegate(const AccuracyServiceDelegate&) = delete;
@@ -36,8 +35,12 @@
       base::OnceCallback<void(accuracy_tips::AccuracyTipInteraction)>
           close_callback) override;
 
+  void ShowSurvey(const std::map<std::string, bool>& product_specific_bits_data,
+                  const std::map<std::string, std::string>&
+                      product_specific_string_data) override;
+
  private:
-  site_engagement::SiteEngagementService* site_engagement_service_;
+  Profile* profile_;
 };
 
 #endif  // CHROME_BROWSER_ACCURACY_TIPS_ACCURACY_SERVICE_DELEGATE_H_
diff --git a/chrome/browser/accuracy_tips/accuracy_service_factory.cc b/chrome/browser/accuracy_tips/accuracy_service_factory.cc
index 449e3e1..6b17c4e 100644
--- a/chrome/browser/accuracy_tips/accuracy_service_factory.cc
+++ b/chrome/browser/accuracy_tips/accuracy_service_factory.cc
@@ -51,9 +51,7 @@
       g_browser_process->safe_browsing_service()
           ? g_browser_process->safe_browsing_service()->database_manager()
           : nullptr;
-  auto* engagement_service =
-      site_engagement::SiteEngagementServiceFactory::GetForProfile(profile);
-  auto delegate = std::make_unique<AccuracyServiceDelegate>(engagement_service);
+  auto delegate = std::make_unique<AccuracyServiceDelegate>(profile);
   return new accuracy_tips::AccuracyService(
       std::move(delegate), profile->GetPrefs(), std::move(sb_database),
       content::GetUIThreadTaskRunner({}), content::GetIOThreadTaskRunner({}));
diff --git a/chrome/browser/ash/accessibility/DEPS b/chrome/browser/ash/accessibility/DEPS
index 262ffdcc..b05e756 100644
--- a/chrome/browser/ash/accessibility/DEPS
+++ b/chrome/browser/ash/accessibility/DEPS
@@ -1,5 +1,8 @@
 specific_include_rules = {
   # Testing
+  "accessibility_manager_browsertest.cc": [
+    "+ui/message_center/message_center.h"
+  ],
   "speech_monitor\.(cc|h)": [
     "+content/public/browser/tts_controller.h",
   ],
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc
index 450418f..bc34471 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -862,6 +862,7 @@
 
 void AccessibilityManager::OnDictationChanged(bool triggered_by_user) {
   OnAccessibilityCommonChanged(prefs::kAccessibilityDictationEnabled);
+  dictation_triggered_by_user_ = triggered_by_user;
   if (!profile_)
     return;
 
@@ -2015,6 +2016,19 @@
   // installing the locale directly.
 }
 
+void AccessibilityManager::OnSodaInstallSucceeded() {
+  if (ShouldShowSodaSucceededNotificationForDictation())
+    ShowSodaDownloadNotificationForDictation(true);
+  OnSodaInstallUpdated();
+}
+
+void AccessibilityManager::OnSodaInstallError(
+    speech::LanguageCode language_code) {
+  if (ShouldShowSodaFailedNotificationForDictation(language_code))
+    ShowSodaDownloadNotificationForDictation(false);
+  OnSodaInstallUpdated();
+}
+
 void AccessibilityManager::OnSodaInstallUpdated() {
   if (!features::IsDictationOfflineAvailableAndEnabled())
     return;
@@ -2024,8 +2038,9 @@
       profile_->GetPrefs()->GetString(prefs::kAccessibilityDictationLocale);
   bool is_soda_downloading = soda_installer->IsSodaDownloading(
       speech::GetLanguageCode(dictation_locale));
-  AccessibilityController::Get()->UpdateDictationButtonOnSodaChanged(
-      is_soda_downloading);
+  AccessibilityController::Get()
+      ->UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+          is_soda_downloading);
 
   if (is_soda_downloading)
     return;
@@ -2044,21 +2059,79 @@
 
 // SodaInstaller::Observer:
 void AccessibilityManager::OnSodaInstalled() {
-  OnSodaInstallUpdated();
+  OnSodaInstallSucceeded();
 }
 
 void AccessibilityManager::OnSodaError() {
-  OnSodaInstallUpdated();
+  OnSodaInstallError(speech::LanguageCode::kNone);
 }
 
 void AccessibilityManager::OnSodaLanguagePackInstalled(
     speech::LanguageCode language_code) {
-  OnSodaInstallUpdated();
+  OnSodaInstallSucceeded();
 }
 
 void AccessibilityManager::OnSodaLanguagePackError(
     speech::LanguageCode language_code) {
-  OnSodaInstallUpdated();
+  OnSodaInstallError(language_code);
+}
+
+bool AccessibilityManager::ShouldShowSodaSucceededNotificationForDictation() {
+  if (!features::IsDictationOfflineAvailableAndEnabled() ||
+      !dictation_triggered_by_user_ || !IsDictationEnabled()) {
+    return false;
+  }
+
+  // Note: this function assumes that it's called after a successful SODA
+  // download, either for the SODA binary or a language pack.
+  // Both the SODA binary and the language pack matching the Dictation locale
+  // need to be downloaded to return true.
+  const std::string locale =
+      profile_->GetPrefs()->GetString(prefs::kAccessibilityDictationLocale);
+  if (speech::SodaInstaller::GetInstance()->IsSodaInstalled(
+          speech::GetLanguageCode(locale))) {
+    return true;
+  }
+
+  return false;
+}
+
+bool AccessibilityManager::ShouldShowSodaFailedNotificationForDictation(
+    speech::LanguageCode language_code) {
+  if (!features::IsDictationOfflineAvailableAndEnabled() ||
+      !dictation_triggered_by_user_ || !IsDictationEnabled()) {
+    return false;
+  }
+
+  // Note: this function assumes that it's called after a SODA error, either for
+  // the SODA binary or a language pack. Show the failed notification if:
+  // 1. |language_code| == kNone (encodes that this was an error for the SODA
+  // binary), or
+  // 2. |language_code| matches the Dictation locale.
+  const std::string locale =
+      profile_->GetPrefs()->GetString(prefs::kAccessibilityDictationLocale);
+  if (language_code == speech::LanguageCode::kNone ||
+      language_code == speech::GetLanguageCode(locale))
+    return true;
+
+  return false;
+}
+
+void AccessibilityManager::ShowSodaDownloadNotificationForDictation(
+    bool succeeded) {
+  if (!features::IsDictationOfflineAvailableAndEnabled())
+    return;
+
+  const std::string locale =
+      profile_->GetPrefs()->GetString(prefs::kAccessibilityDictationLocale);
+  // Get the display name of |locale| in the application locale.
+  const std::u16string display_name = l10n_util::GetDisplayNameForLocale(
+      /*locale=*/locale,
+      /*display_locale=*/g_browser_process->GetApplicationLocale(),
+      /*is_ui=*/true);
+  AccessibilityController::Get()
+      ->ShowSpeechRecognitionDownloadNotificationForDictation(succeeded,
+                                                              display_name);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.h b/chrome/browser/ash/accessibility/accessibility_manager.h
index 2c9f487..004f155 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.h
+++ b/chrome/browser/ash/accessibility/accessibility_manager.h
@@ -464,12 +464,22 @@
   // ProfileObserver:
   void OnProfileWillBeDestroyed(Profile* profile) override;
 
+  // Dictation dialog methods.
   bool ShouldShowNetworkDictationDialog(const std::string& locale);
   void ShowNetworkDictationDialog();
   void OnNetworkDictationDialogAccepted();
   void OnNetworkDictationDialogDismissed();
+
+  // SODA-related methods.
   void MaybeInstallSoda(const std::string& locale);
+  void OnSodaInstallSucceeded();
+  void OnSodaInstallError(speech::LanguageCode language_code);
   void OnSodaInstallUpdated();
+  bool ShouldShowSodaSucceededNotificationForDictation();
+  bool ShouldShowSodaFailedNotificationForDictation(
+      speech::LanguageCode language_code);
+  void ShowSodaDownloadNotificationForDictation(bool succeeded);
+
   void ShowDictationLanguageUpgradedNudge(const std::string& locale);
 
   // Profile which has the current a11y context.
@@ -536,6 +546,7 @@
   std::unique_ptr<Dictation> dictation_;
   bool dictation_active_ = false;
   bool network_dictation_dialog_is_showing_ = false;
+  bool dictation_triggered_by_user_ = false;
 
   base::RepeatingCallback<void()> focus_ring_observer_for_test_;
   base::RepeatingCallback<void()> select_to_speak_state_observer_for_test_;
@@ -555,6 +566,7 @@
   friend class DictationTest;
   friend class SwitchAccessTest;
   friend class AccessibilityManagerTest;
+  friend class AccessibilityManagerSodaTest;
   friend class AccessibilityManagerDictationDialogTest;
   friend class AccessibilityManagerNoOnDeviceSpeechRecognitionTest;
 
diff --git a/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc b/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc
index b86bcf8f..ad8a7fc 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc
@@ -43,6 +43,7 @@
 #include "ui/base/ime/chromeos/input_method_manager.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
+#include "ui/message_center/message_center.h"
 
 namespace extension_ime_util = chromeos::extension_ime_util;
 using chromeos::LoggedInUserMixin;
@@ -291,6 +292,37 @@
   return offline_nudges->FindBoolPath(locale);
 }
 
+void AssertSodaNotificationShownForDictation(
+    const std::u16string& display_language,
+    bool success) {
+  const std::u16string kTitle =
+      success ? display_language + u" speech files downloaded"
+              : u"Couldn't download " + display_language + u" speech files";
+  const std::u16string kDescription =
+      success ? u"Speech is now processed locally and Dictation works offline"
+              : u"Download will be attempted later. Speech will be sent to "
+                u"Google for processing for now.";
+  message_center::SystemNotificationWarningLevel warning =
+      success
+          ? message_center::SystemNotificationWarningLevel::NORMAL
+          : message_center::SystemNotificationWarningLevel::CRITICAL_WARNING;
+
+  message_center::NotificationList::Notifications notifications =
+      message_center::MessageCenter::Get()->GetVisibleNotifications();
+  ASSERT_EQ(1u, notifications.size());
+  ASSERT_EQ(kTitle, (*notifications.begin())->title());
+  ASSERT_EQ(kDescription, (*notifications.begin())->message());
+  ASSERT_EQ(u"Dictation", (*notifications.begin())->display_source());
+  ASSERT_EQ(warning,
+            (*notifications.begin())->system_notification_warning_level());
+}
+
+void AssertMessageCenterEmpty() {
+  message_center::NotificationList::Notifications notifications =
+      message_center::MessageCenter::Get()->GetVisibleNotifications();
+  ASSERT_EQ(0, notifications.size());
+}
+
 }  // namespace
 
 // For user session accessibility manager tests.
@@ -661,8 +693,51 @@
   EXPECT_FALSE(ShouldShowAccessibilityMenu());
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, SodaDownload) {
-  UninstallSodaForTesting();
+class AccessibilityManagerSodaTest : public AccessibilityManagerTest {
+ protected:
+  AccessibilityManagerSodaTest()
+      : disable_animations_(
+            ui::ScopedAnimationDurationScaleMode::ZERO_DURATION) {}
+  ~AccessibilityManagerSodaTest() override = default;
+  AccessibilityManagerSodaTest(const AccessibilityManagerSodaTest&) = delete;
+  AccessibilityManagerSodaTest& operator=(const AccessibilityManagerSodaTest&) =
+      delete;
+
+  void SetUpOnMainThread() override {
+    UninstallSodaForTesting();
+    EnsureSodaObservation();
+    AccessibilityManagerTest::SetUpOnMainThread();
+  }
+
+  void TearDownOnMainThread() override {
+    UninstallSodaForTesting();
+    AccessibilityManagerTest::TearDownOnMainThread();
+  }
+
+  void EnsureSodaObservation() {
+    // Ensures that AccessibilityManager is observing SodaInstaller.
+    if (!AccessibilityManager::Get()->soda_observation_.IsObservingSource(
+            soda_installer()))
+      AccessibilityManager::Get()->soda_observation_.Observe(soda_installer());
+  }
+
+  speech::SodaInstaller* soda_installer() {
+    return speech::SodaInstaller::GetInstance();
+  }
+
+  speech::LanguageCode en_us() { return speech::LanguageCode::kEnUs; }
+
+  const std::u16string en_us_display_name() {
+    return u"English (United States)";
+  }
+
+ private:
+  ui::ScopedAnimationDurationScaleMode disable_animations_;
+};
+
+// Tests that SODA download is initiated when Dictation is enabled.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       DownloadWhenDictationEnabled) {
   ClearDictationOfflineNudgePref("en-US");
   EXPECT_FALSE(IsSodaDownloading());
   EXPECT_FALSE(ShouldShowNetworkDictationDialog("en-US"));
@@ -675,28 +750,10 @@
   EXPECT_FALSE(IsSodaDownloading());
   // The nudge was never shown.
   EXPECT_FALSE(GetDictationOfflineNudgePref("en-US"));
-  UninstallSodaForTesting();
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, SodaError) {
-  UninstallSodaForTesting();
-  ClearDictationOfflineNudgePref("en-US");
-  EXPECT_FALSE(IsSodaDownloading());
-  EXPECT_FALSE(ShouldShowNetworkDictationDialog("en-US"));
-  SetDictationEnabled(true);
-  EXPECT_TRUE(IsSodaDownloading());
-  // The nudge should not be requested to be shown.
-  EXPECT_FALSE(GetDictationOfflineNudgePref("en-US"));
-  speech::SodaInstaller::GetInstance()->NotifySodaErrorForTesting();
-  EXPECT_FALSE(IsSodaDownloading());
-  // The nudge was never shown.
-  EXPECT_FALSE(GetDictationOfflineNudgePref("en-US"));
-  UninstallSodaForTesting();
-}
-
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
                        SodaDownloadNotTriggeredByUserShowsNudge) {
-  UninstallSodaForTesting();
   ClearDictationOfflineNudgePref("en-US");
   EXPECT_FALSE(IsSodaDownloading());
   SetDictationEnabledNotTriggeredByUser(true);
@@ -706,12 +763,10 @@
   speech::SodaInstaller::GetInstance()->NotifySodaInstalledForTesting();
   EXPECT_FALSE(IsSodaDownloading());
   EXPECT_TRUE(GetDictationOfflineNudgePref("en-US").value());
-  UninstallSodaForTesting();
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
                        SodaErrorNotTriggeredByUserTriesToShowNudge) {
-  UninstallSodaForTesting();
   ClearDictationOfflineNudgePref("en-US");
   EXPECT_FALSE(IsSodaDownloading());
   SetDictationEnabledNotTriggeredByUser(true);
@@ -722,12 +777,10 @@
   EXPECT_FALSE(IsSodaDownloading());
   // The nudge was never shown because of the error.
   EXPECT_FALSE(GetDictationOfflineNudgePref("en-US").value());
-  UninstallSodaForTesting();
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
                        OneNudgeForSodaMultipleDownload) {
-  UninstallSodaForTesting();
   ClearDictationOfflineNudgePref("en-US");
   SetDictationEnabledNotTriggeredByUser(true);
   EXPECT_TRUE(IsSodaDownloading());
@@ -746,7 +799,7 @@
   EXPECT_TRUE(GetDictationOfflineNudgePref("en-US").value());
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
                        SodaInstalledBeforeDictationEnabled) {
   speech::SodaInstaller::GetInstance()->NotifySodaInstalledForTesting();
   ClearDictationOfflineNudgePref("en-US");
@@ -759,9 +812,8 @@
   EXPECT_TRUE(GetDictationOfflineNudgePref("en-US").value());
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
                        SodaDownloadTriggeredByLocaleChange) {
-  UninstallSodaForTesting();
   EXPECT_FALSE(IsSodaDownloading());
 
   // it-IT is not supported by SODA, so download shouldn't trigger.
@@ -780,7 +832,96 @@
   EXPECT_FALSE(IsSodaDownloading());
   // The nudge was never shown because this was a user-initiated change.
   EXPECT_FALSE(GetDictationOfflineNudgePref("en-US"));
-  UninstallSodaForTesting();
+}
+
+// Ensures that we show the SODA succeeded notification for Dictation if the
+// SODA binary downloads, followed by the language pack matching the dictation
+// language.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       SucceededNotificationCase1) {
+  // For this test, pretend that the Dictation locale is fr-FR.
+  g_browser_process->SetApplicationLocale("fr-FR");
+  speech::LanguageCode fr_fr = speech::LanguageCode::kFrFr;
+  SetDictationEnabled(true);
+  soda_installer()->NotifySodaInstalledForTesting();
+  AssertMessageCenterEmpty();
+  soda_installer()->NotifyOnSodaLanguagePackInstalledForTesting(fr_fr);
+  AssertSodaNotificationShownForDictation(u"français (France)", true);
+}
+
+// Similar to above. Ensures that we show the SODA succeeded notification for
+// Dictation if the language pack downloads, followed by the SODA binary.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       SucceededNotificationCase2) {
+  SetDictationEnabled(true);
+  soda_installer()->NotifyOnSodaLanguagePackInstalledForTesting(en_us());
+  AssertMessageCenterEmpty();
+  soda_installer()->NotifySodaInstalledForTesting();
+  AssertSodaNotificationShownForDictation(en_us_display_name(), true);
+}
+
+// Ensures that we show the SODA failed notification for Dictation if the SODA
+// binary fails.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       SodaFailedNotificationBinaryError) {
+  SetDictationEnabled(true);
+  soda_installer()->NotifySodaErrorForTesting();
+  AssertSodaNotificationShownForDictation(en_us_display_name(), false);
+}
+
+// Similar to above. Ensures that we show the SODA failed notification for
+// Dictation if the language pack fails.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       SodaFailedNotificationLanguageError) {
+  SetDictationEnabled(true);
+  soda_installer()->NotifyOnSodaLanguagePackErrorForTesting(en_us());
+  AssertSodaNotificationShownForDictation(en_us_display_name(), false);
+}
+
+// Ensures that the SODA failed notification for Dictation is given if
+// the language pack downloads, but the SODA binary fails.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       LanguageInstalledBinaryFails) {
+  SetDictationEnabled(true);
+  soda_installer()->NotifyOnSodaLanguagePackInstalledForTesting(en_us());
+  AssertMessageCenterEmpty();
+  soda_installer()->NotifySodaErrorForTesting();
+  AssertSodaNotificationShownForDictation(en_us_display_name(), false);
+}
+
+// Similar to above. Ensures that we show the SODA failed notification if the
+// SODA binary downloads, but the language pack fails.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest,
+                       BinaryInstalledLanguageFails) {
+  // For this test, pretend that the Dictation locale is fr-FR.
+  g_browser_process->SetApplicationLocale("fr-FR");
+  speech::LanguageCode fr_fr = speech::LanguageCode::kFrFr;
+  SetDictationEnabled(true);
+  soda_installer()->NotifySodaInstalledForTesting();
+  AssertMessageCenterEmpty();
+  soda_installer()->NotifyOnSodaLanguagePackErrorForTesting(fr_fr);
+  AssertSodaNotificationShownForDictation(u"français (France)", false);
+}
+
+// Tests that the SODA download notification for Dictation is NOT given if
+// Dictation wasn't triggered by the user.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest, NotTriggeredByUser) {
+  SetDictationEnabledNotTriggeredByUser(true);
+  soda_installer()->NotifySodaInstalledForTesting();
+  soda_installer()->NotifyOnSodaLanguagePackInstalledForTesting(en_us());
+  AssertMessageCenterEmpty();
+}
+
+// Tests that the SODA download notification for Dictation is NOT given if
+// the installed language doesn't match the Dictation locale.
+IN_PROC_BROWSER_TEST_F(AccessibilityManagerSodaTest, WrongLanguage) {
+  // For this test, pretend that the Dictation locale is fr-FR.
+  g_browser_process->SetApplicationLocale("fr-FR");
+  SetDictationEnabled(true);
+  soda_installer()->NotifySodaInstalledForTesting();
+  AssertMessageCenterEmpty();
+  soda_installer()->NotifyOnSodaLanguagePackInstalledForTesting(en_us());
+  AssertMessageCenterEmpty();
 }
 
 enum DictationDialogTestVariant {
diff --git a/chrome/browser/ash/arc/arc_optin_uma.cc b/chrome/browser/ash/arc/arc_optin_uma.cc
index 647be6df..970feff 100644
--- a/chrome/browser/ash/arc/arc_optin_uma.cc
+++ b/chrome/browser/ash/arc/arc_optin_uma.cc
@@ -200,6 +200,12 @@
       status);
 }
 
+void UpdateAndroidIdSource(mojom::AndroidIdSource source,
+                           const Profile* profile) {
+  base::UmaHistogramEnumeration(
+      GetHistogramNameByUserType("Arc.Auth.AndroidIdSource", profile), source);
+}
+
 void UpdateAuthCodeFetcherProxyBypassUMA(bool proxy_bypassed,
                                          const Profile* profile) {
   base::UmaHistogramBoolean(
diff --git a/chrome/browser/ash/arc/arc_optin_uma.h b/chrome/browser/ash/arc/arc_optin_uma.h
index 9c9ea8e..e8bf331 100644
--- a/chrome/browser/ash/arc/arc_optin_uma.h
+++ b/chrome/browser/ash/arc/arc_optin_uma.h
@@ -277,6 +277,8 @@
 void UpdateAuthCheckinAttempts(int32_t num_attempts, const Profile* profile);
 void UpdateAuthAccountCheckStatus(mojom::AccountCheckStatus status,
                                   const Profile* profile);
+void UpdateAndroidIdSource(mojom::AndroidIdSource source,
+                           const Profile* profile);
 void UpdateAuthCodeFetcherProxyBypassUMA(bool proxy_bypassed,
                                          const Profile* profile);
 void UpdateAccountReauthReason(mojom::ReauthReason reason,
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.cc b/chrome/browser/ash/arc/auth/arc_auth_service.cc
index 1df4be3..8a27aa9 100644
--- a/chrome/browser/ash/arc/auth/arc_auth_service.cc
+++ b/chrome/browser/ash/arc/auth/arc_auth_service.cc
@@ -375,6 +375,10 @@
   UpdateAccountReauthReason(reason, profile_);
 }
 
+void ArcAuthService::ReportAndroidIdSource(mojom::AndroidIdSource source) {
+  UpdateAndroidIdSource(source, profile_);
+}
+
 void ArcAuthService::ReportManagementChangeStatus(
     mojom::ManagementChangeStatus status) {
   UpdateSupervisionTransitionResultUMA(status);
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.h b/chrome/browser/ash/arc/auth/arc_auth_service.h
index 5ae784f..275c0838 100644
--- a/chrome/browser/ash/arc/auth/arc_auth_service.h
+++ b/chrome/browser/ash/arc/auth/arc_auth_service.h
@@ -79,6 +79,7 @@
   void ReportMetrics(mojom::MetricsType metrics_type, int32_t value) override;
   void ReportAccountCheckStatus(mojom::AccountCheckStatus status) override;
   void ReportAccountReauthReason(mojom::ReauthReason reason) override;
+  void ReportAndroidIdSource(mojom::AndroidIdSource source) override;
   void ReportManagementChangeStatus(
       mojom::ManagementChangeStatus status) override;
   void RequestPrimaryAccountInfo(
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.cc
index 80c89bf..9bc7f67 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.cc
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.cc
@@ -14,28 +14,23 @@
 
 const char kNetworkRequestUploadType[] = "application/json";
 
-const char kFullRequestTemplate[] =
-    R"({
-        "advanced_options": {
-          "audio_generation_options": {"speed_factor": %.1f},
-          "force_language": "%s"
-        },
-        "text": {
-          "text_parts": ["%s"]
-        },
-        "voice_settings": {
-          "voice_criteria_and_selections": [{
-            "criteria": {"language": "%s"},
-            "selection": {"default_voice": "%s"}
-          }]
-        }
-      })";
+const char kDefaultVoiceKey[] = "default_voice";
 
-extern const char kSimpleRequestTemplate[] =
-    R"({"advanced_options": {
-          "audio_generation_options": {"speed_factor": %.1f}
-        },
-        "text": {"text_parts": ["%s"]}})";
+const char kLanguageKey[] = "language";
+
+const char kSelectionKey[] = "selection";
+
+const char kCriteriaKey[] = "criteria";
+
+const char kTextPartsPath[] = "text.text_parts";
+
+const char kSpeechFactorPath[] =
+    "advanced_options.audio_generation_options.speed_factor";
+
+const char kForceLanguagePath[] = "advanced_options.force_language";
+
+const char kVoiceCriteriaAndSelectionsPath[] =
+    "voice_settings.voice_criteria_and_selections";
 
 }  // namespace enhanced_network_tts
 }  // namespace ash
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h
index 308e312..7eaedb0 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h
@@ -28,14 +28,23 @@
 // Upload type for the network request.
 extern const char kNetworkRequestUploadType[];
 
-// The template for a full request that contains utterance, rate, voice name,
-// and language. See https://goto.google.com/readaloud-proto for more
-// information.
-extern const char kFullRequestTemplate[];
-
-// The template for a simple request that only contains utterance and rate.
+// Keys and paths in the request.
 // See https://goto.google.com/readaloud-proto for more information.
-extern const char kSimpleRequestTemplate[];
+extern const char kDefaultVoiceKey[];
+
+extern const char kLanguageKey[];
+
+extern const char kSelectionKey[];
+
+extern const char kCriteriaKey[];
+
+extern const char kTextPartsPath[];
+
+extern const char kSpeechFactorPath[];
+
+extern const char kForceLanguagePath[];
+
+extern const char kVoiceCriteriaAndSelectionsPath[];
 
 }  // namespace enhanced_network_tts
 }  // namespace ash
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl_unittest.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl_unittest.cc
index a99bd87..3f19b4a 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl_unittest.cc
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl_unittest.cc
@@ -7,11 +7,10 @@
 #include <map>
 #include <vector>
 
-#include "base/base64.h"
 #include "base/bind.h"
-#include "base/strings/stringprintf.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h"
+#include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.h"
 #include "google_apis/google_api_keys.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/net_errors.h"
@@ -28,37 +27,6 @@
 namespace enhanced_network_tts {
 namespace {
 
-// Template for a server response.
-constexpr char kTemplateResponse[] =
-    R"([
-        {"metadata": {}},
-        {"text": {
-          "timingInfo": [
-            {
-              "text": "test1",
-              "location": {
-                "textLocation": {"length": 5},
-                "timeLocation": {
-                  "timeOffset": "0.01s",
-                  "duration": "0.14s"
-                }
-              }
-            },
-            {
-              "text": "test2",
-              "location": {
-                "textLocation": {"length": 5, "offset": 6},
-                "timeLocation": {
-                  "timeOffset": "0.16s",
-                  "duration": "0.17s"
-                }
-              }
-            }
-          ]}
-        },
-        {"audio": {"bytes": "%s"}}
-      ])";
-
 // A fake server that supports test URL loading.
 class TestServerURLLoaderFactory {
  public:
@@ -127,7 +95,7 @@
       }
     }
 
-    EXPECT_EQ(actual_body, expected_body);
+    EXPECT_TRUE(AreRequestsEqual(actual_body, expected_body));
 
     // Guaranteed to match the first request based on URL.
     loader_factory_.SimulateResponseForPendingRequest(expected_url, response,
@@ -143,12 +111,6 @@
   scoped_refptr<network::SharedURLLoaderFactory> shared_loader_factory_;
 };
 
-// Returns a formatted request for the |input_text|. The request is based on a
-// template and is guaranteed to be correct.
-std::string CreateCorrectRequest(const std::string& input_text, float rate) {
-  return base::StringPrintf(kSimpleRequestTemplate, rate, input_text.c_str());
-}
-
 // Receives the result of a request and writes the result data into the given
 // variables.
 void ReportResult(absl::optional<mojom::TtsRequestError>* const error,
@@ -212,12 +174,9 @@
   // expect the real server sends the audio data back as a base64 encoded JSON
   // string.
   const std::vector<uint8_t> expected_output = {1, 2, 5};
-  std::string encoded_output(expected_output.begin(), expected_output.end());
-  base::Base64Encode(encoded_output, &encoded_output);
   test_url_factory_.ExpectRequestAndSimulateResponse(
       kReadAloudServerUrl, expected_headers, expected_body,
-      base::StringPrintf(kTemplateResponse, encoded_output.c_str()),
-      net::HTTP_OK);
+      CreateServerResponse(expected_output), net::HTTP_OK);
   test_task_env_.RunUntilIdle();
 
   // We only get the data after the server's response. We simulate the response
@@ -254,12 +213,9 @@
   // expect the real server sends the audio data back as a base64 encoded JSON
   // string.
   const std::vector<uint8_t> expected_output = {1, 2, 5};
-  std::string encoded_output(expected_output.begin(), expected_output.end());
-  base::Base64Encode(encoded_output, &encoded_output);
   test_url_factory_.ExpectRequestAndSimulateResponse(
       kReadAloudServerUrl, expected_headers, expected_body,
-      base::StringPrintf(kTemplateResponse, encoded_output.c_str()),
-      net::HTTP_OK);
+      CreateServerResponse(expected_output), net::HTTP_OK);
   test_task_env_.RunUntilIdle();
 
   // We only get the data after the server's response. We simulate the response
@@ -286,12 +242,9 @@
   // expect the real server sends the audio data back as a base64 encoded JSON
   // string.
   const std::vector<uint8_t> expected_output = {1, 2, 5};
-  std::string encoded_output(expected_output.begin(), expected_output.end());
-  base::Base64Encode(encoded_output, &encoded_output);
   test_url_factory_.ExpectRequestAndSimulateResponse(
       kReadAloudServerUrl, expected_headers, expected_body,
-      base::StringPrintf(kTemplateResponse, encoded_output.c_str()),
-      net::HTTP_OK);
+      CreateServerResponse(expected_output), net::HTTP_OK);
   test_task_env_.RunUntilIdle();
 
   // We only get the data after the server's response. We simulate the response
@@ -340,18 +293,14 @@
       {kGoogApiKeyHeader, google_apis::GetReadAloudAPIKey()}};
   std::string expected_body = CreateCorrectRequest(input_text, rate);
   const std::vector<uint8_t> expected_output = {1, 2, 5};
-  std::string encoded_output(expected_output.begin(), expected_output.end());
-  base::Base64Encode(encoded_output, &encoded_output);
   test_url_factory_.ExpectRequestAndSimulateResponse(
       kReadAloudServerUrl, expected_headers, expected_body,
-      base::StringPrintf(kTemplateResponse, encoded_output.c_str()),
-      net::HTTP_OK);
+      CreateServerResponse(expected_output), net::HTTP_OK);
   test_task_env_.RunUntilIdle();
   // Assume the server replies same message to both requests.
   test_url_factory_.ExpectRequestAndSimulateResponse(
       kReadAloudServerUrl, expected_headers, expected_body,
-      base::StringPrintf(kTemplateResponse, encoded_output.c_str()),
-      net::HTTP_OK);
+      CreateServerResponse(expected_output), net::HTTP_OK);
   test_task_env_.RunUntilIdle();
 
   // The first request gets an error message while the second request gets the
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc
new file mode 100644
index 0000000..d63f51fc
--- /dev/null
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc
@@ -0,0 +1,123 @@
+// 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/enhanced_network_tts/enhanced_network_tts_test_utils.h"
+
+#include <memory>
+
+#include "base/base64.h"
+#include "base/json/json_reader.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h"
+
+namespace ash {
+namespace enhanced_network_tts {
+namespace {
+
+bool HasOneDecimalDigit(absl::optional<double> rate) {
+  if (!rate.has_value())
+    return false;
+  return std::abs(static_cast<int>(rate.value() * 10) - rate.value() * 10) <
+         kDoubleCompareAccuracy;
+}
+
+}  // namespace
+
+const char kFullRequestTemplate[] =
+    R"({
+        "advanced_options": {
+          "audio_generation_options": {"speed_factor": %.1f},
+          "force_language": "%s"
+        },
+        "text": {
+          "text_parts": ["%s"]
+        },
+        "voice_settings": {
+          "voice_criteria_and_selections": [{
+            "criteria": {"language": "%s"},
+            "selection": {"default_voice": "%s"}
+          }]
+        }
+      })";
+
+extern const char kSimpleRequestTemplate[] =
+    R"({"advanced_options": {
+          "audio_generation_options": {"speed_factor": %.1f}
+        },
+        "text": {"text_parts": ["%s"]}})";
+
+extern const char kTemplateResponse[] =
+    R"([
+        {"metadata": {}},
+        {"text": {
+          "timingInfo": [
+            {
+              "text": "test1",
+              "location": {
+                "textLocation": {"length": 5},
+                "timeLocation": {
+                  "timeOffset": "0.01s",
+                  "duration": "0.14s"
+                }
+              }
+            },
+            {
+              "text": "test2",
+              "location": {
+                "textLocation": {"length": 5, "offset": 6},
+                "timeLocation": {
+                  "timeOffset": "0.16s",
+                  "duration": "0.17s"
+                }
+              }
+            }
+          ]}
+        },
+        {"audio": {"bytes": "%s"}}
+      ])";
+
+std::string CreateCorrectRequest(const std::string& input_text,
+                                 float rate,
+                                 const std::string& voice_name,
+                                 const std::string& lang) {
+  return base::StringPrintf(kFullRequestTemplate, rate, lang.c_str(),
+                            input_text.c_str(), lang.c_str(),
+                            voice_name.c_str());
+}
+
+std::string CreateCorrectRequest(const std::string& input_text, float rate) {
+  return base::StringPrintf(kSimpleRequestTemplate, rate, input_text.c_str());
+}
+
+std::string CreateServerResponse(const std::vector<uint8_t>& expected_output) {
+  std::string encoded_output(expected_output.begin(), expected_output.end());
+  base::Base64Encode(encoded_output, &encoded_output);
+  return base::StringPrintf(kTemplateResponse, encoded_output.c_str());
+}
+
+bool AreRequestsEqual(const std::string& json_a, const std::string& json_b) {
+  const std::unique_ptr<base::Value> dict_a =
+      base::JSONReader::ReadDeprecated(json_a);
+  const std::unique_ptr<base::Value> dict_b =
+      base::JSONReader::ReadDeprecated(json_b);
+
+  const absl::optional<double> rate_a =
+      dict_a->FindDoublePath(kSpeechFactorPath);
+  const absl::optional<double> rate_b =
+      dict_b->FindDoublePath(kSpeechFactorPath);
+  // Speech rates should have only one decimal digit.
+  if (!HasOneDecimalDigit(rate_a) || !HasOneDecimalDigit(rate_b))
+    return false;
+  // Compare the speech rates with |kDoubleCompareAccuracy|.
+  if (std::abs(rate_a.value() - rate_b.value()) > kDoubleCompareAccuracy)
+    return false;
+
+  // Compare the dicts without the speech rates.
+  dict_a->RemovePath(kSpeechFactorPath);
+  dict_b->RemovePath(kSpeechFactorPath);
+  return *dict_a == *dict_b;
+}
+
+}  // namespace enhanced_network_tts
+}  // namespace ash
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.h b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.h
new file mode 100644
index 0000000..611f547a
--- /dev/null
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.h
@@ -0,0 +1,53 @@
+// 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 CHROME_BROWSER_ASH_ENHANCED_NETWORK_TTS_ENHANCED_NETWORK_TTS_TEST_UTILS_H_
+#define CHROME_BROWSER_ASH_ENHANCED_NETWORK_TTS_ENHANCED_NETWORK_TTS_TEST_UTILS_H_
+
+#include <stddef.h>
+#include <string>
+#include <vector>
+
+#include "base/values.h"
+
+namespace ash {
+namespace enhanced_network_tts {
+
+// The accuracy used to compare two doubles.
+constexpr double kDoubleCompareAccuracy = 0.000001;
+
+// The template for a full request that contains utterance, rate, voice name,
+// and language. See https://goto.google.com/readaloud-proto for more
+// information.
+extern const char kFullRequestTemplate[];
+
+// The template for a simple request that only contains utterance and rate.
+// See https://goto.google.com/readaloud-proto for more information.
+extern const char kSimpleRequestTemplate[];
+
+// Template for a server response.
+extern const char kTemplateResponse[];
+
+// Create a correct request based on the |kFullRequestTemplate|.
+std::string CreateCorrectRequest(const std::string& input_text,
+                                 float rate,
+                                 const std::string& voice_name,
+                                 const std::string& lang);
+
+// Create a correct request based on the |kSimpleRequestTemplate|.
+std::string CreateCorrectRequest(const std::string& input_text, float rate);
+
+// Create a server response based on the |kTemplateResponse|.
+std::string CreateServerResponse(const std::vector<uint8_t>& expected_output);
+
+// Check if two request strings are equal. Use the |kDoubleCompareAccuracy| when
+// checking speech rates. This assumes the two strings follow
+// |kFullRequestTemplate| or |kSimpleRequestTemplate|, and speech rates have one
+// decimal digit only.
+bool AreRequestsEqual(const std::string& json_a, const std::string& json_b);
+
+}  // namespace enhanced_network_tts
+}  // namespace ash
+
+#endif  // CHROME_BROWSER_ASH_ENHANCED_NETWORK_TTS_ENHANCED_NETWORK_TTS_TEST_UTILS_H_
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
index 969f892..f4abe9e8 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
@@ -9,9 +9,9 @@
 
 #include "base/base64.h"
 #include "base/cxx17_backports.h"
+#include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h"
 #include "ui/accessibility/ax_text_utils.h"
@@ -30,25 +30,67 @@
 
 // The server requires the rate to be between 0.3 and 4.0, in steps of 0.1.
 float ClampRateToLimits(float rate) {
-  return base::clamp(rate, kMinRate, kMaxRate);
+  float clampped_rate = base::clamp(rate, kMinRate, kMaxRate);
+  // Set the precision to one significant digit.
+  return static_cast<float>(static_cast<int>(clampped_rate * 10) / 10.0f);
 }
 
 }  // namespace
 
 std::string FormatJsonRequest(const mojom::TtsRequestPtr tts_request) {
-  const std::string& utterance = tts_request->utterance;
+  base::Value request(base::Value::Type::DICTIONARY);
+
+  // utterance is sent as {'text': {'text_parts': [<utterance>]} }
+  base::Value text_parts(base::Value::Type::LIST);
+  text_parts.Append(std::move(tts_request->utterance));
+  request.SetPath(kTextPartsPath, std::move(text_parts));
+
+  // Speech rate, Voice and language are sent as
+  // {
+  //   {'advanced_options':
+  //     {
+  //       'audio_generation_options': {'speed_factor': <rate>},
+  //       'force_language':<lang>
+  //     }
+  //   },
+  //   {'voice_settings':
+  //     {'voice_criteria_and_selections':
+  //       [{
+  //          'selection': {'default_voice':<voice>}},
+  //          'criteria': {'language':<lang>}}
+  //       }]
+  //     }
+  //   }
+  // }
+  // See https://goto.google.com/readaloud-proto for more information.
+
+  // Add speech rate.
   const float rate = ClampRateToLimits(tts_request->rate);
+  request.SetPath(kSpeechFactorPath, base::Value(rate));
 
   // The voice and language have to be set together to be valid.
   if (tts_request->voice.has_value() && tts_request->lang.has_value()) {
-    const std::string& voice = tts_request->voice.value();
-    const std::string& lang = tts_request->lang.value();
+    // Force the server to produce audio based on the current lang.
+    request.SetPath(kForceLanguagePath, base::Value(tts_request->lang.value()));
 
-    return base::StringPrintf(kFullRequestTemplate, rate, lang.c_str(),
-                              utterance.c_str(), lang.c_str(), voice.c_str());
+    // Produce 'voice_criteria_and_selections'.
+    base::Value selection(base::Value::Type::DICTIONARY);
+    selection.SetKey(kDefaultVoiceKey,
+                     base::Value(std::move(tts_request->voice.value())));
+    base::Value criteria(base::Value::Type::DICTIONARY);
+    criteria.SetKey(kLanguageKey, base::Value(tts_request->lang.value()));
+    base::Value voice_selection(base::Value::Type::DICTIONARY);
+    voice_selection.SetKey(kSelectionKey, std::move(selection));
+    voice_selection.SetKey(kCriteriaKey, std::move(criteria));
+    base::Value voice_criteria_and_selections(base::Value::Type::LIST);
+    voice_criteria_and_selections.Append(std::move(voice_selection));
+    request.SetPath(kVoiceCriteriaAndSelectionsPath,
+                    std::move(voice_criteria_and_selections));
   }
 
-  return base::StringPrintf(kSimpleRequestTemplate, rate, utterance.c_str());
+  std::string json_request;
+  base::JSONWriter::Write(request, &json_request);
+  return json_request;
 }
 
 std::vector<uint16_t> FindTextBreaks(const std::string& utterance,
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils_unittest.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils_unittest.cc
index d8f7edd..a2e28f1b 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils_unittest.cc
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils_unittest.cc
@@ -6,39 +6,16 @@
 
 #include <memory>
 
-#include "base/base64.h"
 #include "base/json/json_reader.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_constants.h"
+#include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace ash {
 namespace enhanced_network_tts {
-namespace {
 
-// Template for a server response.
-constexpr char kTemplateResponse[] =
-    R"([
-        {"metadata": {}},
-        {"text": {
-          "timingInfo": [
-            {
-              "text": "test1",
-              "location": {
-                "textLocation": {"length": 5},
-                "timeLocation": {
-                  "timeOffset": "0.01s",
-                  "duration": "0.14s"
-                }
-              }
-            }
-          ]}
-        },
-        {"audio": {"bytes": "%s"}}
-      ])";
-
-}  // namespace
 using EnhancedNetworkTtsUtilsTest = testing::Test;
 
 TEST_F(EnhancedNetworkTtsUtilsTest, FormatJsonRequest) {
@@ -47,49 +24,54 @@
   const std::string voice = "test_name";
   const std::string language = "en-US";
   const std::string expected_text =
-      base::StringPrintf(kFullRequestTemplate, rate, language.c_str(),
-                         utterance.c_str(), language.c_str(), voice.c_str());
+      CreateCorrectRequest(utterance, rate, voice, language);
   const std::string formatted_text = FormatJsonRequest(
       mojom::TtsRequest::New(utterance, rate, voice, language));
-
-  EXPECT_EQ(formatted_text, expected_text);
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
 }
 
 TEST_F(EnhancedNetworkTtsUtilsTest, FormatJsonRequestWithUtteranceOnly) {
   const std::string utterance = "Hello, World!";
   const float rate = 1.0;
-  const std::string expected_text =
-      base::StringPrintf(kSimpleRequestTemplate, rate, utterance.c_str());
+  const std::string expected_text = CreateCorrectRequest(utterance, rate);
   const std::string formatted_text = FormatJsonRequest(
       mojom::TtsRequest::New(utterance, rate, absl::nullopt, absl::nullopt));
 
-  EXPECT_EQ(formatted_text, expected_text);
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
+}
+
+TEST_F(EnhancedNetworkTtsUtilsTest, FormatJsonRequestWithQuotes) {
+  const std::string quotes = "Hello, \"World!\"";
+  const std::string quotes_for_template = "Hello, \\\"World!\\\"";
+  const float rate = 1.0;
+  const std::string expected_text =
+      CreateCorrectRequest(quotes_for_template, rate);
+  const std::string formatted_text = FormatJsonRequest(
+      mojom::TtsRequest::New(quotes, rate, absl::nullopt, absl::nullopt));
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
 }
 
 TEST_F(EnhancedNetworkTtsUtilsTest, FormatJsonRequestWithDifferentRates) {
   std::string utterance = "Rate will be capped to kMaxRate";
   float rate = kMaxRate + 1.0f;
-  std::string expected_text =
-      base::StringPrintf(kSimpleRequestTemplate, kMaxRate, utterance.c_str());
+  std::string expected_text = CreateCorrectRequest(utterance, kMaxRate);
   std::string formatted_text = FormatJsonRequest(
       mojom::TtsRequest::New(utterance, rate, absl::nullopt, absl::nullopt));
-  EXPECT_EQ(formatted_text, expected_text);
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
 
   utterance = "Rate will be floored to kMinRate";
   rate = kMinRate - 0.1f;
-  expected_text =
-      base::StringPrintf(kSimpleRequestTemplate, kMinRate, utterance.c_str());
+  expected_text = CreateCorrectRequest(utterance, kMinRate);
   formatted_text = FormatJsonRequest(
       mojom::TtsRequest::New(utterance, rate, absl::nullopt, absl::nullopt));
-  EXPECT_EQ(formatted_text, expected_text);
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
 
   utterance = "Rate has precision of 0.1";
   rate = 3.5111111;
-  expected_text =
-      base::StringPrintf(kSimpleRequestTemplate, 3.5f, utterance.c_str());
+  expected_text = CreateCorrectRequest(utterance, 3.5f);
   formatted_text = FormatJsonRequest(
       mojom::TtsRequest::New(utterance, rate, absl::nullopt, absl::nullopt));
-  EXPECT_EQ(formatted_text, expected_text);
+  EXPECT_TRUE(AreRequestsEqual(formatted_text, expected_text));
 }
 
 TEST_F(EnhancedNetworkTtsUtilsTest, FindTextBreaks) {
@@ -163,12 +145,9 @@
 
 TEST_F(EnhancedNetworkTtsUtilsTest, UnpackJsonResponseSucceed) {
   const std::vector<uint8_t> response_data = {1, 2, 5};
-  std::string encoded_data(response_data.begin(), response_data.end());
-  base::Base64Encode(encoded_data, &encoded_data);
-  const std::string encoded_response =
-      base::StringPrintf(kTemplateResponse, encoded_data.c_str());
+  const std::string server_response = CreateServerResponse(response_data);
   const std::unique_ptr<base::Value> json =
-      base::JSONReader::ReadDeprecated(encoded_response);
+      base::JSONReader::ReadDeprecated(server_response);
 
   mojom::TtsResponsePtr result = UnpackJsonResponse(*json);
 
diff --git a/chrome/browser/ash/system_logs/network_health_source.cc b/chrome/browser/ash/system_logs/network_health_source.cc
index e7c5b47c..882d5995 100644
--- a/chrome/browser/ash/system_logs/network_health_source.cc
+++ b/chrome/browser/ash/system_logs/network_health_source.cc
@@ -122,6 +122,9 @@
     case RoutineProblems::Tag::ARC_HTTP_PROBLEMS:
       problemsStr = ProblemsToStr(problems->get_arc_http_problems());
       break;
+    case RoutineProblems::Tag::ARC_DNS_RESOLUTION_PROBLEMS:
+      problemsStr = ProblemsToStr(problems->get_arc_dns_resolution_problems());
+      break;
   }
   return problemsStr;
 }
diff --git a/chrome/browser/captive_portal/captive_portal_browsertest.cc b/chrome/browser/captive_portal/captive_portal_browsertest.cc
index 8babee4c..96cad052 100644
--- a/chrome/browser/captive_portal/captive_portal_browsertest.cc
+++ b/chrome/browser/captive_portal/captive_portal_browsertest.cc
@@ -25,7 +25,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -566,6 +565,7 @@
   // InProcessBrowserTest:
   void SetUpOnMainThread() override;
   void TearDownOnMainThread() override;
+  void SetUpCommandLine(base::CommandLine* command_line) override;
 
   // Called by |url_loader_interceptor_|.
   // It emulates captive portal behavior.
@@ -574,7 +574,8 @@
   // behind a captive portal.
   bool OnIntercept(content::URLLoaderInterceptor::RequestParams* params);
 
-  // Sets the captive portal checking preference.
+  // Sets the captive portal checking preference.  Does not affect the command
+  // line flag, which is set in SetUpCommandLine.
   void EnableCaptivePortalDetection(Profile* profile, bool enabled);
 
   // Enables or disables actual captive portal probes. Should only be called
@@ -923,7 +924,6 @@
   }
 
  protected:
-  base::test::ScopedFeatureList feature_list_;
   std::unique_ptr<content::URLLoaderInterceptor> url_loader_interceptor_;
   std::unique_ptr<base::RunLoop> run_loop_;
   // Only accessed on the UI thread.
@@ -949,7 +949,6 @@
       scoped_domain_(false),
 #endif
       browser_list_(BrowserList::GetInstance()) {
-  feature_list_.InitAndEnableFeature(kCaptivePortalInterstitial);
 }
 
 CaptivePortalBrowserTest::~CaptivePortalBrowserTest() = default;
@@ -1099,6 +1098,13 @@
   url_loader_interceptor_.reset();
 }
 
+void CaptivePortalBrowserTest::SetUpCommandLine(
+    base::CommandLine* command_line) {
+  // Enable finch experiment for captive portal interstitials.
+  command_line->AppendSwitchASCII(
+      switches::kForceFieldTrials, "CaptivePortalInterstitial/Enabled/");
+}
+
 void CaptivePortalBrowserTest::EnableCaptivePortalDetection(
     Profile* profile, bool enabled) {
   profile->GetPrefs()->SetBoolean(embedder_support::kAlternateErrorPagesEnabled,
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index ca2c31d6..1a523bb6 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -19,10 +19,12 @@
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/lite_video/lite_video_observer.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
+#include "chrome/browser/net/net_error_tab_helper.h"
 #include "chrome/browser/net_benchmarking.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/predictors/loading_predictor.h"
 #include "chrome/browser/predictors/loading_predictor_factory.h"
+#include "chrome/browser/subresource_redirect/subresource_redirect_observer.h"
 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h"
 #include "chrome/common/buildflags.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
@@ -45,6 +47,7 @@
 #include "content/public/browser/service_worker_version_base_info.h"
 #include "media/mojo/buildflags.h"
 #include "mojo/public/cpp/bindings/binder_map.h"
+#include "printing/buildflags/buildflags.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "third_party/widevine/cdm/buildflags.h"
 
@@ -94,6 +97,13 @@
 #include "components/pdf/browser/pdf_web_contents_helper.h"  // nogncheck
 #endif
 
+#if BUILDFLAG(ENABLE_PRINTING)
+#include "chrome/browser/printing/print_view_manager_basic.h"
+#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
+#include "chrome/browser/printing/print_view_manager.h"
+#endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
+#endif  // BUILDFLAG(ENABLE_PRINTING)
+
 #if BUILDFLAG(ENABLE_PLUGINS)
 #include "chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h"
 #include "chrome/browser/plugins/plugin_observer.h"
@@ -360,6 +370,27 @@
             render_frame_host);
     return true;
   }
+  if (interface_name == chrome::mojom::NetworkDiagnostics::Name_) {
+    chrome_browser_net::NetErrorTabHelper::BindNetworkDiagnostics(
+        mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnostics>(
+            std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
+  if (interface_name == chrome::mojom::NetworkEasterEgg::Name_) {
+    chrome_browser_net::NetErrorTabHelper::BindNetworkEasterEgg(
+        mojo::PendingAssociatedReceiver<chrome::mojom::NetworkEasterEgg>(
+            std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
+  if (interface_name == chrome::mojom::NetErrorPageSupport::Name_) {
+    chrome_browser_net::NetErrorTabHelper::BindNetErrorPageSupport(
+        mojo::PendingAssociatedReceiver<chrome::mojom::NetErrorPageSupport>(
+            std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
   if (interface_name ==
       chrome::mojom::OpenSearchDescriptionDocumentHandler::Name_) {
     SearchEngineTabHelper::BindOpenSearchDescriptionDocumentHandler(
@@ -449,6 +480,20 @@
     return true;
   }
 #endif
+#if BUILDFLAG(ENABLE_PRINTING)
+  if (interface_name == printing::mojom::PrintManagerHost::Name_) {
+    mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver(
+        std::move(*handle));
+#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
+    printing::PrintViewManager::BindPrintManagerHost(std::move(receiver),
+                                                     render_frame_host);
+#else
+    printing::PrintViewManagerBasic::BindPrintManagerHost(std::move(receiver),
+                                                          render_frame_host);
+#endif
+    return true;
+  }
+#endif  // BUILDFLAG(ENABLE_PRINTING)
   if (interface_name ==
       security_interstitials::mojom::InterstitialCommands::Name_) {
     security_interstitials::SecurityInterstitialTabHelper::
@@ -468,6 +513,16 @@
         render_frame_host);
     return true;
   }
+  if (interface_name ==
+      subresource_redirect::mojom::SubresourceRedirectService::Name_) {
+    subresource_redirect::SubresourceRedirectObserver::
+        BindSubresourceRedirectService(
+            mojo::PendingAssociatedReceiver<
+                subresource_redirect::mojom::SubresourceRedirectService>(
+                std::move(*handle)),
+            render_frame_host);
+    return true;
+  }
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
   if (interface_name == supervised_user::mojom::SupervisedUserCommands::Name_) {
     SupervisedUserNavigationObserver::BindSupervisedUserCommands(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 18f4ab1..56c871a 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -2940,6 +2940,8 @@
     "net/delay_network_call.h",
     "net/dhcp_wpad_url_client.cc",
     "net/dhcp_wpad_url_client.h",
+    "net/network_diagnostics/arc_dns_resolution_routine.cc",
+    "net/network_diagnostics/arc_dns_resolution_routine.h",
     "net/network_diagnostics/arc_http_routine.cc",
     "net/network_diagnostics/arc_http_routine.h",
     "net/network_diagnostics/captive_portal_routine.cc",
@@ -3828,6 +3830,8 @@
     "../ash/drive/drivefs_native_message_host_unittest.cc",
     "../ash/drive/file_system_util_unittest.cc",
     "../ash/enhanced_network_tts/enhanced_network_tts_impl_unittest.cc",
+    "../ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc",
+    "../ash/enhanced_network_tts/enhanced_network_tts_test_utils.h",
     "../ash/enhanced_network_tts/enhanced_network_tts_utils_unittest.cc",
     "../ash/events/event_rewriter_unittest.cc",
     "../ash/exo/chrome_data_exchange_delegate_unittest.cc",
@@ -4261,6 +4265,7 @@
     "nearby/bluetooth_adapter_manager_unittest.cc",
     "nearby/nearby_process_manager_impl_unittest.cc",
     "net/client_cert_store_chromeos_unittest.cc",
+    "net/network_diagnostics/arc_dns_resolution_routine_unittest.cc",
     "net/network_diagnostics/arc_http_routine_unittest.cc",
     "net/network_diagnostics/captive_portal_routine_unittest.cc",
     "net/network_diagnostics/dns_latency_routine_unittest.cc",
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index d15d1009..0f2d1a83 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -802,6 +802,7 @@
 struct SmoothnessTrackerInfo {
   absl::optional<ui::ThroughputTracker> tracker;
   ui::ThroughputTrackerHost::ReportCallback callback;
+  bool stopping = false;
 };
 using DisplaySmoothnessTrackerInfos = std::map<int64_t, SmoothnessTrackerInfo>;
 DisplaySmoothnessTrackerInfos* GetDisplaySmoothnessTrackerInfos() {
@@ -5020,8 +5021,15 @@
                             base::NumberToString(display_id)})));
   }
 
+  if (it->second.stopping) {
+    return RespondNow(Error(
+        base::StrCat({"stopSmoothnessTracking already called for display: ",
+                      base::NumberToString(display_id)})));
+  }
+
   it->second.callback = base::BindOnce(
       &AutotestPrivateStopSmoothnessTrackingFunction::OnReportData, this);
+  it->second.stopping = true;
   it->second.tracker->Stop();
 
   return did_respond() ? AlreadyResponded() : RespondLater();
diff --git a/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.cc b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.cc
new file mode 100644
index 0000000..882af1c
--- /dev/null
+++ b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.cc
@@ -0,0 +1,127 @@
+// 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 <algorithm>
+#include <utility>
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h"
+#include "components/arc/arc_service_manager.h"
+#include "net/dns/public/dns_protocol.h"
+
+namespace chromeos {
+namespace network_diagnostics {
+
+namespace {
+
+// These hostnames were chosen because they need to be resolved for a
+// successful ARC provisioning step.
+constexpr char kHostname1[] = "www.googleapis.com";
+constexpr char kHostname2[] = "android.clients.google.com";
+constexpr char kHostname3[] = "android.googleapis.com";
+
+}  // namespace
+
+ArcDnsResolutionRoutine::ArcDnsResolutionRoutine() {
+  hostnames_to_resolve_dns_ = {kHostname1, kHostname2, kHostname3};
+}
+
+ArcDnsResolutionRoutine::~ArcDnsResolutionRoutine() = default;
+
+mojom::RoutineType ArcDnsResolutionRoutine::Type() {
+  return mojom::RoutineType::kArcDnsResolution;
+}
+
+void ArcDnsResolutionRoutine::Run() {
+  AttemptNextQuery();
+}
+
+void ArcDnsResolutionRoutine::AttemptNextQuery() {
+  // If no more hostnames to resolve, report success and analyze results.
+  if (hostnames_to_resolve_dns_.empty()) {
+    successfully_resolved_hostnames_ = true;
+    AnalyzeResultsAndExecuteCallback();
+    return;
+  }
+
+  std::string hostname = hostnames_to_resolve_dns_.back();
+  hostnames_to_resolve_dns_.pop_back();
+
+  // Call the DnsResolutionTest API from the instance of NetInstance.
+  arc::mojom::NetInstance* net_instance = GetNetInstance();
+  net_instance->DnsResolutionTest(
+      "" /* default network */, hostname,
+      base::BindOnce(&ArcDnsResolutionRoutine::OnQueryComplete,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+arc::mojom::NetInstance* ArcDnsResolutionRoutine::GetNetInstance() {
+  // If |net_instance_| is not already set for testing purposes, get instance
+  // of NetInstance service.
+  if (net_instance_) {
+    return net_instance_;
+  }
+
+  // Call the singleton for ArcServiceManager and check if it is null.
+  auto* arc_service_manager = arc::ArcServiceManager::Get();
+  if (!arc_service_manager) {
+    failed_to_get_arc_service_manager_ = true;
+    AnalyzeResultsAndExecuteCallback();
+    return nullptr;
+  }
+
+  // Get an instance of the NetInstance service and check if it is null.
+  auto* arc_bridge_service = arc_service_manager->arc_bridge_service();
+  arc::mojom::NetInstance* net_instance =
+      ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service->net(), DnsResolutionTest);
+  if (!net_instance) {
+    failed_to_get_net_instance_service_for_dns_resolution_test_ = true;
+    AnalyzeResultsAndExecuteCallback();
+    return nullptr;
+  }
+  return net_instance;
+}
+
+void ArcDnsResolutionRoutine::OnQueryComplete(
+    arc::mojom::ArcDnsResolutionTestResultPtr result) {
+  if (!result->is_successful ||
+      result->response_code != net::dns_protocol::kRcodeNOERROR) {
+    successfully_resolved_hostnames_ = false;
+    AnalyzeResultsAndExecuteCallback();
+    return;
+  }
+
+  max_latency_ = std::max(max_latency_, result->duration_ms);
+  AttemptNextQuery();
+}
+
+void ArcDnsResolutionRoutine::AnalyzeResultsAndExecuteCallback() {
+  if (!successfully_resolved_hostnames_) {
+    set_verdict(mojom::RoutineVerdict::kProblem);
+    problems_.push_back(mojom::ArcDnsResolutionProblem::kFailedDnsQueries);
+  } else if (failed_to_get_arc_service_manager_) {
+    set_verdict(mojom::RoutineVerdict::kNotRun);
+    problems_.push_back(
+        mojom::ArcDnsResolutionProblem::kFailedToGetArcServiceManager);
+  } else if (failed_to_get_net_instance_service_for_dns_resolution_test_) {
+    set_verdict(mojom::RoutineVerdict::kNotRun);
+    problems_.push_back(mojom::ArcDnsResolutionProblem::
+                            kFailedToGetNetInstanceForDnsResolutionTest);
+  } else if (max_latency_ <= util::kDnsProblemLatencyMs &&
+             max_latency_ > util::kDnsPotentialProblemLatencyMs) {
+    set_verdict(mojom::RoutineVerdict::kProblem);
+    problems_.push_back(mojom::ArcDnsResolutionProblem::kHighLatency);
+  } else if (max_latency_ > util::kDnsProblemLatencyMs) {
+    set_verdict(mojom::RoutineVerdict::kProblem);
+    problems_.push_back(mojom::ArcDnsResolutionProblem::kVeryHighLatency);
+  } else {
+    set_verdict(mojom::RoutineVerdict::kNoProblem);
+  }
+  set_problems(mojom::RoutineProblems::NewArcDnsResolutionProblems(problems_));
+  ExecuteCallback();
+}
+
+}  // namespace network_diagnostics
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h
new file mode 100644
index 0000000..2a30b0b
--- /dev/null
+++ b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h
@@ -0,0 +1,64 @@
+// 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 CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_ARC_DNS_RESOLUTION_ROUTINE_H_
+#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_ARC_DNS_RESOLUTION_ROUTINE_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_routine.h"
+#include "components/arc/mojom/net.mojom.h"
+#include "components/arc/session/arc_bridge_service.h"
+
+namespace chromeos {
+namespace network_diagnostics {
+
+// Performs DNS queries from within ARC to resolve a hardcoded set of hostnames
+// and returns the result.
+class ArcDnsResolutionRoutine : public NetworkDiagnosticsRoutine {
+ public:
+  using RunArcDnsResolutionCallback =
+      mojom::NetworkDiagnosticsRoutines::RunArcDnsResolutionCallback;
+
+  ArcDnsResolutionRoutine();
+  ArcDnsResolutionRoutine(const ArcDnsResolutionRoutine&) = delete;
+  ArcDnsResolutionRoutine& operator=(const ArcDnsResolutionRoutine&) = delete;
+  ~ArcDnsResolutionRoutine() override;
+
+  // NetworkDiagnosticsRoutine:
+  mojom::RoutineType Type() override;
+  void Run() override;
+  void AnalyzeResultsAndExecuteCallback() override;
+
+  void set_net_instance_for_testing(arc::mojom::NetInstance* net_instance) {
+    net_instance_ = net_instance;
+  }
+
+ private:
+  // Attempts the next DNS query.
+  void AttemptNextQuery();
+
+  // Gets NetInstance service if it is not already set for testing
+  // purposes as |net_instance_|.
+  arc::mojom::NetInstance* GetNetInstance();
+
+  // Processes the |result| of an DnsResolutionTest API request.
+  void OnQueryComplete(arc::mojom::ArcDnsResolutionTestResultPtr result);
+
+  std::vector<std::string> hostnames_to_resolve_dns_;
+  std::vector<mojom::ArcDnsResolutionProblem> problems_;
+  bool successfully_resolved_hostnames_ = true;
+  bool failed_to_get_arc_service_manager_ = false;
+  bool failed_to_get_net_instance_service_for_dns_resolution_test_ = false;
+  arc::mojom::NetInstance* net_instance_ = nullptr;
+  int64_t max_latency_ = 0;
+  base::WeakPtrFactory<ArcDnsResolutionRoutine> weak_ptr_factory_{this};
+};
+
+}  // namespace network_diagnostics
+}  // namespace chromeos
+
+#endif  //  CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_ARC_DNS_RESOLUTION_ROUTINE_H_
diff --git a/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine_unittest.cc b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine_unittest.cc
new file mode 100644
index 0000000..9cc5b7a
--- /dev/null
+++ b/chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine_unittest.cc
@@ -0,0 +1,130 @@
+// 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 <memory>
+
+#include "base/test/task_environment.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h"
+#include "components/arc/test/fake_net_instance.h"
+#include "content/public/test/browser_task_environment.h"
+#include "net/dns/public/dns_protocol.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace network_diagnostics {
+
+namespace {
+
+const int kNoProblemDelayMs = 100;
+const int kHighLatencyDelayMs = 450;
+const int kVeryHighLatencyDelayMs = 550;
+
+}  // namespace
+
+class ArcDnsResolutionRoutineTest : public ::testing::Test {
+ public:
+  ArcDnsResolutionRoutineTest() {}
+
+  ArcDnsResolutionRoutineTest(const ArcDnsResolutionRoutineTest&) = delete;
+  ArcDnsResolutionRoutineTest& operator=(const ArcDnsResolutionRoutineTest&) =
+      delete;
+  ~ArcDnsResolutionRoutineTest() override = default;
+
+  void CompareResult(
+      mojom::RoutineVerdict expected_verdict,
+      const std::vector<mojom::ArcDnsResolutionProblem>& expected_problems,
+      mojom::RoutineResultPtr result) {
+    EXPECT_EQ(expected_verdict, result->verdict);
+    EXPECT_EQ(expected_problems,
+              result->problems->get_arc_dns_resolution_problems());
+    run_loop_.Quit();
+  }
+
+ protected:
+  void RunRoutine(
+      mojom::RoutineVerdict expected_routine_verdict,
+      const std::vector<mojom::ArcDnsResolutionProblem>& expected_problems) {
+    arc_dns_resolution_routine_->RunRoutine(
+        base::BindOnce(&ArcDnsResolutionRoutineTest::CompareResult, weak_ptr(),
+                       expected_routine_verdict, expected_problems));
+    run_loop_.Run();
+  }
+
+  void SetUpRoutine(arc::mojom::ArcDnsResolutionTestResult result) {
+    // Set up the fake NetworkInstance service.
+    fake_net_instance_ = std::make_unique<arc::FakeNetInstance>();
+    fake_net_instance_->set_dns_resolution_test_result(result);
+
+    // Set up routine with fake NetworkInstance service.
+    arc_dns_resolution_routine_ = std::make_unique<ArcDnsResolutionRoutine>();
+    arc_dns_resolution_routine_->set_net_instance_for_testing(
+        fake_net_instance_.get());
+  }
+
+  base::WeakPtr<ArcDnsResolutionRoutineTest> weak_ptr() {
+    return weak_factory_.GetWeakPtr();
+  }
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+  base::RunLoop run_loop_;
+  std::unique_ptr<ArcDnsResolutionRoutine> arc_dns_resolution_routine_;
+  std::unique_ptr<arc::FakeNetInstance> fake_net_instance_;
+  base::WeakPtrFactory<ArcDnsResolutionRoutineTest> weak_factory_{this};
+};
+
+TEST_F(ArcDnsResolutionRoutineTest, TestNoProblem) {
+  arc::mojom::ArcDnsResolutionTestResult result;
+  result.is_successful = true;
+  result.response_code = net::dns_protocol::kRcodeNOERROR;
+  result.duration_ms = kNoProblemDelayMs;
+
+  SetUpRoutine(result);
+  RunRoutine(mojom::RoutineVerdict::kNoProblem, {});
+}
+
+TEST_F(ArcDnsResolutionRoutineTest, TestDnsQueryFailed) {
+  arc::mojom::ArcDnsResolutionTestResult result;
+  result.is_successful = false;
+
+  SetUpRoutine(result);
+  RunRoutine(mojom::RoutineVerdict::kProblem,
+             {mojom::ArcDnsResolutionProblem::kFailedDnsQueries});
+}
+
+TEST_F(ArcDnsResolutionRoutineTest, TestBadResponseCode) {
+  arc::mojom::ArcDnsResolutionTestResult result;
+  result.is_successful = true;
+  result.response_code = net::dns_protocol::kRcodeREFUSED;
+  result.duration_ms = kNoProblemDelayMs;
+
+  SetUpRoutine(result);
+  RunRoutine(mojom::RoutineVerdict::kProblem,
+             {mojom::ArcDnsResolutionProblem::kFailedDnsQueries});
+}
+
+TEST_F(ArcDnsResolutionRoutineTest, TestHighLatency) {
+  arc::mojom::ArcDnsResolutionTestResult result;
+  result.is_successful = true;
+  result.response_code = net::dns_protocol::kRcodeNOERROR;
+  result.duration_ms = kHighLatencyDelayMs;
+
+  SetUpRoutine(result);
+  RunRoutine(mojom::RoutineVerdict::kProblem,
+             {mojom::ArcDnsResolutionProblem::kHighLatency});
+}
+
+TEST_F(ArcDnsResolutionRoutineTest, TestVeryHighLatency) {
+  arc::mojom::ArcDnsResolutionTestResult result;
+  result.is_successful = true;
+  result.response_code = net::dns_protocol::kRcodeNOERROR;
+  result.duration_ms = kVeryHighLatencyDelayMs;
+
+  SetUpRoutine(result);
+  RunRoutine(mojom::RoutineVerdict::kProblem,
+             {mojom::ArcDnsResolutionProblem::kVeryHighLatency});
+}
+
+}  // namespace network_diagnostics
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/net/network_diagnostics/dns_latency_routine.cc b/chrome/browser/chromeos/net/network_diagnostics/dns_latency_routine.cc
index d80f837f..77776e4 100644
--- a/chrome/browser/chromeos/net/network_diagnostics/dns_latency_routine.cc
+++ b/chrome/browser/chromeos/net/network_diagnostics/dns_latency_routine.cc
@@ -14,6 +14,7 @@
 #include "base/rand_util.h"
 #include "base/time/default_tick_clock.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/session_manager/core/session_manager.h"
 #include "content/public/browser/storage_partition.h"
@@ -36,9 +37,9 @@
 // |kPossibleChars|.
 constexpr int kHostPrefixLength = 8;
 constexpr base::TimeDelta kBadLatencyMs =
-    base::TimeDelta::FromMilliseconds(400);
+    base::TimeDelta::FromMilliseconds(util::kDnsPotentialProblemLatencyMs);
 constexpr base::TimeDelta kVeryBadLatencyMs =
-    base::TimeDelta::FromMilliseconds(500);
+    base::TimeDelta::FromMilliseconds(util::kDnsProblemLatencyMs);
 constexpr char kHostSuffix[] = "-ccd-testing-v4.metric.gstatic.com";
 
 const std::string GetRandomString(int length) {
diff --git a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.cc b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.cc
index 24b490d..7501eee 100644
--- a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.cc
+++ b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "chrome/browser/chromeos/net/network_diagnostics/arc_dns_resolution_routine.h"
 #include "chrome/browser/chromeos/net/network_diagnostics/arc_http_routine.h"
 #include "chrome/browser/chromeos/net/network_diagnostics/captive_portal_routine.h"
 #include "chrome/browser/chromeos/net/network_diagnostics/dns_latency_routine.h"
@@ -260,6 +261,12 @@
   RunRoutine(std::move(routine), std::move(callback));
 }
 
+void NetworkDiagnostics::RunArcDnsResolution(
+    RunArcDnsResolutionCallback callback) {
+  auto routine = std::make_unique<ArcDnsResolutionRoutine>();
+  RunRoutine(std::move(routine), std::move(callback));
+}
+
 void NetworkDiagnostics::RunRoutine(
     std::unique_ptr<NetworkDiagnosticsRoutine> routine,
     RoutineResultCallback callback) {
diff --git a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.h b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.h
index 49e76d3..d3149f8 100644
--- a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.h
+++ b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics.h
@@ -61,6 +61,7 @@
   void RunVideoConferencing(const absl::optional<std::string>& stun_server_name,
                             RunVideoConferencingCallback callback) override;
   void RunArcHttp(RunArcHttpCallback callback) override;
+  void RunArcDnsResolution(RunArcDnsResolutionCallback callback) override;
   void GetResult(const mojom::RoutineType type,
                  GetResultCallback callback) override;
   void GetAllResults(GetAllResultsCallback callback) override;
diff --git a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h
index d2419f7..2123d07 100644
--- a/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h
+++ b/chrome/browser/chromeos/net/network_diagnostics/network_diagnostics_util.h
@@ -20,6 +20,12 @@
 
 namespace util {
 
+// DNS queries taking longer than 400 ms are potentially problematic.
+constexpr int kDnsPotentialProblemLatencyMs = 400;
+
+// DNS queries taking longer than 500 ms are problematic.
+constexpr int kDnsProblemLatencyMs = 500;
+
 // Generate 204 path.
 extern const char kGenerate204Path[];
 
diff --git a/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationDialog.java b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationDialog.java
index a1c265e..cf5c04c 100644
--- a/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationDialog.java
+++ b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationDialog.java
@@ -256,12 +256,20 @@
     private void focus(int index) {
         ++mNbTemplateSwitches;
         View noteView = getNoteViewAt(index);
+
+        // When scrolling fast the view might be already recycled. See crbug.com/1238306
+        if (noteView == null) return;
+
         noteView.setElevation(
                 getActivity().getResources().getDimension(R.dimen.focused_note_elevation));
     }
 
     private void unFocus(int index) {
         View noteView = getNoteViewAt(index);
+
+        // When scrolling fast the view might be already recycled. See crbug.com/1238306
+        if (noteView == null) return;
+
         noteView.setElevation(0);
     }
 
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 44a5fb4d..4bc9e01 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -355,9 +355,11 @@
   // dangerous file has already been reported.
   auto* scan_result = static_cast<enterprise_connectors::ScanResult*>(
       download->GetUserData(enterprise_connectors::ScanResult::kKey));
-  if (scan_result &&
-      enterprise_connectors::ContainsMalwareVerdict(scan_result->response)) {
-    return;
+  if (scan_result) {
+    for (const auto& metadata : scan_result->file_metadata) {
+      if (enterprise_connectors::ContainsMalwareVerdict(metadata.scan_response))
+        return;
+    }
   }
 
   auto* router =
diff --git a/chrome/browser/engagement/important_sites_util_browsertest.cc b/chrome/browser/engagement/important_sites_util_browsertest.cc
index 60be09e..f1b9dee 100644
--- a/chrome/browser/engagement/important_sites_util_browsertest.cc
+++ b/chrome/browser/engagement/important_sites_util_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/engagement/important_sites_util.h"
 
+#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/android/search_permissions/search_permissions_service.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -12,6 +13,7 @@
 #include "chrome/test/base/chrome_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "components/permissions/features.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
 #include "content/public/test/browser_test.h"
@@ -66,8 +68,20 @@
     ASSERT_NO_FATAL_FAILURE(GetDefaultSearchURL());
   }
 
+  void SetUp() override {
+    features_.InitAndDisableFeature(
+        permissions::features::kRevertDSEAutomaticPermissions);
+    AndroidBrowserTest::SetUp();
+  }
+
+  void TearDown() override {
+    features_.Reset();
+    AndroidBrowserTest::TearDown();
+  }
+
  private:
   GURL default_search_url_;
+  base::test::ScopedFeatureList features_;
 
   DISALLOW_COPY_AND_ASSIGN(ImportantSitesUtilBrowserTest);
 };
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
index a0d8913b..3d1eed4 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -644,26 +644,49 @@
   DCHECK(is_result());
   DCHECK(contents_view_);
 
-  ui::NativeTheme::ColorId color_id =
-      is_success() ? ui::NativeTheme::kColorId_AlertSeverityLow
-                   : ui::NativeTheme::kColorId_AlertSeverityHigh;
+  ui::NativeTheme::ColorId color_id;
+  switch (dialog_state_) {
+    case State::PENDING:
+      NOTREACHED();
+      color_id = ui::NativeTheme::kColorId_ThrobberSpinningColor;
+      break;
+    case State::SUCCESS:
+      color_id = ui::NativeTheme::kColorId_ThrobberSpinningColor;
+      break;
+    case State::FAILURE:
+      color_id = ui::NativeTheme::kColorId_AlertSeverityHigh;
+      break;
+    case State::WARNING:
+      color_id = ui::NativeTheme::kColorId_AlertSeverityMedium;
+      break;
+  }
   return contents_view_->GetNativeTheme()->GetSystemColor(color_id);
 }
 
-int ContentAnalysisDialog::GetPasteImageId(bool use_dark) const {
-  if (is_pending())
-    return use_dark ? IDR_PASTE_SCANNING_DARK : IDR_PASTE_SCANNING;
-  if (is_success())
-    return use_dark ? IDR_PASTE_SUCCESS_DARK : IDR_PASTE_SUCCESS;
-  return use_dark ? IDR_PASTE_VIOLATION_DARK : IDR_PASTE_VIOLATION;
-}
-
-int ContentAnalysisDialog::GetUploadImageId(bool use_dark) const {
-  if (is_pending())
-    return use_dark ? IDR_UPLOAD_SCANNING_DARK : IDR_UPLOAD_SCANNING;
-  if (is_success())
-    return use_dark ? IDR_UPLOAD_SUCCESS_DARK : IDR_UPLOAD_SUCCESS;
-  return use_dark ? IDR_UPLOAD_VIOLATION_DARK : IDR_UPLOAD_VIOLATION;
+int ContentAnalysisDialog::GetTopImageId(bool use_dark) const {
+  if (use_dark) {
+    switch (dialog_state_) {
+      case State::PENDING:
+        return IDR_UPLOAD_SCANNING_DARK;
+      case State::SUCCESS:
+        return IDR_UPLOAD_SUCCESS_DARK;
+      case State::FAILURE:
+        return IDR_UPLOAD_VIOLATION_DARK;
+      case State::WARNING:
+        return IDR_UPLOAD_WARNING_DARK;
+    }
+  } else {
+    switch (dialog_state_) {
+      case State::PENDING:
+        return IDR_UPLOAD_SCANNING;
+      case State::SUCCESS:
+        return IDR_UPLOAD_SUCCESS;
+      case State::FAILURE:
+        return IDR_UPLOAD_VIOLATION;
+      case State::WARNING:
+        return IDR_UPLOAD_WARNING;
+    }
+  }
 }
 
 std::u16string ContentAnalysisDialog::GetPendingMessage() const {
@@ -721,15 +744,8 @@
 
 const gfx::ImageSkia* ContentAnalysisDialog::GetTopImage() const {
   const bool use_dark = color_utils::IsDark(GetBackgroundColor(contents_view_));
-  const bool treat_as_text_paste =
-      access_point_ == safe_browsing::DeepScanAccessPoint::PASTE ||
-      (access_point_ == safe_browsing::DeepScanAccessPoint::DRAG_AND_DROP &&
-       files_count_ == 0);
-
-  int image_id = treat_as_text_paste ? GetPasteImageId(use_dark)
-                                     : GetUploadImageId(use_dark);
-
-  return ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(image_id);
+  return ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+      GetTopImageId(use_dark));
 }
 
 SkColor ContentAnalysisDialog::GetSideImageLogoColor() const {
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
index aa9e89b..9457231 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
@@ -201,11 +201,8 @@
   // Returns the text for the Ok button for the warning case.
   std::u16string GetBypassWarningButtonText() const;
 
-  // Returns the appropriate paste top image ID depending on |dialog_state_|.
-  int GetPasteImageId(bool use_dark) const;
-
-  // Returns the appropriate upload top image ID depending on |dialog_state_|.
-  int GetUploadImageId(bool use_dark) const;
+  // Returns the appropriate top image ID depending on |dialog_state_|.
+  int GetTopImageId(bool use_dark) const;
 
   // Returns the appropriate pending message depending on |files_count_|.
   std::u16string GetPendingMessage() const;
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
index 7e2045f..b971333 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -354,21 +354,7 @@
     // The top image is the pending one corresponding to the access point.
     const gfx::ImageSkia& actual_image =
         dialog->GetTopImageForTesting()->GetImage();
-    int expected_image_id = 0;
-    switch (access_point()) {
-      case safe_browsing::DeepScanAccessPoint::DRAG_AND_DROP:
-        expected_image_id =
-            file_scan() ? IDR_UPLOAD_SCANNING : IDR_PASTE_SCANNING;
-        break;
-      case safe_browsing::DeepScanAccessPoint::UPLOAD:
-        expected_image_id = IDR_UPLOAD_SCANNING;
-        break;
-      case safe_browsing::DeepScanAccessPoint::PASTE:
-        expected_image_id = IDR_PASTE_SCANNING;
-        break;
-      case safe_browsing::DeepScanAccessPoint::DOWNLOAD:
-        NOTREACHED();
-    }
+    int expected_image_id = IDR_UPLOAD_SCANNING;
     gfx::ImageSkia* expected_image =
         ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
             expected_image_id);
@@ -391,23 +377,8 @@
     // point and scan type.
     const gfx::ImageSkia& actual_image =
         dialog->GetTopImageForTesting()->GetImage();
-    int expected_image_id = 0;
-    switch (access_point()) {
-      case safe_browsing::DeepScanAccessPoint::DRAG_AND_DROP:
-        expected_image_id =
-            file_scan() ? success() ? IDR_UPLOAD_SUCCESS : IDR_UPLOAD_VIOLATION
-                        : success() ? IDR_PASTE_SUCCESS : IDR_PASTE_VIOLATION;
-        break;
-      case safe_browsing::DeepScanAccessPoint::UPLOAD:
-        expected_image_id =
-            success() ? IDR_UPLOAD_SUCCESS : IDR_UPLOAD_VIOLATION;
-        break;
-      case safe_browsing::DeepScanAccessPoint::PASTE:
-        expected_image_id = success() ? IDR_PASTE_SUCCESS : IDR_PASTE_VIOLATION;
-        break;
-      case safe_browsing::DeepScanAccessPoint::DOWNLOAD:
-        NOTREACHED();
-    }
+    int expected_image_id =
+        success() ? IDR_UPLOAD_SUCCESS : IDR_UPLOAD_VIOLATION;
     gfx::ImageSkia* expected_image =
         ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
             expected_image_id);
diff --git a/chrome/browser/enterprise/connectors/common.cc b/chrome/browser/enterprise/connectors/common.cc
index be5314dc..2f19f53 100644
--- a/chrome/browser/enterprise/connectors/common.cc
+++ b/chrome/browser/enterprise/connectors/common.cc
@@ -129,9 +129,23 @@
   return TriggeredRule::ACTION_UNSPECIFIED;
 }
 
+FileMetadata::FileMetadata(const std::string& filename,
+                           const std::string& sha256,
+                           const std::string& mime_type,
+                           int64_t size,
+                           const ContentAnalysisResponse& scan_response)
+    : filename(filename),
+      sha256(sha256),
+      mime_type(mime_type),
+      size(size),
+      scan_response(scan_response) {}
+FileMetadata::FileMetadata(FileMetadata&&) = default;
+FileMetadata::~FileMetadata() = default;
+
 const char ScanResult::kKey[] = "enterprise_connectors.scan_result_key";
-ScanResult::ScanResult(const ContentAnalysisResponse& response)
-    : response(response) {}
+ScanResult::ScanResult(FileMetadata metadata) {
+  file_metadata.push_back(std::move(metadata));
+}
 ScanResult::~ScanResult() = default;
 
 bool ContainsMalwareVerdict(const ContentAnalysisResponse& response) {
diff --git a/chrome/browser/enterprise/connectors/common.h b/chrome/browser/enterprise/connectors/common.h
index f5c0241..af7b021 100644
--- a/chrome/browser/enterprise/connectors/common.h
+++ b/chrome/browser/enterprise/connectors/common.h
@@ -150,13 +150,33 @@
     const TriggeredRule::Action& action_1,
     const TriggeredRule::Action& action_2);
 
-// User data class to persist ContentAnalysisResponses in base::SupportsUserData
-// objects.
+// Struct used to persist metadata about a file in base::SupportsUserData
+// through ScanResult.
+struct FileMetadata {
+  explicit FileMetadata(const std::string& filename,
+                        const std::string& sha256,
+                        const std::string& mime_type,
+                        int64_t size,
+                        const ContentAnalysisResponse& scan_response);
+  FileMetadata(FileMetadata&&);
+  FileMetadata(const FileMetadata&) = delete;
+  ~FileMetadata();
+
+  std::string filename;
+  std::string sha256;
+  std::string mime_type;
+  int64_t size;
+  ContentAnalysisResponse scan_response;
+};
+
+// User data class to persist scanning results for multiple files corresponding
+// to a single base::SupportsUserData object.
 struct ScanResult : public base::SupportsUserData::Data {
-  explicit ScanResult(const ContentAnalysisResponse& response);
+  explicit ScanResult(FileMetadata metadata);
   ~ScanResult() override;
   static const char kKey[];
-  ContentAnalysisResponse response;
+
+  std::vector<FileMetadata> file_metadata;
 };
 
 // Checks if |response| contains a negative malware verdict.
diff --git a/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc b/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc
index 67b57c48..ad0d7946 100644
--- a/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc
+++ b/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc
@@ -34,19 +34,6 @@
 namespace enterprise_connectors {
 
 const char kBox[] = "box";
-// Also kWildcardSendDownloadToCloudPref in test_helper.h.
-constexpr char kRenameSendDownloadToCloudPref[] = R"([
-  {
-    "service_provider": "box",
-    "enterprise_id": "1234567890",
-    "enable": [
-      {
-        "url_list": ["renameme.com"],
-        "mime_types": ["text/plain", "image/png", "application/zip"]
-      }
-    ]
-  }
-])";
 
 using RenameHandler = FileSystemRenameHandler;
 
@@ -128,75 +115,172 @@
 
 INSTANTIATE_TEST_CASE_P(, RenameHandlerCreateTest, testing::Bool());
 
-class RenameHandlerCreateTest_ByUrl : public RenameHandlerCreateTestBase {
- public:
-  RenameHandlerCreateTest_ByUrl() {
-    Init(true, kRenameSendDownloadToCloudPref);
+struct PolicyTestParam {
+  const char* test_policy;
+  std::string item_url;
+  std::string tab_url;
+  std::string item_mime_type;
+  bool expect_routing;
+  std::string expect_logic_msg;
+
+  // To print param value for debugging.
+  std::string Print() const {
+    std::string str("\nExpectation logic: ");
+    str += expect_logic_msg;
+    str += "\nTest inputs:\n > Policy: ";
+    str += test_policy;
+    str += "\n > test item item url: " + item_url +
+           "\n > test item tab url: " + tab_url +
+           "\n > test item mime type: " + item_mime_type;
+    return str;
   }
 };
 
-TEST_F(RenameHandlerCreateTest_ByUrl, NoUrlMatchesPattern) {
-  content::FakeDownloadItem item;
-  item.SetURL(GURL("https://one.com/file.txt"));
-  item.SetTabUrl(GURL("https://two.com"));
-  item.SetMimeType("text/plain");
-  content::DownloadItemUtils::AttachInfo(&item, profile(), nullptr);
-
-  auto handler = RenameHandler::CreateIfNeeded(&item);
-  ASSERT_EQ(nullptr, handler.get());
-}
-
-TEST_F(RenameHandlerCreateTest_ByUrl, FileUrlMatchesPattern) {
-  content::FakeDownloadItem item;
-  item.SetURL(GURL("https://renameme.com/file.txt"));
-  item.SetTabUrl(GURL("https://two.com"));
-  item.SetMimeType("text/plain");
-  content::DownloadItemUtils::AttachInfo(&item, profile(), nullptr);
-
-  auto handler = RenameHandler::CreateIfNeeded(&item);
-  ASSERT_NE(nullptr, handler.get());
-}
-
-TEST_F(RenameHandlerCreateTest_ByUrl, TabUrlMatchesPattern) {
-  content::FakeDownloadItem item;
-  item.SetURL(GURL("https://one.com/file.txt"));
-  item.SetTabUrl(GURL("https://renameme.com"));
-  item.SetMimeType("text/plain");
-  content::DownloadItemUtils::AttachInfo(&item, profile(), nullptr);
-
-  auto handler = RenameHandler::CreateIfNeeded(&item);
-  ASSERT_NE(nullptr, handler.get());
-}
-
-TEST_F(RenameHandlerCreateTest_ByUrl, DisallowByMimeType) {
-  content::FakeDownloadItem item;
-  item.SetURL(GURL("https://renameme.com/file.json"));
-  item.SetTabUrl(GURL("https://renameme.com"));
-  item.SetMimeType("application/json");
-  content::DownloadItemUtils::AttachInfo(&item, profile(), nullptr);
-
-  auto handler = RenameHandler::CreateIfNeeded(&item);
-  ASSERT_EQ(nullptr, handler.get());
-}
-
-class RenameHandlerCreateTest_Wildcard : public RenameHandlerCreateTestBase {
- public:
-  RenameHandlerCreateTest_Wildcard() {
-    Init(true, kWildcardSendDownloadToCloudPref);
-  }
+class RenameHandlerCreateTest_Policies
+    : public RenameHandlerCreateTestBase,
+      public testing::WithParamInterface<PolicyTestParam> {
+  void SetUp() override { Init(true, GetParam().test_policy); }
 };
 
-TEST_F(RenameHandlerCreateTest_Wildcard, AllowedByWildcard) {
+TEST_P(RenameHandlerCreateTest_Policies, Test) {
+  const auto& param = GetParam();
+
   content::FakeDownloadItem item;
-  item.SetURL(GURL("https://one.com/file.txt"));
-  item.SetTabUrl(GURL("https://two.com"));
-  item.SetMimeType("text/plain");
+  item.SetURL(GURL(param.item_url));
+  item.SetTabUrl(GURL(param.tab_url));
+  item.SetMimeType(param.item_mime_type);
   content::DownloadItemUtils::AttachInfo(&item, profile(), nullptr);
 
   auto handler = RenameHandler::CreateIfNeeded(&item);
-  ASSERT_NE(nullptr, handler.get());
+  bool rename_handler_created = handler.get() != nullptr;
+  ASSERT_EQ(param.expect_routing, rename_handler_created) << param.Print();
 }
 
+namespace {
+constexpr char kFSCPref_NoEnterpriseId[] = R"([
+  {
+    "service_provider": "box",
+    "enable": [
+      {
+        "url_list": [ "yes.com" ],
+        "mime_types": [ "text/plain", "image/png", "application/zip" ]
+      }
+    ]
+  }
+])";
+
+constexpr char kFSCPref_EmptyEnable[] = R"([
+  {
+    "service_provider": "box",
+    "enterprise_id": "1234567890",
+    "enable": [
+      {
+        "url_list": [ ],
+        "mime_types": [ ]
+      }
+    ]
+  }
+])";
+
+PolicyTestParam invalid_policy_should_fail{kFSCPref_NoEnterpriseId,
+                                           "yes.com/file.txt",
+                                           "yes.com",
+                                           "text/plain",
+                                           false,
+                                           "Invalid policy ===> NO routing"};
+// kWildcardSendDownloadToCloudPref is in test_helper.h.
+PolicyTestParam wildcard_should_route_everything{
+    kWildcardSendDownloadToCloudPref,
+    "https://no.com/file.txt",
+    "https://no.com",
+    "text/plain",
+    true,
+    "Wildcard policy ===> Any URL/MIME should result in YES routing"};
+PolicyTestParam empty_enable_equals_off{
+    kFSCPref_EmptyEnable,
+    "https://yes.com/file.txt",
+    "https://yes.com",
+    "text/plain",
+    false,
+    "Empty enable ===> Everything should result in NO routing"};
+std::vector<PolicyTestParam> simple_policies_tests = {
+    invalid_policy_should_fail, wildcard_should_route_everything,
+    empty_enable_equals_off};
+
+INSTANTIATE_TEST_CASE_P(SimplePolicies,
+                        RenameHandlerCreateTest_Policies,
+                        testing::ValuesIn(simple_policies_tests));
+}  // namespace
+
+namespace {
+constexpr char kFSCPref_OffByDefault_Except[] = R"([
+  {
+    "service_provider": "box",
+    "enterprise_id": "1234567890",
+    "enable": [
+      {
+        "url_list": ["renameme.com"],
+        "mime_types": ["text/plain", "image/png", "application/zip"]
+      }
+    ]
+  }
+])";
+PolicyTestParam no_url_matches_pattern{
+    kFSCPref_OffByDefault_Except,
+    "https://one.com/file.txt",
+    "https://two.com",
+    "text/plain",
+    false,
+    "No URL matches pattern ===> NO routing"};
+PolicyTestParam file_url_matches_pattern{
+    kFSCPref_OffByDefault_Except,
+    "https://renameme.com/file.txt",
+    "https://two.com",
+    "text/plain",
+    true,
+    "File URL matches pattern ===> YES routing"};
+PolicyTestParam tab_url_matches_pattern{
+    kFSCPref_OffByDefault_Except,
+    "https://one.com/file.txt",
+    "https://renameme.com",
+    "text/plain",
+    true,
+    "Tab URL matches pattern ===> YES routing"};
+PolicyTestParam disallowed_by_mime_type{
+    kFSCPref_OffByDefault_Except,
+    "https://renameme.com/file.json",
+    "https://renameme.com",
+    "application/json",
+    false,
+    "Disalloswed by MIME type  ===> NO routing"};
+
+constexpr char kFSCPref_OffByDefault_Except_NoMimeTypes[] = R"([
+  {
+   "domain": "google.com",
+   "enable": [ {
+      "url_list": [ "reddit.com" ]
+   } ],
+   "enterprise_id": "611447719",
+   "service_provider": "box"
+}
+])";
+PolicyTestParam no_enable_field_equals_disable{
+    kFSCPref_OffByDefault_Except_NoMimeTypes,
+    "https://renameme.com/file.txt",
+    "https://two.com",
+    "text/plain",
+    false,
+    "No enable field in policy means no exception to enable ===> Everything "
+    "should result in NO routing"};
+
+std::vector<PolicyTestParam> off_by_default_policies_tests = {
+    no_url_matches_pattern, file_url_matches_pattern, tab_url_matches_pattern,
+    disallowed_by_mime_type, no_enable_field_equals_disable};
+INSTANTIATE_TEST_CASE_P(OffByDefaultPolicies,
+                        RenameHandlerCreateTest_Policies,
+                        testing::ValuesIn(off_by_default_policies_tests));
+}  // namespace
+
 constexpr char ATokenBySignIn[] = "ATokenBySignIn";
 constexpr char RTokenBySignIn[] = "RTokenBySignIn";
 constexpr char ATokenByFetcher[] = "ATokenByFetcher";
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings.cc b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
index b77cc6c4..4862b91 100644
--- a/chrome/browser/enterprise/connectors/file_system/service_settings.cc
+++ b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
@@ -31,14 +31,6 @@
 
   service_provider_name_ = *service_provider_name;
 
-  const std::string* enterprise_id =
-      settings_value.FindStringKey(kKeyEnterpriseId);
-  if (enterprise_id) {
-    enterprise_id_ = *enterprise_id;
-  } else {
-    return;
-  }
-
   // The domain will not be present if the admin has not set it.
   const std::string* domain = settings_value.FindStringKey(kKeyDomain);
   if (domain)
@@ -51,31 +43,39 @@
   url_matcher::URLMatcherConditionSet::ID id(0);
   const base::Value* enable = settings_value.FindListKey(kKeyEnable);
   if (enable && enable->is_list() && !enable->GetList().empty()) {
-    for (const base::Value& value : enable->GetList())
-      AddUrlPatternSettings(value, true, &id);
+    filters_validated_ = true;
+    for (const base::Value& value : enable->GetList()) {
+      filters_validated_ &=
+          AddUrlPatternSettings(value, /* enabled = */ true, &id);
+    }
+    LOG_IF(ERROR, !filters_validated_) << "Invalid filters: " << settings_value;
   } else {
+    LOG(ERROR) << "Find no enable field in policy: " << settings_value;
+    filters_validated_ = false;
     return;
   }
 
   const base::Value* disable = settings_value.FindListKey(kKeyDisable);
-  if (disable && disable->is_list()) {
-    for (const base::Value& value : disable->GetList())
-      AddUrlPatternSettings(value, false, &id);
+  if (disable && disable->is_list() && !disable->GetList().empty()) {
+    for (const base::Value& value : disable->GetList()) {
+      filters_validated_ &=
+          AddUrlPatternSettings(value, /* enabled = */ false, &id);
+    }
+    LOG_IF(ERROR, !filters_validated_) << "Invalid filters: " << settings_value;
   }
 
   // Add all the URLs automatically disabled by the service provider.
-  base::Value disable_value(base::Value::Type::DICTIONARY);
+  filters_validated_ &= AddUrlsDisabledByServiceProvider(&id);
+  LOG_IF(ERROR, !filters_validated_) << "Filters could NOT be validated";
 
-  std::vector<base::Value> urls;
-  for (const std::string& url : service_provider_->fs_disable())
-    urls.emplace_back(url);
-  disable_value.SetKey(kKeyUrlList, base::Value(urls));
-
-  std::vector<base::Value> mime_types;
-  mime_types.emplace_back(kWildcardMimeType);
-  disable_value.SetKey(kKeyMimeTypes, base::Value(mime_types));
-
-  AddUrlPatternSettings(disable_value, false, &id);
+  // Extracct enterprise_id last so that empty enterprise_id does not prevent
+  // the filters from being validated.
+  const std::string* enterprise_id =
+      settings_value.FindStringKey(kKeyEnterpriseId);
+  if (enterprise_id) {
+    enterprise_id_ = *enterprise_id;
+  }
+  DLOG_IF(ERROR, !enterprise_id) << "No enteprise id found! " << settings_value;
 }
 
 FileSystemServiceSettings::FileSystemServiceSettings(
@@ -110,7 +110,7 @@
 
   DCHECK(url.is_valid()) << "URL: " << url;
 
-  auto settings = GetGlobalSettings();
+  absl::optional<FileSystemSettings> settings = GetGlobalSettings();
   if (settings.has_value()) {
     DCHECK(matcher_);
     std::set<std::string> mime_types;
@@ -150,48 +150,75 @@
 
 bool FileSystemServiceSettings::IsValid() const {
   // The settings are valid only if a provider was given.
-  return service_provider_ && !enterprise_id_.empty();
+  return service_provider_ && filters_validated_ && !enterprise_id_.empty();
 }
 
-void FileSystemServiceSettings::AddUrlPatternSettings(
+bool FileSystemServiceSettings::AddUrlsDisabledByServiceProvider(
+    url_matcher::URLMatcherConditionSet::ID* id) {
+  base::Value disable_value(base::Value::Type::DICTIONARY);
+
+  std::vector<base::Value> urls;
+  for (const std::string& url : service_provider_->fs_disable())
+    urls.emplace_back(url);
+  disable_value.SetKey(kKeyUrlList, base::Value(urls));
+
+  std::vector<base::Value> mime_types;
+  mime_types.emplace_back(kWildcardMimeType);
+  disable_value.SetKey(kKeyMimeTypes, base::Value(mime_types));
+
+  bool validated =
+      AddUrlPatternSettings(disable_value, /* enabled = */ false, id);
+  LOG_IF(ERROR, !validated)
+      << "Invalid filters by service provider " << disable_value;
+  return validated;
+}
+
+bool FileSystemServiceSettings::AddUrlPatternSettings(
     const base::Value& url_settings_value,
     bool enabled,
     url_matcher::URLMatcherConditionSet::ID* id) {
   DCHECK(id);
   DCHECK(service_provider_);
-  if (enabled)
-    DCHECK(disabled_patterns_settings_.empty());
-  else
-    DCHECK(!enabled_patterns_settings_.empty());
+  if (enabled) {
+    if (!disabled_patterns_settings_.empty()) {
+      LOG(ERROR) << "disabled_patterns_settings_ must be empty when enabling: "
+                 << url_settings_value;
+      return false;
+    }
+  } else if (enabled_patterns_settings_.empty()) {
+    LOG(ERROR) << "enabled_patterns_settings_ can't be empty when disabling: "
+               << url_settings_value;
+    return false;
+  }
 
   URLPatternSettings setting;
 
   const base::Value* mime_types = url_settings_value.FindListKey(kKeyMimeTypes);
-  if (mime_types && mime_types->is_list()) {
-    for (const base::Value& mime_type : mime_types->GetList()) {
-      if (mime_type.is_string()) {
-        setting.mime_types.insert(mime_type.GetString());
-      }
+  if (!mime_types || !mime_types->is_list()) {
+    return false;
+  }
+  for (const base::Value& mime_type : mime_types->GetList()) {
+    if (mime_type.is_string()) {
+      setting.mime_types.insert(mime_type.GetString());
     }
-  } else {
-    return;
   }
 
   // Add the URL patterns to the matcher and store the condition set IDs.
   const base::Value* url_list = url_settings_value.FindListKey(kKeyUrlList);
-  if (url_list && url_list->is_list()) {
-    const base::ListValue* url_list_value = nullptr;
-    url_list->GetAsList(&url_list_value);
-    DCHECK(url_list_value);
-    policy::url_util::AddFilters(matcher_.get(), enabled, id, url_list_value);
-  } else {
-    return;
+  if (!url_list || !url_list->is_list()) {
+    return false;
   }
+  const base::ListValue* url_list_value = nullptr;
+  url_list->GetAsList(&url_list_value);
+  DCHECK(url_list_value);
+  policy::url_util::AddFilters(matcher_.get(), enabled, id, url_list_value);
 
   if (enabled)
     enabled_patterns_settings_[*id] = std::move(setting);
   else
     disabled_patterns_settings_[*id] = std::move(setting);
+
+  return true;
 }
 
 std::set<std::string> FileSystemServiceSettings::GetMimeTypes(
@@ -218,8 +245,10 @@
       disable_mime_types.insert(mime_types.begin(), mime_types.end());
   }
 
+  // Disable takes precedence in case of conflicting logic.
   for (const std::string& mime_type_to_disable : disable_mime_types) {
     if (mime_type_to_disable == kWildcardMimeType) {
+      LOG_IF(ERROR, disable_mime_types.size() > 1U) << "Already has wildcard";
       enable_mime_types.clear();
       break;
     }
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings.h b/chrome/browser/enterprise/connectors/file_system/service_settings.h
index 2bce7405..adf14f8 100644
--- a/chrome/browser/enterprise/connectors/file_system/service_settings.h
+++ b/chrome/browser/enterprise/connectors/file_system/service_settings.h
@@ -60,9 +60,12 @@
   // false, then GetSettings will always return absl::nullopt.
   bool IsValid() const;
 
+  bool AddUrlsDisabledByServiceProvider(
+      url_matcher::URLMatcherConditionSet::ID* id);
+
   // Updates the states of |matcher_|, |enabled_patterns_settings_| and/or
   // |disabled_patterns_settings_| from a policy value.
-  void AddUrlPatternSettings(const base::Value& url_settings_value,
+  bool AddUrlPatternSettings(const base::Value& url_settings_value,
                              bool enabled,
                              url_matcher::URLMatcherConditionSet::ID* id);
 
@@ -96,6 +99,7 @@
   // work and avoid having the two maps cover an overlap of matches.
   PatternSettings enabled_patterns_settings_;
   PatternSettings disabled_patterns_settings_;
+  bool filters_validated_ = false;
 
   // When signing in to the service provider, only accounts that belong to this
   // enterprise are accepted.  This prevents people from connecting arbitrary
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings_unittest.cc b/chrome/browser/enterprise/connectors/file_system/service_settings_unittest.cc
index c7a97a7d..a8e89c7 100644
--- a/chrome/browser/enterprise/connectors/file_system/service_settings_unittest.cc
+++ b/chrome/browser/enterprise/connectors/file_system/service_settings_unittest.cc
@@ -60,7 +60,7 @@
 })";
 
 constexpr char kNoEnterpriseIdSettings[] = R"({
-  "service_provider": "google",
+  "service_provider": "box",
   "domain": "example.com",
   "enable": [
     {
@@ -208,7 +208,9 @@
   FileSystemServiceSettings service_settings(settings.value(), config);
 
   auto file_system_settings = service_settings.GetSettings(url());
-  ASSERT_EQ(expected_mime_types() != nullptr, file_system_settings.has_value());
+  bool has_expected_mime_types = expected_mime_types() != nullptr;
+  ASSERT_EQ(has_expected_mime_types, file_system_settings.has_value())
+      << settings_value();
   if (file_system_settings.has_value()) {
     const ServiceProviderConfig::ServiceProvider* provider =
         config.GetServiceProvider("box");
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc b/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc
index 7204a81..40a87549 100644
--- a/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc
+++ b/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc
@@ -214,15 +214,26 @@
     base::Value user_info) {
   current_api_call_.reset();
   auto state = GoogleServiceAuthError::NONE;  // Assume success.
-  if (response.success) {
+
+  if (settings_.enterprise_id.empty()) {
+    NOTREACHED() << "enterprise_id is required field in policy but it's empty";
+    state = GoogleServiceAuthError::REQUEST_CANCELED;
+  } else if (!response.success) {
+    // Request for Box user's enterprise_id failed.
+    // TODO(https://crbug.com/1186488): Surface this error via UI to the user.
+    // This is handled as case 1c (other errors) by FileSystemRenameHandler.
+    state = GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE;
+  } else {
     DCHECK_EQ(response.net_or_http_code, net::HTTP_OK);
     const std::string* enterprise_id =
         user_info.FindStringPath(kBoxEnterpriseIdFieldName);
     if (!settings_.enterprise_id.empty()) {
-      DCHECK(enterprise_id);
+      DLOG_IF(ERROR, !enterprise_id)
+          << "Policy enforces account to have enterprise_id = "
+          << settings_.enterprise_id
+          << " but this account to be linked has none: " << user_info;
     }
-    if (!settings_.enterprise_id.empty() &&
-        settings_.enterprise_id.compare(*enterprise_id) != 0) {
+    if (settings_.enterprise_id.compare(*enterprise_id) != 0) {
       // User is logged in to wrong account which doesn't match enterprise_id.
       // TODO(https://crbug.com/1186488): Surface this error via UI to the user.
       // This is handled as case 1c (other errors) by FileSystemRenameHandler.
@@ -240,11 +251,6 @@
       SetFileSystemAccountInfo(prefs, kFileSystemServiceProviderPrefNameBox,
                                std::move(user_info));
     }
-  } else {
-    // Request for Box user's enterprise_id failed.
-    // TODO(https://crbug.com/1186488): Surface this error via UI to the user.
-    // This is handled as case 1c (other errors) by FileSystemRenameHandler.
-    state = GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE;
   }
 
   OnAuthFlowDone(GoogleServiceAuthError(state));
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_experience.cc b/chrome/browser/enterprise/connectors/file_system/signin_experience.cc
index eb92353..8bcb3c3 100644
--- a/chrome/browser/enterprise/connectors/file_system/signin_experience.cc
+++ b/chrome/browser/enterprise/connectors/file_system/signin_experience.cc
@@ -16,6 +16,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/download_item_utils.h"
 #include "google_apis/gaia/google_service_auth_error.h"
+#include "net/base/mime_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace {
@@ -49,8 +50,12 @@
 
 bool MimeTypeMatches(const std::set<std::string>& mime_types,
                      const std::string& mime_type) {
-  return mime_types.count(ec::kWildcardMimeType) != 0 ||
-         mime_types.count(mime_type) != 0;
+  for (const std::string& mime_type_pattern : mime_types) {
+    if (net::MatchesMimeType(mime_type_pattern, mime_type)) {
+      return true;
+    }
+  }
+  return false;
 }
 
 ec::ConnectorsService* GetConnectorsService(content::BrowserContext* context) {
@@ -83,7 +88,7 @@
   if (!service)
     return absl::nullopt;
 
-  auto settings = service->GetFileSystemSettings(
+  absl::optional<FileSystemSettings> settings = service->GetFileSystemSettings(
       download_item->GetURL(), FileSystemConnector::SEND_DOWNLOAD_TO_CLOUD);
   if (settings.has_value() &&
       MimeTypeMatches(settings->mime_types, download_item->GetMimeType())) {
diff --git a/chrome/browser/enterprise/connectors/file_system/test_helper.h b/chrome/browser/enterprise/connectors/file_system/test_helper.h
index 356561e..ef74b13 100644
--- a/chrome/browser/enterprise/connectors/file_system/test_helper.h
+++ b/chrome/browser/enterprise/connectors/file_system/test_helper.h
@@ -23,7 +23,7 @@
     "enable": [
       {
         "url_list": ["*"],
-        "mime_types": ["text/plain", "image/png", "application/zip"]
+        "mime_types": ["*"]
       }
     ]
   }
diff --git a/chrome/browser/enterprise/signals/context_info_fetcher.cc b/chrome/browser/enterprise/signals/context_info_fetcher.cc
index 4f13a76..17ee8f9 100644
--- a/chrome/browser/enterprise/signals/context_info_fetcher.cc
+++ b/chrome/browser/enterprise/signals/context_info_fetcher.cc
@@ -6,10 +6,12 @@
 
 #include <memory>
 
+#include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_split.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/util/affiliation.h"
@@ -29,6 +31,10 @@
 #include <wrl/client.h>
 #endif
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chromeos/dbus/constants/dbus_switches.h"
+#endif
+
 namespace enterprise_signals {
 
 namespace {
@@ -113,6 +119,18 @@
 }
 #endif
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+SettingValue GetChromeosFirewall() {
+  // The firewall is always enabled and can only be disabled in dev mode on
+  // ChromeOS. If the device isn't in dev mode, the firewall is guaranteed to be
+  // enabled whereas if it's in dev mode, the firewall could be enabled or not.
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  return command_line->HasSwitch(chromeos::switches::kSystemDevMode)
+             ? SettingValue::UNKNOWN
+             : SettingValue::ENABLED;
+}
+#endif
+
 }  // namespace
 
 ContextInfo::ContextInfo() = default;
@@ -280,6 +298,8 @@
   return GetUfwStatus();
 #elif defined(OS_WIN)
   return GetWinOSFirewall();
+#elif BUILDFLAG(IS_CHROMEOS_ASH)
+  return GetChromeosFirewall();
 #else
   return SettingValue::UNKNOWN;
 #endif
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
index a829b9b..e42f5cf 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
@@ -41,6 +41,7 @@
 #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chromeos/dbus/constants/dbus_switches.h"
 #endif
 
 namespace enterprise_reporting_private =
@@ -245,6 +246,94 @@
   EXPECT_EQ(site_isolation_enabled(), info.site_isolation_enabled);
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+class EnterpriseReportingPrivateGetContextInfoChromeOSFirewallTest
+    : public EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
+      public testing::WithParamInterface<bool> {
+ public:
+  bool dev_mode_enabled() { return GetParam(); }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    if (dev_mode_enabled()) {
+      command_line->AppendSwitch(chromeos::switches::kSystemDevMode);
+    } else {
+      command_line->RemoveSwitch(chromeos::switches::kSystemDevMode);
+    }
+  }
+
+  bool BuiltInDnsClientPlatformDefault() {
+#if defined(OS_CHROMEOS) || defined(OS_MAC) || defined(OS_ANDROID)
+    return true;
+#else
+    return false;
+#endif
+  }
+
+  void ExpectDefaultChromeCleanupEnabled(
+      const enterprise_reporting_private::ContextInfo& info) {
+#if defined(OS_WIN)
+    EXPECT_TRUE(*info.chrome_cleanup_enabled);
+#else
+    EXPECT_EQ(nullptr, info.chrome_cleanup_enabled.get());
+#endif
+  }
+
+  void ExpectDefaultThirdPartyBlockingEnabled(
+      const enterprise_reporting_private::ContextInfo& info) {
+#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+    EXPECT_TRUE(*info.third_party_blocking_enabled);
+#else
+    EXPECT_EQ(info.third_party_blocking_enabled, nullptr);
+#endif
+  }
+};
+
+IN_PROC_BROWSER_TEST_P(
+    EnterpriseReportingPrivateGetContextInfoChromeOSFirewallTest,
+    Test) {
+  auto function =
+      base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
+  auto context_info_value = std::unique_ptr<base::Value>(
+      extension_function_test_utils::RunFunctionAndReturnSingleResult(
+          function.get(),
+          /*args*/ "[]", browser()));
+
+  enterprise_reporting_private::ContextInfo info;
+  ASSERT_TRUE(enterprise_reporting_private::ContextInfo::Populate(
+      *context_info_value, &info));
+
+  EXPECT_TRUE(info.browser_affiliation_ids.empty());
+  EXPECT_TRUE(info.profile_affiliation_ids.empty());
+  EXPECT_TRUE(info.on_file_attached_providers.empty());
+  EXPECT_TRUE(info.on_file_downloaded_providers.empty());
+  EXPECT_TRUE(info.on_bulk_data_entry_providers.empty());
+  EXPECT_EQ(enterprise_reporting_private::REALTIME_URL_CHECK_MODE_DISABLED,
+            info.realtime_url_check_mode);
+  EXPECT_TRUE(info.on_security_event_providers.empty());
+  EXPECT_EQ(version_info::GetVersionNumber(), info.browser_version);
+  EXPECT_EQ(enterprise_reporting_private::SAFE_BROWSING_LEVEL_STANDARD,
+            info.safe_browsing_protection_level);
+  EXPECT_EQ(BuiltInDnsClientPlatformDefault(),
+            info.built_in_dns_client_enabled);
+  EXPECT_EQ(
+      enterprise_reporting_private::PASSWORD_PROTECTION_TRIGGER_POLICY_UNSET,
+      info.password_protection_warning_trigger);
+  ExpectDefaultChromeCleanupEnabled(info);
+  EXPECT_FALSE(info.chrome_remote_desktop_app_blocked);
+  ExpectDefaultThirdPartyBlockingEnabled(info);
+  EXPECT_EQ(dev_mode_enabled() ? api::enterprise_reporting_private::
+                                     SettingValue::SETTING_VALUE_UNKNOWN
+                               : api::enterprise_reporting_private::
+                                     SettingValue::SETTING_VALUE_ENABLED,
+            info.os_firewall);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    EnterpriseReportingPrivateGetContextInfoChromeOSFirewallTest,
+    testing::Bool());
+#endif
+
 // crbug.com/1230268 not working on Lacros.
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 #define MAYBE_AffiliationIDs DISABLED_AffiliationIDs
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 4b51696..ba692bca 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2954,11 +2954,6 @@
     "expiry_milestone": 100
   },
   {
-    "name": "expensive-background-timer-throttling",
-    "owners": [ "altimin" ],
-    "expiry_milestone": 76
-  },
-  {
     "name": "explore-sites",
     "owners": [ "chili", "dewittj" ],
     "expiry_milestone": 95
@@ -3073,7 +3068,7 @@
   {
     "name": "filling-across-affiliated-websites",
     "owners": [ "vsemeniuk", "vasilii" ],
-    "expiry_milestone": 93
+    "expiry_milestone": 96
   },
   {
     "name": "filling-passwords-from-any-origin",
@@ -3410,6 +3405,11 @@
     "expiry_milestone": 100
   },
   {
+    "name": "incognito-reauthentication-for-android",
+    "owners": [ "roagarwal", "rhalavati", "chrome-incognito@google.com" ],
+    "expiry_milestone": 100
+  },
+  {
     "name": "incognito-screenshot",
     "owners": [ "rhalavati", "chrome-privacy-core@google.com" ],
     "expiry_milestone": 97
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 45f16c7..308bb67 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -177,11 +177,6 @@
     "a blob and the verification process of the signed exchange is skipped for "
     "the succeeding navigation.";
 
-const char kUpdatedCellularActivationUiName[] =
-    "Updated Cellular Activation UI";
-const char kUpdatedCellularActivationUiDescription[] =
-    "Enables the updated cellular activation UI.";
-
 const char kUseLookalikesForNavigationSuggestionsName[] =
     "Use lookalike URL suggestions for navigation suggestions";
 const char kUseLookalikesForNavigationSuggestionsDescription[] =
@@ -1199,11 +1194,6 @@
 const char kEvDetailsInPageInfoDescription[] =
     "Shows the EV certificate details in the Page Info bubble.";
 
-const char kExpensiveBackgroundTimerThrottlingName[] =
-    "Throttle expensive background timers";
-const char kExpensiveBackgroundTimerThrottlingDescription[] =
-    "Enables intervention to limit CPU usage of background timers to 1%.";
-
 const char kExperimentalAccessibilityLabelsName[] =
     "Experimental Accessibility Labels";
 const char kExperimentalAccessibilityLabelsDescription[] =
@@ -1410,6 +1400,12 @@
     "When enabled, keeps Incognito UI consistent regardless of any selected "
     "theme.";
 
+const char kIncognitoReauthenticationForAndroidName[] =
+    "Enable device reauthentication for Incognito.";
+const char kIncognitoReauthenticationForAndroidDescription[] =
+    "When enabled, a setting appears in Settings > Privacy and Security, to "
+    "enable reauthentication for accessing your existing Incognito tabs.";
+
 const char kIncognitoBrandConsistencyForDesktopName[] =
     "Enable Incognito brand consistency in desktop.";
 const char kIncognitoBrandConsistencyForDesktopDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 6c9044e7..bf0ea15b 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -130,9 +130,6 @@
 extern const char kEnableSignedExchangePrefetchCacheForNavigationsName[];
 extern const char kEnableSignedExchangePrefetchCacheForNavigationsDescription[];
 
-extern const char kUpdatedCellularActivationUiName[];
-extern const char kUpdatedCellularActivationUiDescription[];
-
 extern const char kUseLookalikesForNavigationSuggestionsName[];
 extern const char kUseLookalikesForNavigationSuggestionsDescription[];
 
@@ -691,9 +688,6 @@
 extern const char kEvDetailsInPageInfoName[];
 extern const char kEvDetailsInPageInfoDescription[];
 
-extern const char kExpensiveBackgroundTimerThrottlingName[];
-extern const char kExpensiveBackgroundTimerThrottlingDescription[];
-
 extern const char kExperimentalAccessibilityLabelsName[];
 extern const char kExperimentalAccessibilityLabelsDescription[];
 
@@ -814,6 +808,9 @@
 extern const char kIncognitoBrandConsistencyForAndroidName[];
 extern const char kIncognitoBrandConsistencyForAndroidDescription[];
 
+extern const char kIncognitoReauthenticationForAndroidName[];
+extern const char kIncognitoReauthenticationForAndroidDescription[];
+
 extern const char kIncognitoBrandConsistencyForDesktopName[];
 extern const char kIncognitoBrandConsistencyForDesktopDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 4c29693..4136673 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -313,6 +313,7 @@
     &password_manager::features::kPasswordScriptsFetching,
     &password_manager::features::kRecoverFromNeverSaveAndroid,
     &performance_hints::features::kContextMenuPerformanceInfo,
+    &permissions::features::kRevertDSEAutomaticPermissions,
     &query_tiles::features::kQueryTilesGeoFilter,
     &query_tiles::features::kQueryTiles,
     &query_tiles::features::kQueryTilesInNTP,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index e8a5d50..a5b68439 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -468,6 +468,7 @@
     public static final String RELATED_SEARCHES_SIMPLIFIED_UX = "RelatedSearchesSimplifiedUx";
     public static final String RELATED_SEARCHES_UI = "RelatedSearchesUi";
     public static final String REQUEST_DESKTOP_SITE_FOR_TABLETS = "RequestDesktopSiteForTablets";
+    public static final String REVERT_DSE_AUTOMATIC_PERMISSIONS = "RevertDSEAutomaticPermissions";
     public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings";
     public static final String SEARCH_ENGINE_PROMO_EXISTING_DEVICE =
             "SearchEnginePromo.ExistingDevice";
diff --git a/chrome/browser/language/android/BUILD.gn b/chrome/browser/language/android/BUILD.gn
index b6c3df7..7bb5a92 100644
--- a/chrome/browser/language/android/BUILD.gn
+++ b/chrome/browser/language/android/BUILD.gn
@@ -15,8 +15,8 @@
     "//base:base_java",
     "//chrome/browser/preferences:java",
     "//components/language/android:language_bridge_java",
+    "//third_party/android_deps:com_google_android_play_core_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
-    "//third_party/google_android_play_core:com_google_android_play_core_java",
     "//ui/android:ui_no_recycler_view_java",
   ]
 }
diff --git a/chrome/browser/media/history/media_history_browsertest.cc b/chrome/browser/media/history/media_history_browsertest.cc
index 9386ad1..0028cf48f 100644
--- a/chrome/browser/media/history/media_history_browsertest.cc
+++ b/chrome/browser/media/history/media_history_browsertest.cc
@@ -1175,6 +1175,7 @@
       : prerender_helper_(base::BindRepeating(
             &MediaHistoryForPrerenderBrowserTest::web_contents,
             base::Unretained(this))) {
+    feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
   }
 
   void SetUp() override {
diff --git a/chrome/browser/net/net_error_tab_helper.cc b/chrome/browser/net/net_error_tab_helper.cc
index e2ec1e3..ecff52f0 100644
--- a/chrome/browser/net/net_error_tab_helper.cc
+++ b/chrome/browser/net/net_error_tab_helper.cc
@@ -53,6 +53,46 @@
 }
 
 // static
+void NetErrorTabHelper::BindNetErrorPageSupport(
+    mojo::PendingAssociatedReceiver<chrome::mojom::NetErrorPageSupport>
+        receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* tab_helper = NetErrorTabHelper::FromWebContents(web_contents);
+  if (!tab_helper)
+    return;
+  tab_helper->net_error_page_support_.Bind(rfh, std::move(receiver));
+}
+
+// static
+void NetErrorTabHelper::BindNetworkDiagnostics(
+    mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnostics> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* tab_helper = NetErrorTabHelper::FromWebContents(web_contents);
+  if (!tab_helper)
+    return;
+  tab_helper->network_diagnostics_receivers_.Bind(rfh, std::move(receiver));
+}
+
+// static
+void NetErrorTabHelper::BindNetworkEasterEgg(
+    mojo::PendingAssociatedReceiver<chrome::mojom::NetworkEasterEgg> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* tab_helper = NetErrorTabHelper::FromWebContents(web_contents);
+  if (!tab_helper)
+    return;
+  tab_helper->network_easter_egg_receivers_.Bind(rfh, std::move(receiver));
+}
+
+// static
 void NetErrorTabHelper::set_state_for_testing(TestingState state) {
   testing_state_ = state;
 }
@@ -122,17 +162,9 @@
 
 NetErrorTabHelper::NetErrorTabHelper(WebContents* contents)
     : WebContentsObserver(contents),
-      network_diagnostics_receivers_(
-          contents,
-          this,
-          content::WebContentsFrameReceiverSetPassKey()),
-      network_easter_egg_receivers_(
-          contents,
-          this,
-          content::WebContentsFrameReceiverSetPassKey()),
-      net_error_page_support_(contents,
-                              this,
-                              content::WebContentsFrameReceiverSetPassKey()),
+      network_diagnostics_receivers_(contents, this),
+      network_easter_egg_receivers_(contents, this),
+      net_error_page_support_(contents, this),
       is_error_page_(false),
       dns_error_active_(false),
       dns_error_page_committed_(false),
diff --git a/chrome/browser/net/net_error_tab_helper.h b/chrome/browser/net/net_error_tab_helper.h
index 64f0966..6e28ec1 100644
--- a/chrome/browser/net/net_error_tab_helper.h
+++ b/chrome/browser/net/net_error_tab_helper.h
@@ -19,8 +19,8 @@
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "components/prefs/pref_member.h"
 #include "content/public/browser/reload_type.h"
+#include "content/public/browser/render_frame_host_receiver_set.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_contents_receiver_set.h"
 #include "content/public/browser/web_contents_user_data.h"
 
 namespace user_prefs {
@@ -50,6 +50,18 @@
 
   ~NetErrorTabHelper() override;
 
+  static void BindNetErrorPageSupport(
+      mojo::PendingAssociatedReceiver<chrome::mojom::NetErrorPageSupport>
+          receiver,
+      content::RenderFrameHost* rfh);
+  static void BindNetworkDiagnostics(
+      mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnostics>
+          receiver,
+      content::RenderFrameHost* rfh);
+  static void BindNetworkEasterEgg(
+      mojo::PendingAssociatedReceiver<chrome::mojom::NetworkEasterEgg> receiver,
+      content::RenderFrameHost* rfh);
+
   static void set_state_for_testing(TestingState testing_state);
 
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* prefs);
@@ -92,7 +104,7 @@
     return dns_probe_status_;
   }
 
-  content::WebContentsFrameReceiverSet<chrome::mojom::NetworkDiagnostics>&
+  content::RenderFrameHostReceiverSet<chrome::mojom::NetworkDiagnostics>&
   network_diagnostics_receivers_for_testing() {
     return network_diagnostics_receivers_;
   }
@@ -122,11 +134,11 @@
   virtual void DownloadPageLaterHelper(const GURL& url);
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
 
-  content::WebContentsFrameReceiverSet<chrome::mojom::NetworkDiagnostics>
+  content::RenderFrameHostReceiverSet<chrome::mojom::NetworkDiagnostics>
       network_diagnostics_receivers_;
-  content::WebContentsFrameReceiverSet<chrome::mojom::NetworkEasterEgg>
+  content::RenderFrameHostReceiverSet<chrome::mojom::NetworkEasterEgg>
       network_easter_egg_receivers_;
-  content::WebContentsFrameReceiverSet<chrome::mojom::NetErrorPageSupport>
+  content::RenderFrameHostReceiverSet<chrome::mojom::NetErrorPageSupport>
       net_error_page_support_;
 
   // True if the last provisional load that started was for an error page.
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index 11b65ca..7b3e7d3 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -848,10 +848,16 @@
       page_load_metrics::UserActivationStatus::kReceivedActivation, 2);
 }
 
+// TODO(https://crbug.com/1234339): Test is flaky.
+#if defined(OS_LINUX)
+#define MAYBE_DocOverwritesNavigation DISABLED_DocOverwritesNavigation
+#else
+#define MAYBE_DocOverwritesNavigation DocOverwritesNavigation
+#endif
 // Test that a subframe that aborts (due to doc.write) doesn't cause a crash
 // if it continues to load resources.
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
-                       DocOverwritesNavigation) {
+                       MAYBE_DocOverwritesNavigation) {
   // Ensure that the previous page won't be stored in the back/forward cache, so
   // that the histogram will be recorded when the previous page is unloaded.
   // TODO(https://crbug.com/1229122): Investigate if this needs further fix.
diff --git a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
index 014a5bd..065c4b5 100644
--- a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/containers/contains.h"
+#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/page_load_metrics/integration_tests/metric_integration_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h"
@@ -21,7 +22,9 @@
   PrerenderPageLoadMetricsObserverBrowserTest()
       : prerender_helper_(base::BindRepeating(
             &PrerenderPageLoadMetricsObserverBrowserTest::web_contents,
-            base::Unretained(this))) {}
+            base::Unretained(this))) {
+    feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
+  }
   ~PrerenderPageLoadMetricsObserverBrowserTest() override = default;
 
   void SetUp() override {
@@ -49,6 +52,7 @@
 
  protected:
   content::test::PrerenderTestHelper prerender_helper_;
+  base::test::ScopedFeatureList feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
diff --git a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc
index b6e0f0ae..bbf92440 100644
--- a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc
+++ b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc
@@ -825,11 +825,13 @@
   confirm_payment_ = true;
 
   // EvalJs waits for JavaScript promise to resolve.
-  EXPECT_EQ("Authenticator returned NOT_ALLOWED_ERROR.",
-            content::EvalJs(
-                GetActiveWebContents(),
-                content::JsReplace("getTotalAmountFromClientData($1, $2);",
-                                   credentialIdentifier, "0.01")));
+  EXPECT_EQ(
+      "The operation either timed out or was not allowed. See: "
+      "https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.",
+      content::EvalJs(
+          GetActiveWebContents(),
+          content::JsReplace("getTotalAmountFromClientData($1, $2);",
+                             credentialIdentifier, "0.01")));
 
   int expected_enroll_histogram_value_ =
       (GetParam() == APIVersion::kApiV3) ? 0 : 1;
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index 3ab79bc..574088c3 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -128,17 +128,16 @@
 #include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
 #endif
 
-using content::AXInspectFactory;
-using content::WebContents;
-using extensions::ExtensionsAPIClient;
-using guest_view::GuestViewManager;
-using guest_view::TestGuestViewManager;
-using guest_view::TestGuestViewManagerFactory;
-using ui::AXTreeFormatter;
-
 namespace {
 
+using ::content::AXInspectFactory;
+using ::content::WebContents;
+using ::extensions::ExtensionsAPIClient;
+using ::guest_view::GuestViewManager;
+using ::guest_view::TestGuestViewManager;
+using ::guest_view::TestGuestViewManagerFactory;
 using ::pdf_extension_test_util::ConvertPageCoordToScreenCoord;
+using ::ui::AXTreeFormatter;
 
 const int kNumberLoadTestParts = 10;
 
@@ -173,7 +172,7 @@
   run_loop.Run();
 }
 
-void WaitForLoadStart(content::WebContents* web_contents) {
+void WaitForLoadStart(WebContents* web_contents) {
   while (!web_contents->IsLoading() &&
          !web_contents->GetController().GetLastCommittedEntry()) {
     base::RunLoop run_loop;
@@ -192,14 +191,6 @@
       << pattern << "\n\nActual:\n"                   \
       << actual
 
-bool GetGuestCallback(WebContents** guest_out, WebContents* guest) {
-  EXPECT_FALSE(*guest_out);
-  *guest_out = guest;
-  // Return false so that we iterate through all the guests and verify there is
-  // only one.
-  return false;
-}
-
 class PDFExtensionTestWithoutUnseasonedOverride
     : public extensions::ExtensionApiTest {
  public:
@@ -272,27 +263,25 @@
   // Same as LoadPdf(), but also returns a pointer to the guest WebContents for
   // the loaded PDF. Returns nullptr if the load fails.
   WebContents* LoadPdfGetGuestContents(const GURL& url) {
-    return LoadPdfGetGuestContentsHelper(url, /*new_tab=*/false);
+    if (!LoadPdf(url))
+      return nullptr;
+    return GetOnlyGuestContents(GetActiveWebContents());
   }
 
   // Same as LoadPdf(), but also returns a pointer to the guest WebContents for
   // the loaded PDF in a new tab. Returns nullptr if the load fails.
   WebContents* LoadPdfInNewTabGetGuestContents(const GURL& url) {
-    return LoadPdfGetGuestContentsHelper(url, /*new_tab=*/true);
+    if (!LoadPdfInNewTab(url))
+      return nullptr;
+    return GetOnlyGuestContents(GetActiveWebContents());
   }
 
-  void TestGetSelectedTextReply(GURL url, bool expect_success) {
-    ASSERT_TRUE(LoadPdf(url));
+  void TestGetSelectedTextReply(const GURL& url, bool expect_success) {
+    WebContents* guest_contents = LoadPdfGetGuestContents(url);
+    ASSERT_TRUE(guest_contents);
 
     // Reach into the guest and hook into it such that it posts back a 'flush'
     // message after every getSelectedTextReply message sent.
-    WebContents* web_contents = GetActiveWebContents();
-    content::BrowserPluginGuestManager* guest_manager =
-        web_contents->GetBrowserContext()->GetGuestManager();
-    WebContents* guest_contents = nullptr;
-    ASSERT_NO_FATAL_FAILURE(guest_manager->ForEachGuest(
-        web_contents, base::BindRepeating(&GetGuestCallback, &guest_contents)));
-    ASSERT_TRUE(guest_contents);
     ASSERT_TRUE(content::ExecuteScript(
         guest_contents, "viewer.overrideSendScriptingMessageForTest();"));
 
@@ -301,7 +290,7 @@
     // the message didn't come through.
     bool success = false;
     ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
-        web_contents,
+        GetActiveWebContents(),
         "window.addEventListener('message', function(event) {"
         "  if (event.data == 'flush')"
         "    window.domAutomationController.send(false);"
@@ -319,6 +308,23 @@
   }
 
  protected:
+  WebContents* GetOnlyGuestContents(WebContents* embedder_contents) const {
+    content::BrowserPluginGuestManager* guest_manager =
+        embedder_contents->GetBrowserContext()->GetGuestManager();
+
+    WebContents* guest_contents = nullptr;
+    guest_manager->ForEachGuest(
+        embedder_contents,
+        base::BindLambdaForTesting([&guest_contents](WebContents* guest) {
+          // Assume exactly one guest contents.
+          EXPECT_FALSE(guest_contents);
+          guest_contents = guest;
+          return false;
+        }));
+
+    return guest_contents;
+  }
+
   int CountPDFProcesses() {
     return IsUnseasoned() ? CountUnseasonedPDFProcesses()
                           : CountPepperPDFProcesses();
@@ -334,21 +340,6 @@
   virtual std::vector<base::Feature> GetDisabledFeatures() const { return {}; }
 
  private:
-  WebContents* LoadPdfGetGuestContentsHelper(const GURL& url, bool new_tab) {
-    if (new_tab) {
-      if (!LoadPdfInNewTab(url))
-        return nullptr;
-    } else if (!LoadPdf(url)) {
-      return nullptr;
-    }
-
-    WebContents* contents = GetActiveWebContents();
-    content::BrowserPluginGuestManager* guest_manager =
-        contents->GetBrowserContext()->GetGuestManager();
-    WebContents* guest_contents = guest_manager->GetFullPageGuest(contents);
-    return guest_contents;
-  }
-
   int CountPepperPDFProcesses() {
     int result = -1;
     base::RunLoop run_loop;
@@ -458,8 +449,8 @@
 IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithTestGuestViewManager,
                        PdfInMainFrameHasFocus) {
   // Load test HTML, and verify the text area has focus.
-  GURL main_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  ui_test_utils::NavigateToURL(browser(), main_url);
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL("/pdf/test.pdf"));
   auto* embedder_web_contents = GetActiveWebContents();
 
   // Verify the pdf has loaded.
@@ -483,7 +474,7 @@
 IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithTestGuestViewManager,
                        PdfExtensionLoadedInGuest) {
   // Load test HTML, and verify the text area has focus.
-  GURL main_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
+  const GURL main_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ui_test_utils::NavigateToURL(browser(), main_url);
   auto* embedder_web_contents = GetActiveWebContents();
 
@@ -524,7 +515,7 @@
 // Regression test for https://crbug.com/271452.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithTestGuestViewManager,
                        CSPDoesNotBlockEmbedStyles) {
-  GURL main_url(embedded_test_server()->GetURL("/pdf/test-csp.pdf"));
+  const GURL main_url(embedded_test_server()->GetURL("/pdf/test-csp.pdf"));
   ui_test_utils::NavigateToURL(browser(), main_url);
   auto* embedder_web_contents = GetActiveWebContents();
   ASSERT_TRUE(embedder_web_contents);
@@ -553,7 +544,8 @@
 // Regression test for https://crbug.com/1187122.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithTestGuestViewManager,
                        CSPWithSandboxDoesNotBlockPDF) {
-  GURL main_url(embedded_test_server()->GetURL("/pdf/test-csp-sandbox.pdf"));
+  const GURL main_url(
+      embedded_test_server()->GetURL("/pdf/test-csp-sandbox.pdf"));
   ui_test_utils::NavigateToURL(browser(), main_url);
   auto* embedder_web_contents = GetActiveWebContents();
   ASSERT_TRUE(embedder_web_contents);
@@ -583,9 +575,9 @@
       "*because an ancestor violates the following Content Security Policy "
       "directive: \"frame-ancestors 'none'*");
 
-  GURL main_url(embedded_test_server()->GetURL(
-      "/pdf/frame-test-csp-frame-ancestors-none.html"));
-  ui_test_utils::NavigateToURL(browser(), main_url);
+  ui_test_utils::NavigateToURL(
+      browser(), embedded_test_server()->GetURL(
+                     "/pdf/frame-test-csp-frame-ancestors-none.html"));
 
   console_observer.Wait();
 
@@ -598,7 +590,7 @@
 // Regression test for https://crbug.com/1107535.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTestWithTestGuestViewManager,
                        CSPFrameAncestorsOverridesXFrameOptions) {
-  GURL main_url(
+  const GURL main_url(
       embedded_test_server()->GetURL("/pdf/frame-test-csp-and-xfo.html"));
   ui_test_utils::NavigateToURL(browser(), main_url);
   auto* embedder_web_contents = GetActiveWebContents();
@@ -769,8 +761,8 @@
   void ValidateSingleSuccessfulDownloadAndNoPDFPluginLaunch() {
     // Validate that we downloaded a single PDF and didn't launch the PDF
     // plugin.
-    GURL pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-    EXPECT_EQ(pdf_url, AwaitAndGetLastDownloadedUrl());
+    EXPECT_EQ(embedded_test_server()->GetURL("/pdf/test.pdf"),
+              AwaitAndGetLastDownloadedUrl());
     EXPECT_EQ(1u, GetNumberOfDownloads());
     EXPECT_EQ(0, CountPDFProcesses());
   }
@@ -796,8 +788,8 @@
 
 IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest, DirectNavigationToPDF) {
   // Navigate to a PDF and test that it is downloaded.
-  GURL pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  ui_test_utils::NavigateToURL(browser(), pdf_url);
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL("/pdf/test.pdf"));
 
   ValidateSingleSuccessfulDownloadAndNoPDFPluginLaunch();
 }
@@ -811,9 +803,8 @@
 IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest,
                        MAYBE_EmbedPdfPlaceholderWithCSP) {
   // Navigate to a page with CSP that uses <embed> to embed a PDF as a plugin.
-  GURL embed_page_url =
-      embedded_test_server()->GetURL("/pdf/pdf_embed_csp.html");
-  ui_test_utils::NavigateToURL(browser(), embed_page_url);
+  ui_test_utils::NavigateToURL(
+      browser(), embedded_test_server()->GetURL("/pdf/pdf_embed_csp.html"));
   PluginTestUtils::WaitForPlaceholderReady(GetActiveWebContents(), "pdf_embed");
 
   // Fake a click on the <embed>, then press Enter to trigger the download.
@@ -830,9 +821,8 @@
 
 IN_PROC_BROWSER_TEST_P(PDFPluginDisabledTest, IframePdfPlaceholderWithCSP) {
   // Navigate to a page that uses <iframe> to embed a PDF as a plugin.
-  GURL iframe_page_url =
-      embedded_test_server()->GetURL("/pdf/pdf_iframe_csp.html");
-  ui_test_utils::NavigateToURL(browser(), iframe_page_url);
+  ui_test_utils::NavigateToURL(
+      browser(), embedded_test_server()->GetURL("/pdf/pdf_iframe_csp.html"));
 
   ClickOpenButtonInIframe();
   ValidateSingleSuccessfulDownloadAndNoPDFPluginLaunch();
@@ -1039,7 +1029,7 @@
                                                                kSimulatedPdf);
   auto handle = test_server.StartAndReturnHandle();
 
-  content::WebContents* contents = GetActiveWebContents();
+  WebContents* contents = GetActiveWebContents();
   content::TestNavigationObserver navigation_observer(contents);
   contents->GetController().LoadURLWithParams(
       content::NavigationController::LoadURLParams(
@@ -1245,9 +1235,8 @@
     ui_test_utils::NavigateToURL(
         browser(), embedded_test_server()->GetURL(
                        "/service_worker/create_service_worker.html"));
-    EXPECT_EQ("DONE",
-              EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
-                     "register('" + worker_path + "', '/pdf');"));
+    EXPECT_EQ("DONE", EvalJs(GetActiveWebContents(),
+                             "register('" + worker_path + "', '/pdf');"));
 
     // Navigate to a PDF in the service worker's scope. It should load.
     RunTestsInJsModule("basic_test.js", "test.pdf");
@@ -1380,8 +1369,8 @@
 
 // This test ensures that link permissions are enforced properly in PDFs.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, LinkPermissions) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   // chrome://favicon links should be allowed for PDFs, while chrome://settings
@@ -1403,8 +1392,8 @@
 
 // This test ensures that titles are set properly for PDFs without /Title.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TabTitleWithNoTitle) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
   EXPECT_EQ(u"test.pdf", guest_contents->GetTitle());
   EXPECT_EQ(u"test.pdf", GetActiveWebContents()->GetTitle());
@@ -1412,8 +1401,8 @@
 
 // This test ensures that titles are set properly for PDFs with /Title.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TabTitleWithTitle) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-title.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-title.pdf"));
   ASSERT_TRUE(guest_contents);
   EXPECT_EQ(u"PDF title test", guest_contents->GetTitle());
   EXPECT_EQ(u"PDF title test", GetActiveWebContents()->GetTitle());
@@ -1434,8 +1423,8 @@
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PdfZoomWithoutBubble) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
   WebContents* web_contents = GetActiveWebContents();
 
@@ -1558,8 +1547,8 @@
                        PdfAccessibility) {
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
 
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   ASSERT_TRUE(guest_contents);
 
   WaitForAccessibilityTreeToContainNodeWithName(guest_contents,
@@ -1573,8 +1562,8 @@
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        PdfAccessibilityEnableLater) {
   // In this test, load the PDF file first, with accessibility off.
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   ASSERT_TRUE(guest_contents);
 
   // Now enable accessibility globally, and assert that the PDF accessibility
@@ -1587,12 +1576,6 @@
   ASSERT_MULTILINE_STR_MATCHES(kExpectedPDFAXTreePattern, ax_tree_dump);
 }
 
-bool RetrieveGuestContents(WebContents** out_guest_contents,
-                           WebContents* in_guest_contents) {
-  *out_guest_contents = in_guest_contents;
-  return true;
-}
-
 // Flaky, see crbug.com/1228762
 #if defined(OS_CHROMEOS)
 #define MAYBE_PdfAccessibilityInIframe DISABLED_PdfAccessibilityInIframe
@@ -1603,17 +1586,14 @@
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        MAYBE_PdfAccessibilityInIframe) {
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-  GURL test_iframe_url(embedded_test_server()->GetURL("/pdf/test-iframe.html"));
-  ui_test_utils::NavigateToURL(browser(), test_iframe_url);
+  ui_test_utils::NavigateToURL(
+      browser(), embedded_test_server()->GetURL("/pdf/test-iframe.html"));
+
   WebContents* contents = GetActiveWebContents();
   WaitForAccessibilityTreeToContainNodeWithName(contents,
                                                 "1 First Section\r\n");
 
-  WebContents* guest_contents = nullptr;
-  content::BrowserPluginGuestManager* guest_manager =
-        contents->GetBrowserContext()->GetGuestManager();
-  guest_manager->ForEachGuest(
-      contents, base::BindRepeating(&RetrieveGuestContents, &guest_contents));
+  WebContents* guest_contents = GetOnlyGuestContents(contents);
   ASSERT_TRUE(guest_contents);
 
   ui::AXTreeUpdate ax_tree = GetAccessibilityTreeSnapshot(guest_contents);
@@ -1624,18 +1604,15 @@
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        PdfAccessibilityInOOPIF) {
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-  GURL test_iframe_url(embedded_test_server()->GetURL(
-      "/pdf/test-cross-site-iframe.html"));
-  ui_test_utils::NavigateToURL(browser(), test_iframe_url);
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL("/pdf/test-cross-site-iframe.html"));
+
   WebContents* contents = GetActiveWebContents();
   WaitForAccessibilityTreeToContainNodeWithName(contents,
                                                 "1 First Section\r\n");
 
-  WebContents* guest_contents = nullptr;
-  content::BrowserPluginGuestManager* guest_manager =
-        contents->GetBrowserContext()->GetGuestManager();
-  guest_manager->ForEachGuest(
-      contents, base::BindRepeating(&RetrieveGuestContents, &guest_contents));
+  WebContents* guest_contents = GetOnlyGuestContents(contents);
   ASSERT_TRUE(guest_contents);
 
   ui::AXTreeUpdate ax_tree = GetAccessibilityTreeSnapshot(guest_contents);
@@ -1646,9 +1623,8 @@
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        PdfAccessibilityWordBoundaries) {
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   ASSERT_TRUE(guest_contents);
 
   WaitForAccessibilityTreeToContainNodeWithName(guest_contents,
@@ -1679,13 +1655,12 @@
 
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        PdfAccessibilitySelection) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   ASSERT_TRUE(guest_contents);
 
-  WebContents* web_contents = GetActiveWebContents();
   CHECK(content::ExecuteScript(
-      web_contents,
+      GetActiveWebContents(),
       "document.getElementsByTagName('embed')[0].postMessage("
       "{type: 'selectAll'});"));
 
@@ -1739,8 +1714,8 @@
       "2 Second Section\n"
       "3";
 
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
   ASSERT_TRUE(guest_contents);
 
   CHECK(content::ExecuteScript(
@@ -1792,10 +1767,8 @@
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        PdfAccessibilityTextRunCrash) {
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-  GURL test_pdf_url(
+  WebContents* guest_contents = LoadPdfGetGuestContents(
       embedded_test_server()->GetURL("/pdf_private/accessibility_crash_2.pdf"));
-
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
   ASSERT_TRUE(guest_contents);
 
   WaitForAccessibilityTreeToContainNodeWithName(guest_contents, "Page 1");
@@ -1805,8 +1778,8 @@
 // Test that even if a different tab is selected when a navigation occurs,
 // the correct tab still gets navigated (see crbug.com/672563).
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, NavigationOnCorrectTab) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
   WebContents* web_contents = GetActiveWebContents();
 
@@ -1833,10 +1806,10 @@
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, MultipleDomains) {
-  for (const std::string& domain : {"a.com", "b.com"}) {
-    const GURL url = embedded_test_server()->GetURL(domain, "/pdf/test.pdf");
-    ASSERT_TRUE(LoadPdfInNewTab(url));
-  }
+  ASSERT_TRUE(LoadPdfInNewTab(
+      embedded_test_server()->GetURL("a.com", "/pdf/test.pdf")));
+  ASSERT_TRUE(LoadPdfInNewTab(
+      embedded_test_server()->GetURL("b.com", "/pdf/test.pdf")));
   EXPECT_EQ(2, CountPDFProcesses());
 }
 
@@ -1846,9 +1819,9 @@
   ~PDFExtensionLinkClickTest() override {}
 
  protected:
-  content::WebContents* LoadTestLinkPdfGetGuestContents() {
-    GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-link.pdf"));
-    guest_contents_ = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* LoadTestLinkPdfGetGuestContents() {
+    guest_contents_ = LoadPdfGetGuestContents(
+        embedded_test_server()->GetURL("/pdf/test-link.pdf"));
     EXPECT_TRUE(guest_contents_);
     return guest_contents_;
   }
@@ -1871,9 +1844,7 @@
     guest_contents_ = guest_contents;
   }
 
-  content::WebContents* GetWebContentsForInputRouting() {
-    return guest_contents_;
-  }
+  WebContents* GetWebContentsForInputRouting() { return guest_contents_; }
 
  private:
   WebContents* guest_contents_;
@@ -1999,9 +1970,9 @@
 // and updates the history state.
 IN_PROC_BROWSER_TEST_P(PDFExtensionLinkClickTest, OpenPDFWithReplaceState) {
   // Navigate to the main page.
-  GURL test_url(
+  ui_test_utils::NavigateToURL(
+      browser(),
       embedded_test_server()->GetURL("/pdf/pdf_href_replace_state.html"));
-  ui_test_utils::NavigateToURL(browser(), test_url);
   WebContents* web_contents = GetActiveWebContents();
   ASSERT_TRUE(web_contents);
 
@@ -2047,7 +2018,7 @@
 // Fails the test if a navigation is started in the given WebContents.
 class FailOnNavigation : public content::WebContentsObserver {
  public:
-  explicit FailOnNavigation(content::WebContents* contents)
+  explicit FailOnNavigation(WebContents* contents)
       : content::WebContentsObserver(contents) {}
 
   // content::WebContentsObserver:
@@ -2093,9 +2064,8 @@
 
  protected:
   void LoadTestLinkPdfGetGuestContents() {
-    GURL test_pdf_url(
+    guest_contents_ = LoadPdfGetGuestContents(
         embedded_test_server()->GetURL("/pdf/test-internal-link.pdf"));
-    guest_contents_ = LoadPdfGetGuestContents(test_pdf_url);
     ASSERT_TRUE(guest_contents_);
   }
 
@@ -2104,9 +2074,7 @@
     return ConvertPageCoordToScreenCoord(guest_contents_, {100, 100});
   }
 
-  content::WebContents* GetWebContentsForInputRouting() {
-    return guest_contents_;
-  }
+  WebContents* GetWebContentsForInputRouting() { return guest_contents_; }
 
  private:
   WebContents* guest_contents_;
@@ -2212,8 +2180,8 @@
   }
 
   void LoadTestComboBoxPdfGetGuestContents() {
-    GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/combobox_form.pdf"));
-    guest_contents_ = LoadPdfGetGuestContents(test_pdf_url);
+    guest_contents_ = LoadPdfGetGuestContents(
+        embedded_test_server()->GetURL("/pdf/combobox_form.pdf"));
     ASSERT_TRUE(guest_contents_);
   }
 
@@ -2308,9 +2276,7 @@
                               ui::ClipboardBuffer::kCopyPaste, expected);
   }
 
-  content::WebContents* GetWebContentsForInputRouting() {
-    return guest_contents_;
-  }
+  WebContents* GetWebContentsForInputRouting() { return guest_contents_; }
 
  private:
   // Runs `action` and checks `clipboard_buffer` contains `expected`.
@@ -2475,9 +2441,9 @@
 // https://crbug.com/763812).
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, PostMessageForZeroSizedEmbed) {
   content::DOMMessageQueue queue;
-  GURL url(embedded_test_server()->GetURL(
-      "/pdf/post_message_zero_sized_embed.html"));
-  ui_test_utils::NavigateToURL(browser(), url);
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL(
+                                   "/pdf/post_message_zero_sized_embed.html"));
   std::string message;
   EXPECT_TRUE(queue.WaitForMessage(&message));
   EXPECT_EQ("\"POST_MESSAGE_OK\"", message);
@@ -2529,8 +2495,8 @@
 
 // Ensure that touchpad pinch events are handled by the PDF viewer.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, TouchpadPinchInvokesCustomZoom) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   base::OnceClosure send_pinch = base::BindOnce(
@@ -2551,8 +2517,8 @@
 #if !defined(OS_MAC)
 // Ensure that ctrl-wheel events are handled by the PDF viewer.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, CtrlWheelInvokesCustomZoom) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   base::OnceClosure send_ctrl_wheel = base::BindOnce(
@@ -2580,8 +2546,8 @@
 #endif
 IN_PROC_BROWSER_TEST_F(PDFExtensionTestWithoutUnseasonedOverride,
                        MAYBE_TouchscreenPinchInvokesCustomZoom) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   base::OnceClosure send_touchscreen_pinch = base::BindOnce(
@@ -2606,18 +2572,10 @@
 
 // Flaky in nearly all configurations; see https://crbug.com/856169.
 IN_PROC_BROWSER_TEST_F(PDFExtensionHitTestTest, DISABLED_MouseLeave) {
-  GURL url = embedded_test_server()->GetURL("/pdf/pdf_embed.html");
-
   // Load page with embedded PDF and make sure it succeeds.
-  ASSERT_TRUE(LoadPdf(url));
-  WebContents* guest_contents = nullptr;
-  WebContents* embedder_contents = GetActiveWebContents();
-  content::BrowserPluginGuestManager* guest_manager =
-      embedder_contents->GetBrowserContext()->GetGuestManager();
-  ASSERT_NO_FATAL_FAILURE(guest_manager->ForEachGuest(
-      embedder_contents,
-      base::BindRepeating(&GetGuestCallback, &guest_contents)));
-  ASSERT_NE(nullptr, guest_contents);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/pdf_embed.html"));
+  ASSERT_TRUE(guest_contents);
 
   gfx::Point point_in_parent(250, 25);
   gfx::Point point_in_pdf(250, 250);
@@ -2635,6 +2593,7 @@
       "});"));
 
   // Inject some MouseMoves to invoke a MouseLeave in the PDF.
+  WebContents* embedder_contents = GetActiveWebContents();
   content::SimulateMouseEvent(embedder_contents,
                               blink::WebInputEvent::Type::kMouseMove,
                               point_in_parent);
@@ -2659,18 +2618,10 @@
 }
 
 IN_PROC_BROWSER_TEST_F(PDFExtensionHitTestTest, ContextMenuCoordinates) {
-  GURL url = embedded_test_server()->GetURL("/pdf/pdf_embed.html");
-
   // Load page with embedded PDF and make sure it succeeds.
-  ASSERT_TRUE(LoadPdf(url));
-  WebContents* guest_contents = nullptr;
-  WebContents* embedder_contents = GetActiveWebContents();
-  content::BrowserPluginGuestManager* guest_manager =
-      embedder_contents->GetBrowserContext()->GetGuestManager();
-  ASSERT_NO_FATAL_FAILURE(guest_manager->ForEachGuest(
-      embedder_contents,
-      base::BindRepeating(&GetGuestCallback, &guest_contents)));
-  ASSERT_NE(nullptr, guest_contents);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/pdf_embed.html"));
+  ASSERT_TRUE(guest_contents);
 
   // Get coords for mouse event.
   content::RenderWidgetHostView* guest_view =
@@ -2685,7 +2636,7 @@
 
   ContextMenuWaiter menu_observer;
   // Send mouse right-click to activate context menu.
-  content::SimulateMouseClickAt(embedder_contents, kDefaultKeyModifier,
+  content::SimulateMouseClickAt(GetActiveWebContents(), kDefaultKeyModifier,
                                 blink::WebMouseEvent::Button::kRight,
                                 root_context_menu_position);
 
@@ -2733,17 +2684,8 @@
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DefaultFocusForEmbeddedPDF) {
-  GURL url = embedded_test_server()->GetURL("/pdf/pdf_embed.html");
-
-  // Load page with embedded PDF and make sure it succeeds.
-  ASSERT_TRUE(LoadPdf(url));
-  WebContents* guest_contents = nullptr;
-  WebContents* embedder_contents = GetActiveWebContents();
-  content::BrowserPluginGuestManager* guest_manager =
-      embedder_contents->GetBrowserContext()->GetGuestManager();
-  ASSERT_NO_FATAL_FAILURE(guest_manager->ForEachGuest(
-      embedder_contents,
-      base::BindRepeating(&GetGuestCallback, &guest_contents)));
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/pdf_embed.html"));
   ASSERT_TRUE(guest_contents);
 
   // Verify that current focus state is body element.
@@ -2759,8 +2701,8 @@
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DefaultFocusForNonEmbeddedPDF) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   // Verify that current focus state is document element.
@@ -2840,10 +2782,11 @@
   // Afterwards, the main page should be still loading because of the hung
   // subframe (but the subframe for the OOPIF-based PDF MimeHandlerView might or
   // might not be created at this point).
-  GURL url = embedded_test_server()->GetURL(
-      "/pdf/pdf_embed_with_hung_sibling_subframe.html");
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, WindowOpenDisposition::CURRENT_TAB,
+      browser(),
+      embedded_test_server()->GetURL(
+          "/pdf/pdf_embed_with_hung_sibling_subframe.html"),
+      WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NONE);  // Don't wait for completion.
 
   // Wait for the request for the MimeHandlerView extension.  Afterwards, the
@@ -2855,8 +2798,7 @@
   // Remove the hung subframe.  Afterwards the main page should stop loading as
   // soon as the MimeHandlerView frame stops loading (assumming we have not bugs
   // similar to https://crbug.com/964364).
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
+  WebContents* web_contents = GetActiveWebContents();
   ASSERT_TRUE(content::ExecJs(
       web_contents, "document.getElementById('hung_subframe').remove();"));
 
@@ -2870,13 +2812,12 @@
 // https://crbug.com/1041880.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DocumentWriteIntoNewPopup) {
   // Navigate to an empty/boring test page.
-  GURL main_url(embedded_test_server()->GetURL("/title1.html"));
-  ui_test_utils::NavigateToURL(browser(), main_url);
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL("/title1.html"));
 
   // Open a new popup and call document.write to add an embedded PDF.
-  content::WebContents* popup = nullptr;
+  WebContents* popup = nullptr;
   {
-    GURL pdf_url = embedded_test_server()->GetURL("/pdf/test.pdf");
     const char kScriptTemplate[] = R"(
         const url = $1;
         const html = '<embed type="application/pdf" src="' + url + '">';
@@ -2885,10 +2826,10 @@
         popup.document.write(html);
     )";
     content::WebContentsAddedObserver popup_observer;
-    content::WebContents* web_contents =
-        browser()->tab_strip_model()->GetActiveWebContents();
-    ASSERT_TRUE(content::ExecJs(web_contents,
-                                content::JsReplace(kScriptTemplate, pdf_url)));
+    ASSERT_TRUE(content::ExecJs(
+        GetActiveWebContents(),
+        content::JsReplace(kScriptTemplate,
+                           embedded_test_server()->GetURL("/pdf/test.pdf"))));
     popup = popup_observer.GetWebContents();
   }
 
@@ -2908,16 +2849,15 @@
 
   // Load the PDF. The call to LoadPdf() will return false if the pdf extension
   // fails to load.
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  ASSERT_TRUE(LoadPdf(test_pdf_url));
+  ASSERT_TRUE(LoadPdf(embedded_test_server()->GetURL("/pdf/test.pdf")));
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, Metrics) {
   base::HistogramTester histograms;
   base::UserActionTester actions;
 
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/combobox_form.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/combobox_form.pdf"));
   ASSERT_TRUE(guest_contents);
 
   metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
@@ -2940,8 +2880,8 @@
 
 // Flaky. See https://crbug.com/1101514.
 IN_PROC_BROWSER_TEST_P(PDFExtensionTest, DISABLED_TabInAndOutOfPDFPlugin) {
-  GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test.pdf"));
-  content::WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+  WebContents* guest_contents =
+      LoadPdfGetGuestContents(embedded_test_server()->GetURL("/pdf/test.pdf"));
   ASSERT_TRUE(guest_contents);
 
   // Set focus on last toolbar element (zoom-out-button).
@@ -3030,10 +2970,10 @@
 
     // Enable accessibility and load the test file.
     content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-    GURL test_pdf_url(embedded_test_server()->GetURL(
-        "/" + std::string(file_dir) + "/" +
-        test_file_path.BaseName().MaybeAsASCII()));
-    WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+    WebContents* guest_contents =
+        LoadPdfGetGuestContents(embedded_test_server()->GetURL(
+            "/" + std::string(file_dir) + "/" +
+            test_file_path.BaseName().MaybeAsASCII()));
     ASSERT_TRUE(guest_contents);
     WaitForAccessibilityTreeToContainNodeWithName(guest_contents, "Page 1");
 
@@ -3293,10 +3233,10 @@
 
     // Enable accessibility and load the test file.
     content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-    GURL test_pdf_url(embedded_test_server()->GetURL(
-        "/" + std::string(file_dir) + "/" +
-        test_file_path.BaseName().MaybeAsASCII()));
-    WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
+    WebContents* guest_contents =
+        LoadPdfGetGuestContents(embedded_test_server()->GetURL(
+            "/" + std::string(file_dir) + "/" +
+            test_file_path.BaseName().MaybeAsASCII()));
     ASSERT_TRUE(guest_contents);
     WaitForAccessibilityTreeToContainNodeWithName(guest_contents, "Page 1");
 
@@ -3442,8 +3382,8 @@
                        LinkNavigation) {
   // Enable accessibility and load the test file.
   content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
-  GURL url(embedded_test_server()->GetURL("/pdf/accessibility/weblinks.pdf"));
-  WebContents* guest_contents = LoadPdfGetGuestContents(url);
+  WebContents* guest_contents = LoadPdfGetGuestContents(
+      embedded_test_server()->GetURL("/pdf/accessibility/weblinks.pdf"));
   ASSERT_TRUE(guest_contents);
   WaitForAccessibilityTreeToContainNodeWithName(guest_contents, "Page 1");
 
@@ -3505,8 +3445,7 @@
       embedded_test_server()->GetURL("a.test", "/empty.html");
   const GURL pdf_url =
       embedded_test_server()->GetURL("a.test", "/pdf/test.pdf");
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
+  WebContents* web_contents = GetActiveWebContents();
   ui_test_utils::NavigateToURL(browser(), initial_url);
 
   const int host_id = prerender_helper().AddPrerender(pdf_url);
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc
index 2e91262f..3266924 100644
--- a/chrome/browser/printing/print_browsertest.cc
+++ b/chrome/browser/printing/print_browsertest.cc
@@ -1055,11 +1055,12 @@
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(web_contents);
-  content::RemoveWebContentsReceiverSet(web_contents,
-                                        mojom::PrintManagerHost::Name_);
   TestPrintViewManager print_view_manager(web_contents);
+  PrintViewManager::SetReceiverImplForTesting(&print_view_manager);
 
   PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false);
+
+  PrintViewManager::SetReceiverImplForTesting(nullptr);
 }
 
 // Site per process version of PrintBrowserTest.PrintNup.
@@ -1071,11 +1072,12 @@
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(web_contents);
-  content::RemoveWebContentsReceiverSet(web_contents,
-                                        mojom::PrintManagerHost::Name_);
   TestPrintViewManager print_view_manager(web_contents);
+  PrintViewManager::SetReceiverImplForTesting(&print_view_manager);
 
   PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false);
+
+  PrintViewManager::SetReceiverImplForTesting(nullptr);
 }
 
 IN_PROC_BROWSER_TEST_F(PrintBrowserTest, MultipagePrint) {
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 49a80683..ce54bfd 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -40,6 +40,8 @@
 
 namespace {
 
+PrintManager* g_receiver_for_testing = nullptr;
+
 // Keeps track of pending scripted print preview closures.
 // No locking, only access on the UI thread.
 base::LazyInstance<std::map<content::RenderProcessHost*, base::OnceClosure>>::
@@ -84,6 +86,24 @@
   DCHECK_EQ(NOT_PREVIEWING, print_preview_state_);
 }
 
+// static
+void PrintViewManager::BindPrintManagerHost(
+    mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+    content::RenderFrameHost* rfh) {
+  if (g_receiver_for_testing) {
+    g_receiver_for_testing->BindReceiver(std::move(receiver), rfh);
+    return;
+  }
+
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* print_manager = PrintViewManager::FromWebContents(web_contents);
+  if (!print_manager)
+    return;
+  print_manager->BindReceiver(std::move(receiver), rfh);
+}
+
 bool PrintViewManager::PrintForSystemDialogNow(
     base::OnceClosure dialog_shown_callback) {
   DCHECK(dialog_shown_callback);
@@ -240,6 +260,11 @@
   PrintViewManagerBase::RenderFrameDeleted(render_frame_host);
 }
 
+// static
+void PrintViewManager::SetReceiverImplForTesting(PrintManager* impl) {
+  g_receiver_for_testing = impl;
+}
+
 bool PrintViewManager::PrintPreview(
     content::RenderFrameHost* rfh,
     mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h
index 8963598..5df286fd 100644
--- a/chrome/browser/printing/print_view_manager.h
+++ b/chrome/browser/printing/print_view_manager.h
@@ -25,6 +25,10 @@
  public:
   ~PrintViewManager() override;
 
+  static void BindPrintManagerHost(
+      mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+      content::RenderFrameHost* rfh);
+
   // Same as PrintNow(), but for the case where a user prints with the system
   // dialog from print preview.
   // |dialog_shown_callback| is called when the print dialog is shown.
@@ -74,6 +78,9 @@
 
   content::RenderFrameHost* print_preview_rfh() { return print_preview_rfh_; }
 
+  // Sets the target object for BindPrintManagerHost() for tests.
+  static void SetReceiverImplForTesting(PrintManager* impl);
+
  protected:
   explicit PrintViewManager(content::WebContents* web_contents);
 
diff --git a/chrome/browser/printing/print_view_manager_basic.cc b/chrome/browser/printing/print_view_manager_basic.cc
index 17ea5d1..907fe1df 100644
--- a/chrome/browser/printing/print_view_manager_basic.cc
+++ b/chrome/browser/printing/print_view_manager_basic.cc
@@ -30,6 +30,19 @@
 #endif
 }
 
+// static
+void PrintViewManagerBasic::BindPrintManagerHost(
+    mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* print_manager = PrintViewManagerBasic::FromWebContents(web_contents);
+  if (!print_manager)
+    return;
+  print_manager->BindReceiver(std::move(receiver), rfh);
+}
+
 #if defined(OS_ANDROID)
 void PrintViewManagerBasic::PdfWritingDone(int page_count) {
   pdf_writing_done_callback().Run(page_count);
diff --git a/chrome/browser/printing/print_view_manager_basic.h b/chrome/browser/printing/print_view_manager_basic.h
index 8bffa6f..98eb975 100644
--- a/chrome/browser/printing/print_view_manager_basic.h
+++ b/chrome/browser/printing/print_view_manager_basic.h
@@ -19,6 +19,10 @@
  public:
   ~PrintViewManagerBasic() override;
 
+  static void BindPrintManagerHost(
+      mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+      content::RenderFrameHost* rfh);
+
 #if defined(OS_ANDROID)
   // printing::PrintManager:
   void PdfWritingDone(int page_count) override;
diff --git a/chrome/browser/printing/print_view_manager_unittest.cc b/chrome/browser/printing/print_view_manager_unittest.cc
index 91c1344..9ee884c 100644
--- a/chrome/browser/printing/print_view_manager_unittest.cc
+++ b/chrome/browser/printing/print_view_manager_unittest.cc
@@ -164,11 +164,9 @@
       browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(web_contents);
 
-  content::RemoveWebContentsReceiverSet(web_contents,
-                                        mojom::PrintManagerHost::Name_);
-
   std::unique_ptr<TestPrintViewManager> print_view_manager =
       std::make_unique<TestPrintViewManager>(web_contents);
+  PrintViewManager::SetReceiverImplForTesting(print_view_manager.get());
 
   print_view_manager->PrintPreviewNow(web_contents->GetMainFrame(), false);
 
@@ -188,6 +186,8 @@
   EXPECT_EQ(gfx::Rect(0, 0, 5100, 6600), print_view_manager->content_area());
   EXPECT_EQ(mojom::PrinterLanguageType::kPostscriptLevel2,
             print_view_manager->type());
+
+  PrintViewManager::SetReceiverImplForTesting(nullptr);
 }
 #endif
 
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.css b/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.css
index 86adfe2..85874289 100644
--- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.css
+++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.css
@@ -18,13 +18,15 @@
 }
 
 h1 {
-  background: rgb(218, 54, 232);
-  color: white;
+  color: rgb(32, 33, 36);
   display: block;
-  font-size: 16px;
+  font-family: Roboto;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: 500;
   height: 56px;
   line-height: 56px;
-  text-align: center;
+  text-align: start;
   width: 100%;
 }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.html b/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.html
index 0f04a8a..1091e2b 100644
--- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.html
+++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/options.html
@@ -10,10 +10,8 @@
     <link rel="stylesheet" type="text/css" href="options.css">
   </head>
   <body>
-    <h1 class="i18n" msgid="name"></h1>
-
     <div class="container">
-
+      <h1 class="i18n" msgid="name"></h1>
       <h2 class="i18n" msgid="options_speech"></h2>
       <div class="option-group" id="noNaturalVoicesOptions">
         <div class="option">
@@ -59,9 +57,8 @@
           <div class="subtitle">
             <span class="i18n" msgid="options_natural_voices_explanation">
             </span>
-            <!-- TODO(https://crbug.com/1227547): Change to correct link -->
             <a target="_blank" rel="noreferrer"
-               href="https://support.google.com/chromebook/?p=accessibility">
+               href="https://support.google.com/chromebook?p=select_to_speak">
               <span class="i18n"
                     msgid="options_natural_voices_explanation_more">
               </span>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
index 2ca8951..3e5d13f 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
@@ -689,7 +689,7 @@
 <translation id="5748623122140342504">Cabeceira anterior de nivel 5</translation>
 <translation id="5760594853119905566">Apéndice</translation>
 <translation id="5761219715606611783">Ben feito! Xa aprendiches os conceptos básicos dos toques de ChromeVox. Para reiniciar o titorial ou saír del, usa os botóns que se mostran a continuación.</translation>
-<translation id="5776001898637896684">Extensión de síntese de voz de rede mellorada de Google</translation>
+<translation id="5776001898637896684">Extensión de conversión de rede mellorada de texto a voz</translation>
 <translation id="5805940204952508776">Toca con dous dedos</translation>
 <translation id="5819072574982403430">Elemento da árbore</translation>
 <translation id="5822819874379903994">Turquesa escuro</translation>
@@ -1036,7 +1036,7 @@
 <translation id="831207808878314375">Definición</translation>
 <translation id="8313653172105209786">dir</translation>
 <translation id="8316881042119029234">Encaixe antigo</translation>
-<translation id="8324974933005349667">Personalizar opcións de configuración de Síntese de voz</translation>
+<translation id="8324974933005349667">Personalizar opcións de configuración da conversión de texto a voz</translation>
 <translation id="8326783648485765113">Verde herba</translation>
 <translation id="8345569862449483843">{COUNT,plural, =1{libra}other{# signos da libra}}</translation>
 <translation id="8378855320830505539">Rexión</translation>
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 81b60fa..733c1afa 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -105,8 +105,8 @@
   in_files = [
     "a11y_page/captions_browser_proxy.js",
     "about_page/about_page_browser_proxy.js",
-    "appearance_page/appearance_browser_proxy.js",
-    "appearance_page/fonts_browser_proxy.js",
+    "appearance_page/appearance_browser_proxy.ts",
+    "appearance_page/fonts_browser_proxy.ts",
     "autofill_page/merge_exceptions_store_copies_behavior.js",
     "autofill_page/merge_passwords_store_copies_behavior.js",
     "autofill_page/multi_store_exception_entry.js",
@@ -194,9 +194,9 @@
     "a11y_page/captions_subpage.js",
     "a11y_page/live_caption_section.js",
     "about_page/about_page.js",
-    "appearance_page/appearance_fonts_page.js",
-    "appearance_page/appearance_page.js",
-    "appearance_page/home_url_input.js",
+    "appearance_page/appearance_fonts_page.ts",
+    "appearance_page/appearance_page.ts",
+    "appearance_page/home_url_input.ts",
     "autofill_page/autofill_page.js",
     "autofill_page/avatar_icon.js",
     "autofill_page/payments_list.js",
@@ -376,7 +376,6 @@
     ":closure_compile_local",
     "a11y_page:closure_compile",
     "about_page:closure_compile",
-    "appearance_page:closure_compile",
     "autofill_page:closure_compile",
     "basic_page:closure_compile",
     "clear_browsing_data_dialog:closure_compile",
@@ -658,11 +657,11 @@
     "a11y_page/live_caption_section.js",
     "about_page/about_page_browser_proxy.js",
     "about_page/about_page.js",
-    "appearance_page/appearance_browser_proxy.js",
-    "appearance_page/appearance_fonts_page.js",
-    "appearance_page/appearance_page.js",
-    "appearance_page/fonts_browser_proxy.js",
-    "appearance_page/home_url_input.js",
+    "appearance_page/appearance_browser_proxy.ts",
+    "appearance_page/appearance_fonts_page.ts",
+    "appearance_page/appearance_page.ts",
+    "appearance_page/fonts_browser_proxy.ts",
+    "appearance_page/home_url_input.ts",
     "autofill_page/address_edit_dialog.js",
     "autofill_page/address_remove_confirmation_dialog.js",
     "autofill_page/autofill_page.js",
@@ -897,6 +896,7 @@
 
   definitions = [
     "//tools/typescript/definitions/chrome_send.d.ts",
+    "//tools/typescript/definitions/management.d.ts",
     "//tools/typescript/definitions/settings_private.d.ts",
   ]
 
diff --git a/chrome/browser/resources/settings/a11y_page/BUILD.gn b/chrome/browser/resources/settings/a11y_page/BUILD.gn
index b7afc89d..30cdb73 100644
--- a/chrome/browser/resources/settings/a11y_page/BUILD.gn
+++ b/chrome/browser/resources/settings/a11y_page/BUILD.gn
@@ -34,7 +34,6 @@
 
 js_library("captions_subpage") {
   deps = [
-    "../appearance_page:fonts_browser_proxy",
     "../controls:settings_dropdown_menu",
     "../prefs:prefs_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chrome/browser/resources/settings/a11y_page/captions_subpage.js b/chrome/browser/resources/settings/a11y_page/captions_subpage.js
index 54161f1f..b948ff1 100644
--- a/chrome/browser/resources/settings/a11y_page/captions_subpage.js
+++ b/chrome/browser/resources/settings/a11y_page/captions_subpage.js
@@ -14,11 +14,30 @@
 
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {FontsBrowserProxy, FontsBrowserProxyImpl, FontsData} from '../appearance_page/fonts_browser_proxy.js';
+import {FontsBrowserProxyImpl} from '../appearance_page/fonts_browser_proxy.js';
 import {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js';
 import {loadTimeData} from '../i18n_setup.js';
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs/prefs_behavior.js';
 
+// TODO(crbug.com/1234307): Delete FontsData and FontsBrowserProxy definitions
+// when captions_subpage.js is migrated to TypeScript.
+
+/**
+ * @typedef {{
+ *   fontList: !Array<{
+ *       0: string,
+ *       1: (string|undefined),
+ *       2: (string|undefined)}>,
+ * }}
+ */
+let FontsData;
+
+/** @interface */
+class FontsBrowserProxy {
+  /** @return {!Promise<!FontsData>} */
+  fetchFontsData() {}
+}
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -208,18 +227,11 @@
     };
   }
 
-  constructor() {
-    super();
-
-    /** @private {!FontsBrowserProxy} */
-    this.browserProxy_ = FontsBrowserProxyImpl.getInstance();
-  }
-
   /** @override */
   ready() {
     super.ready();
-
-    this.browserProxy_.fetchFontsData().then(this.setFontsData_.bind(this));
+    FontsBrowserProxyImpl.getInstance().fetchFontsData().then(
+        this.setFontsData_.bind(this));
   }
 
   /**
diff --git a/chrome/browser/resources/settings/appearance_page/BUILD.gn b/chrome/browser/resources/settings/appearance_page/BUILD.gn
index 2227de3..4899276 100644
--- a/chrome/browser/resources/settings/appearance_page/BUILD.gn
+++ b/chrome/browser/resources/settings/appearance_page/BUILD.gn
@@ -2,77 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/polymer/html_to_js.gni")
-import("../settings.gni")
-
-js_type_check("closure_compile") {
-  is_polymer3 = true
-  closure_flags = settings_closure_flags
-  deps = [
-    ":appearance_browser_proxy",
-    ":appearance_fonts_page",
-    ":appearance_page",
-    ":fonts_browser_proxy",
-    ":home_url_input",
-  ]
-}
-
-js_library("appearance_browser_proxy") {
-  deps = [
-    "//ui/webui/resources/js:cr.m",
-    "//ui/webui/resources/js:load_time_data.m",
-  ]
-  externs_list = [
-    "$externs_path/management.js",
-    "$externs_path/settings_private.js",
-  ]
-}
-
-js_library("appearance_fonts_page") {
-  deps = [
-    ":fonts_browser_proxy",
-    "../controls:settings_dropdown_menu",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/cr_slider:cr_slider",
-  ]
-}
-
-js_library("appearance_page") {
-  deps = [
-    ":appearance_browser_proxy",
-    "..:page_visibility",
-    "..:route",
-    "..:router",
-    "../controls:settings_dropdown_menu",
-    "../prefs:prefs_behavior",
-    "../settings_page:settings_animated_pages",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/js:i18n_behavior.m",
-    "//ui/webui/resources/js:load_time_data.m",
-  ]
-}
-
-js_library("fonts_browser_proxy") {
-  deps = [ "//ui/webui/resources/js:cr.m" ]
-}
-
-js_library("home_url_input") {
-  deps = [
-    ":appearance_browser_proxy",
-    "../controls:pref_control_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_pref_behavior.m",
-    "//ui/webui/resources/js:assert.m",
-    "//ui/webui/resources/js:load_time_data.m",
-  ]
-}
 
 html_to_js("web_components") {
   js_files = [
-    "appearance_fonts_page.js",
-    "appearance_page.js",
-    "home_url_input.js",
+    "appearance_fonts_page.ts",
+    "appearance_page.ts",
+    "home_url_input.ts",
   ]
 }
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js b/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
deleted file mode 100644
index 45070aa..0000000
--- a/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 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.
-
-// clang-format off
-import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-// clang-format on
-
-/** @interface */
-export class AppearanceBrowserProxy {
-  /** @return {!Promise<number>} */
-  getDefaultZoom() {}
-
-  /**
-   * @param {string} themeId
-   * @return {!Promise<!chrome.management.ExtensionInfo>} Theme info.
-   */
-  getThemeInfo(themeId) {}
-
-  /** @return {boolean} Whether the current profile is supervised. */
-  isSupervised() {}
-
-  useDefaultTheme() {}
-
-  // <if expr="is_linux and not chromeos">
-  useSystemTheme() {}
-
-  // </if>
-
-  /**
-   * @param {string} url The url of which to check validity.
-   * @return {!Promise<boolean>}
-   */
-  validateStartupPage(url) {}
-}
-
-/**
- * @implements {AppearanceBrowserProxy}
- */
-export class AppearanceBrowserProxyImpl {
-  /** @override */
-  getDefaultZoom() {
-    return new Promise(function(resolve) {
-      chrome.settingsPrivate.getDefaultZoom(resolve);
-    });
-  }
-
-  /** @override */
-  getThemeInfo(themeId) {
-    return new Promise(function(resolve) {
-      chrome.management.get(themeId, resolve);
-    });
-  }
-
-  /** @override */
-  isSupervised() {
-    return loadTimeData.getBoolean('isSupervised');
-  }
-
-  /** @override */
-  useDefaultTheme() {
-    chrome.send('useDefaultTheme');
-  }
-
-  // <if expr="is_linux and not chromeos">
-  /** @override */
-  useSystemTheme() {
-    chrome.send('useSystemTheme');
-  }
-
-  // </if>
-
-  /** @override */
-  validateStartupPage(url) {
-    return sendWithPromise('validateStartupPage', url);
-  }
-}
-
-addSingletonGetter(AppearanceBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.ts b/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.ts
new file mode 100644
index 0000000..f510055
--- /dev/null
+++ b/chrome/browser/resources/settings/appearance_page/appearance_browser_proxy.ts
@@ -0,0 +1,66 @@
+// Copyright 2016 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.
+
+// clang-format off
+import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+// clang-format on
+
+export interface AppearanceBrowserProxy {
+  getDefaultZoom(): Promise<number>;
+  getThemeInfo(themeId: string): Promise<chrome.management.ExtensionInfo>;
+
+  /** @return Whether the current profile is supervised. */
+  isSupervised(): boolean;
+
+  useDefaultTheme(): void;
+
+  // <if expr="is_linux and not chromeos">
+  useSystemTheme(): void;
+  // </if>
+
+  validateStartupPage(url: string): Promise<boolean>;
+}
+
+export class AppearanceBrowserProxyImpl implements AppearanceBrowserProxy {
+  getDefaultZoom(): Promise<number> {
+    return new Promise(function(resolve) {
+      chrome.settingsPrivate.getDefaultZoom(resolve);
+    });
+  }
+
+  getThemeInfo(themeId: string): Promise<chrome.management.ExtensionInfo> {
+    return new Promise(function(resolve) {
+      chrome.management.get(themeId, resolve);
+    });
+  }
+
+  isSupervised() {
+    return loadTimeData.getBoolean('isSupervised');
+  }
+
+  useDefaultTheme() {
+    chrome.send('useDefaultTheme');
+  }
+
+  // <if expr="is_linux and not chromeos">
+  useSystemTheme() {
+    chrome.send('useSystemTheme');
+  }
+  // </if>
+
+  validateStartupPage(url: string) {
+    return sendWithPromise('validateStartupPage', url);
+  }
+
+  static getInstance(): AppearanceBrowserProxy {
+    return instance || (instance = new AppearanceBrowserProxyImpl());
+  }
+
+  static setInstance(obj: AppearanceBrowserProxy) {
+    instance = obj;
+  }
+}
+
+let instance: AppearanceBrowserProxy|null = null;
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts
similarity index 71%
rename from chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js
rename to chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts
index e9f18bd..1fb25b6 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js
+++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.ts
@@ -17,22 +17,16 @@
 import {FontsBrowserProxy, FontsBrowserProxyImpl, FontsData} from './fonts_browser_proxy.js';
 
 
-/** @type {!Array<number>} */
-const FONT_SIZE_RANGE = [
+const FONT_SIZE_RANGE: number[] = [
   9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24,
   26, 28, 30, 32, 34, 36, 40, 44, 48, 56, 64, 72,
 ];
 
-/** @type {!Array<number>} */
-const MINIMUM_FONT_SIZE_RANGE =
+const MINIMUM_FONT_SIZE_RANGE: number[] =
     [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24];
 
-/**
- * @param {!Array<number>} ticks
- * @return {!Array<!SliderTick>}
- */
-function ticksWithLabels(ticks) {
-  return ticks.map(x => ({label: `${x}`, value: x}));
+function ticksWithLabels(ticks: number[]): SliderTick[] {
+  return ticks.map(x => ({label: `${x}`, value: x, ariaValue: undefined}));
 }
 
 /**
@@ -40,7 +34,12 @@
  * settings.
  */
 
-/** @polymer */
+interface SettingsAppearanceFontsPageElement {
+  $: {
+    minimumSizeFontPreview: HTMLElement,
+  };
+}
+
 class SettingsAppearanceFontsPageElement extends PolymerElement {
   static get is() {
     return 'settings-appearance-fonts-page';
@@ -52,23 +51,16 @@
 
   static get properties() {
     return {
-      /** @private {!DropdownMenuOptionList} */
       fontOptions_: Object,
 
-      /**
-       * Common font sizes.
-       * @private {!Array<!SliderTick>}
-       */
+      /** Common font sizes. */
       fontSizeRange_: {
         readOnly: true,
         type: Array,
         value: ticksWithLabels(FONT_SIZE_RANGE),
       },
 
-      /**
-       * Reasonable, minimum font sizes.
-       * @private {!Array<!SliderTick>}
-       */
+      /** Reasonable, minimum font sizes. */
       minimumFontSizeRange_: {
         readOnly: true,
         type: Array,
@@ -91,26 +83,19 @@
     ];
   }
 
-  /** @override */
-  constructor() {
-    super();
+  private fontOptions_: DropdownMenuOptionList;
+  private fontSizeRange_: SliderTick[];
+  private minimumFontSizeRange_: SliderTick[];
+  private browserProxy_: FontsBrowserProxy =
+      FontsBrowserProxyImpl.getInstance();
 
-    /** @private {!FontsBrowserProxy} */
-    this.browserProxy_ = FontsBrowserProxyImpl.getInstance();
-  }
-
-  /** @override */
   ready() {
     super.ready();
 
     this.browserProxy_.fetchFontsData().then(this.setFontsData_.bind(this));
   }
 
-  /**
-   * @param {!FontsData} response A list of fonts.
-   * @private
-   */
-  setFontsData_(response) {
+  private setFontsData_(response: FontsData) {
     const fontMenuOptions = [];
     for (const fontData of response.fontList) {
       fontMenuOptions.push({value: fontData[0], name: fontData[1]});
@@ -120,17 +105,13 @@
 
   /**
    * Get the minimum font size, accounting for unset prefs.
-   * @return {number}
-   * @private
    */
-  computeMinimumFontSize_() {
+  private computeMinimumFontSize_(): number {
     const prefValue = this.get('prefs.webkit.webprefs.minimum_font_size.value');
-    return /** @type {number} */ (prefValue) || MINIMUM_FONT_SIZE_RANGE[0];
+    return prefValue || MINIMUM_FONT_SIZE_RANGE[0];
   }
 
-
-  /** @private */
-  onMinimumSizeChange_() {
+  private onMinimumSizeChange_() {
     this.$.minimumSizeFontPreview.hidden = this.computeMinimumFontSize_() <= 0;
   }
 }
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.js b/chrome/browser/resources/settings/appearance_page/appearance_page.ts
similarity index 70%
rename from chrome/browser/resources/settings/appearance_page/appearance_page.js
rename to chrome/browser/resources/settings/appearance_page/appearance_page.ts
index d0dedeb..362a1d1 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.js
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.ts
@@ -19,7 +19,7 @@
 import '../controls/settings_dropdown_menu.js';
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DropdownMenuOptionList} from '../controls/settings_dropdown_menu.js';
@@ -35,31 +35,37 @@
 /**
  * This is the absolute difference maintained between standard and
  * fixed-width font sizes. http://crbug.com/91922.
- * @type {number}
  */
-const SIZE_DIFFERENCE_FIXED_STANDARD = 3;
+const SIZE_DIFFERENCE_FIXED_STANDARD: number = 3;
 
 /**
  * ID for autogenerated themes. Should match
  * |ThemeService::kAutogeneratedThemeID|.
  */
-const AUTOGENERATED_THEME_ID = 'autogenerated_theme_id';
+const AUTOGENERATED_THEME_ID: string = 'autogenerated_theme_id';
 
 /**
  * 'settings-appearance-page' is the settings page containing appearance
  * settings.
  */
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- * @implements {PrefsBehaviorInterface}
- */
-const SettingsAppearancePageElementBase =
-    mixinBehaviors([I18nBehavior, PrefsBehavior], PolymerElement);
+// TODO(crbug.com/1234307): Remove when settings_dropdown_menu.js is migrated to
+// TypeScript.
+interface SettingsDropdownMenuElement extends HTMLElement {
+  menuOptions: DropdownMenuOptionList;
+}
 
-/** @polymer */
+interface SettingsAppearancePageElement {
+  $: {
+    defaultFontSize: SettingsDropdownMenuElement,
+    zoomLevel: HTMLSelectElement,
+  };
+}
+
+const SettingsAppearancePageElementBase =
+    mixinBehaviors([I18nBehavior, PrefsBehavior], PolymerElement) as
+    {new (): PolymerElement & I18nBehavior & PrefsBehaviorInterface};
+
 class SettingsAppearancePageElement extends SettingsAppearancePageElementBase {
   static get is() {
     return 'settings-appearance-page';
@@ -73,7 +79,6 @@
     return {
       /**
        * Dictionary defining page visibility.
-       * @type {!AppearancePageVisibility}
        */
       pageVisibility: Object,
 
@@ -82,15 +87,12 @@
         notify: true,
       },
 
-      /** @private */
       defaultZoom_: Number,
 
-      /** @private */
       isWallpaperPolicyControlled_: {type: Boolean, value: true},
 
       /**
        * List of options for the font size drop-down menu.
-       * @type {!DropdownMenuOptionList}
        */
       fontSizeOptions_: {
         readOnly: true,
@@ -110,24 +112,19 @@
        * Predefined zoom factors to be used when zooming in/out. These are in
        * ascending order. Values are displayed in the page zoom drop-down menu
        * as percentages.
-       * @private {!Array<number>}
        */
       pageZoomLevels_: Array,
 
-      /** @private */
       themeSublabel_: String,
 
-      /** @private */
       themeUrl_: String,
 
-      /** @private */
       useSystemTheme_: {
         type: Boolean,
         value:
             false,  // Can only be true on Linux, but value exists everywhere.
       },
 
-      /** @private {!Map<string, string>} */
       focusConfig_: {
         type: Object,
         value() {
@@ -139,7 +136,6 @@
         },
       },
 
-      /** @private */
       showReaderModeOption_: {
         type: Boolean,
         value() {
@@ -147,7 +143,6 @@
         },
       },
 
-      /** @private */
       isForcedTheme_: {
         type: Boolean,
         computed: 'computeIsForcedTheme_(' +
@@ -157,7 +152,6 @@
       // <if expr="is_linux and not chromeos and not lacros">
       /**
        * Whether to show the "Custom Chrome Frame" setting.
-       * @private
        */
       showCustomChromeFrame_: {
         type: Boolean,
@@ -167,7 +161,6 @@
       },
       // </if>
 
-      /** @private */
       showManagedThemeDialog_: Boolean,
     };
   }
@@ -185,15 +178,26 @@
     ];
   }
 
-  /** @override */
-  constructor() {
-    super();
+  pageVisibility: AppearancePageVisibility;
+  private defaultZoom_: number;
+  private isWallpaperPolicyControlled_: boolean;
+  private fontSizeOptions_: DropdownMenuOptionList;
+  private pageZoomLevels_: number[];
+  private themeSublabel_: string;
+  private themeUrl_: string;
+  private useSystemTheme_: boolean;
+  private focusConfig_: Map<string, string>;
+  private showReaderModeOption_: boolean;
+  private isForcedTheme_: boolean;
 
-    /** @private {!AppearanceBrowserProxy} */
-    this.appearanceBrowserProxy_ = AppearanceBrowserProxyImpl.getInstance();
-  }
+  // <if expr="is_linux and not chromeos and not lacros">
+  private showCustomChromeFrame_: boolean;
+  // </if>
 
-  /** @override */
+  private showManagedThemeDialog_: boolean;
+  private appearanceBrowserProxy_: AppearanceBrowserProxy =
+      AppearanceBrowserProxyImpl.getInstance();
+
   ready() {
     super.ready();
 
@@ -204,27 +208,22 @@
       this.defaultZoom_ = zoom;
     });
 
-    this.pageZoomLevels_ = /** @type {!Array<number>} */ (
-        JSON.parse(loadTimeData.getString('presetZoomFactors')));
+    this.pageZoomLevels_ =
+        JSON.parse(loadTimeData.getString('presetZoomFactors'));
   }
 
-  /**
-   * @param {number} zoom
-   * @return {number} A zoom easier read by users.
-   * @private
-   */
-  formatZoom_(zoom) {
+  /** @return A zoom easier read by users. */
+  private formatZoom_(zoom: number): number {
     return Math.round(zoom * 100);
   }
 
   /**
-   * @param {boolean} showHomepage Whether to show home page.
-   * @param {boolean} isNtp Whether to use the NTP as the home page.
-   * @param {string} homepageValue If not using NTP, use this URL.
-   * @return {string} The sub-label.
-   * @private
+   * @param showHomepage Whether to show home page.
+   * @param isNtp Whether to use the NTP as the home page.
+   * @param homepageValue If not using NTP, use this URL.
    */
-  getShowHomeSubLabel_(showHomepage, isNtp, homepageValue) {
+  private getShowHomeSubLabel_(
+      showHomepage: boolean, isNtp: boolean, homepageValue: string): string {
     if (!showHomepage) {
       return this.i18n('homeButtonDisabled');
     }
@@ -234,22 +233,19 @@
     return homepageValue || this.i18n('customWebAddress');
   }
 
-  /** @private */
-  onCustomizeFontsTap_() {
+  private onCustomizeFontsTap_() {
     Router.getInstance().navigateTo(routes.FONTS);
   }
 
-  /** @private */
-  onDisableExtension_() {
+  private onDisableExtension_() {
     this.dispatchEvent(new CustomEvent(
-        'refresh-pref', {bubbles: true, composed: true, detali: 'homepage'}));
+        'refresh-pref', {bubbles: true, composed: true, detail: 'homepage'}));
   }
 
   /**
-   * @param {number} value The changed font size slider value.
-   * @private
+   * @param value The changed font size slider value.
    */
-  defaultFontSizeChanged_(value) {
+  private defaultFontSizeChanged_(value: number) {
     // This pref is handled separately in some extensions, but here it is tied
     // to default_font_size (to simplify the UI).
     this.set(
@@ -259,14 +255,12 @@
 
   /**
    * Open URL for either current theme or the theme gallery.
-   * @private
    */
-  openThemeUrl_() {
+  private openThemeUrl_() {
     window.open(this.themeUrl_ || loadTimeData.getString('themesGalleryUrl'));
   }
 
-  /** @private */
-  onUseDefaultTap_() {
+  private onUseDefaultTap_() {
     if (this.isForcedTheme_) {
       this.showManagedThemeDialog_ = true;
       return;
@@ -275,49 +269,32 @@
   }
 
   // <if expr="is_linux and not chromeos">
-  /**
-   * @param {boolean} useSystemTheme
-   * @private
-   */
-  useSystemThemePrefChanged_(useSystemTheme) {
+  private useSystemThemePrefChanged_(useSystemTheme: boolean) {
     this.useSystemTheme_ = useSystemTheme;
   }
 
-  /**
-   * @param {string} themeId
-   * @param {boolean} useSystemTheme
-   * @return {boolean} Whether to show the "USE CLASSIC" button.
-   * @private
-   */
-  showUseClassic_(themeId, useSystemTheme) {
+  /** @return Whether to show the "USE CLASSIC" button. */
+  private showUseClassic_(themeId: string, useSystemTheme: boolean): boolean {
     return !!themeId || useSystemTheme;
   }
 
-  /**
-   * @param {string} themeId
-   * @param {boolean} useSystemTheme
-   * @return {boolean} Whether to show the "USE GTK+" button.
-   * @private
-   */
-  showUseSystem_(themeId, useSystemTheme) {
+  /** @return Whether to show the "USE GTK+" button. */
+  private showUseSystem_(themeId: string, useSystemTheme: boolean): boolean {
     return (!!themeId || !useSystemTheme) &&
         !this.appearanceBrowserProxy_.isSupervised();
   }
 
   /**
-   * @param {string} themeId
-   * @param {boolean} useSystemTheme
-   * @return {boolean} Whether to show the secondary area where "USE CLASSIC"
-   *     and "USE GTK+" buttons live.
-   * @private
+   * @return Whether to show the secondary area where "USE CLASSIC" and
+   *     "USE GTK+" buttons live.
    */
-  showThemesSecondary_(themeId, useSystemTheme) {
+  private showThemesSecondary_(themeId: string, useSystemTheme: boolean):
+      boolean {
     return this.showUseClassic_(themeId, useSystemTheme) ||
         this.showUseSystem_(themeId, useSystemTheme);
   }
 
-  /** @private */
-  onUseSystemTap_() {
+  private onUseSystemTap_() {
     if (this.isForcedTheme_) {
       this.showManagedThemeDialog_ = true;
       return;
@@ -326,13 +303,8 @@
   }
   // </if>
 
-  /**
-   * @param {string} themeId
-   * @param {boolean} useSystemTheme
-   * @param {boolean} isForcedTheme
-   * @private
-   */
-  themeChanged_(themeId, useSystemTheme, isForcedTheme) {
+  private themeChanged_(
+      themeId: string, useSystemTheme: boolean, isForcedTheme: boolean) {
     if (this.prefs === undefined || useSystemTheme === undefined) {
       return;
     }
@@ -366,41 +338,25 @@
     this.themeSublabel_ = this.i18n(i18nId);
   }
 
-  /**
-   * @return {boolean} Whether applied theme is set by policy.
-   * @private
-   */
-  computeIsForcedTheme_() {
+  /** @return Whether applied theme is set by policy. */
+  private computeIsForcedTheme_(): boolean {
     return !!this.getPref('autogenerated.theme.policy.color').controlledBy;
   }
 
-  /** @private */
-  onZoomLevelChange_() {
+  private onZoomLevelChange_() {
     chrome.settingsPrivate.setDefaultZoom(parseFloat(this.$.zoomLevel.value));
   }
 
-  /**
-   * @see blink::PageZoomValuesEqual().
-   * @param {number} zoom1
-   * @param {number} zoom2
-   * @return {boolean}
-   * @private
-   */
-  zoomValuesEqual_(zoom1, zoom2) {
+  /** @see blink::PageZoomValuesEqual(). */
+  private zoomValuesEqual_(zoom1: number, zoom2: number): boolean {
     return Math.abs(zoom1 - zoom2) <= 0.001;
   }
 
-  /**
-   * @param {boolean} previousIsVisible
-   * @param {boolean} nextIsVisible
-   * @return {boolean}
-   */
-  showHr_(previousIsVisible, nextIsVisible) {
+  private showHr_(previousIsVisible: boolean, nextIsVisible: boolean): boolean {
     return previousIsVisible && nextIsVisible;
   }
 
-  /** @private */
-  onManagedDialogClosed_() {
+  private onManagedDialogClosed_() {
     this.showManagedThemeDialog_ = false;
   }
 }
diff --git a/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.js b/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.js
deleted file mode 100644
index 0b07f65..0000000
--- a/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 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.
-
-// clang-format off
-import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
-// clang-format on
-
-/**
- * @typedef {{
- *   fontList: !Array<{
- *       0: string,
- *       1: (string|undefined),
- *       2: (string|undefined)}>,
- * }}
- */
-export let FontsData;
-
-/** @interface */
-export class FontsBrowserProxy {
-  /**
-   * @return {!Promise<!FontsData>} Fonts
-   */
-  fetchFontsData() {}
-}
-
-/**
- * @implements {FontsBrowserProxy}
- */
-export class FontsBrowserProxyImpl {
-  /** @override */
-  fetchFontsData() {
-    return sendWithPromise('fetchFontsData');
-  }
-}
-
-addSingletonGetter(FontsBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.ts b/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.ts
new file mode 100644
index 0000000..212363f
--- /dev/null
+++ b/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.ts
@@ -0,0 +1,31 @@
+// Copyright 2016 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.
+
+// clang-format off
+import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
+// clang-format on
+
+export type FontsData = {
+  fontList: Array<[string, string, string]>,
+}
+
+export interface FontsBrowserProxy {
+  fetchFontsData(): Promise<FontsData>;
+}
+
+export class FontsBrowserProxyImpl implements FontsBrowserProxy {
+  fetchFontsData() {
+    return sendWithPromise('fetchFontsData');
+  }
+
+  static getInstance(): FontsBrowserProxy {
+    return instance || (instance = new FontsBrowserProxyImpl());
+  }
+
+  static setInstance(obj: FontsBrowserProxy) {
+    instance = obj;
+  }
+}
+
+let instance: FontsBrowserProxy|null = null;
diff --git a/chrome/browser/resources/settings/appearance_page/home_url_input.js b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
similarity index 74%
rename from chrome/browser/resources/settings/appearance_page/home_url_input.js
rename to chrome/browser/resources/settings/appearance_page/home_url_input.ts
index 82bb51a1..179d100 100644
--- a/chrome/browser/resources/settings/appearance_page/home_url_input.js
+++ b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
@@ -10,6 +10,7 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
 import 'chrome://resources/cr_elements/policy/cr_policy_pref_indicator.m.js';
 
+import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
 import {CrPolicyPrefBehavior, CrPolicyPrefBehaviorInterface} from 'chrome://resources/cr_elements/policy/cr_policy_pref_behavior.m.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -18,16 +19,17 @@
 
 import {AppearanceBrowserProxy, AppearanceBrowserProxyImpl} from './appearance_browser_proxy.js';
 
+interface HomeUrlInputElement {
+  $: {
+    input: CrInputElement,
+  };
+}
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {CrPolicyPrefBehaviorInterface}
- */
 const HomeUrlInputElementBase =
-    mixinBehaviors([CrPolicyPrefBehavior, PrefControlBehavior], PolymerElement);
+    mixinBehaviors(
+        [CrPolicyPrefBehavior, PrefControlBehavior], PolymerElement) as
+    {new (): PolymerElement & CrPolicyPrefBehaviorInterface};
 
-/** @polymer */
 class HomeUrlInputElement extends HomeUrlInputElementBase {
   static get is() {
     return 'home-url-input';
@@ -41,8 +43,6 @@
     return {
       /**
        * The preference object to control.
-       * @type {!chrome.settingsPrivate.PrefObject|undefined}
-       * @override
        */
       pref: {observer: 'prefChanged_'},
 
@@ -62,11 +62,17 @@
     };
   }
 
+  pref: chrome.settingsPrivate.PrefObject|undefined;
+  disabled: boolean;
+  canTab: boolean;
+  invalid: boolean;
+  value: string;
+  private browserProxy_: AppearanceBrowserProxy =
+      AppearanceBrowserProxyImpl.getInstance();
+
   constructor() {
     super();
 
-    /** @private {!AppearanceBrowserProxy} */
-    this.browserProxy_ = AppearanceBrowserProxyImpl.getInstance();
     this.noExtensionIndicator = true;  // Prevent double indicator.
   }
 
@@ -79,9 +85,8 @@
 
   /**
    * Polymer changed observer for |pref|.
-   * @private
    */
-  prefChanged_() {
+  private prefChanged_() {
     if (!this.pref) {
       return;
     }
@@ -89,39 +94,33 @@
     this.setInputValueFromPref_();
   }
 
-  /** @private */
-  setInputValueFromPref_() {
-    assert(this.pref.type === chrome.settingsPrivate.PrefType.URL);
-    this.value = /** @type {string} */ (this.pref.value);
+  private setInputValueFromPref_() {
+    assert(this.pref!.type === chrome.settingsPrivate.PrefType.URL);
+    this.value = this.pref!.value;
   }
 
   /**
    * Gets a tab index for this control if it can be tabbed to.
-   * @param {boolean} canTab
-   * @return {number}
-   * @private
    */
-  getTabindex_(canTab) {
+  private getTabindex_(canTab: boolean): number {
     return canTab ? 0 : -1;
   }
 
   /**
    * Change event handler for cr-input. Updates the pref value.
    * settings-input uses the change event because it is fired by the Enter key.
-   * @private
    */
-  onChange_() {
+  private onChange_() {
     if (this.invalid) {
       this.resetValue_();
       return;
     }
 
-    assert(this.pref.type === chrome.settingsPrivate.PrefType.URL);
+    assert(this.pref!.type === chrome.settingsPrivate.PrefType.URL);
     this.set('pref.value', this.value);
   }
 
-  /** @private */
-  resetValue_() {
+  private resetValue_() {
     this.invalid = false;
     this.setInputValueFromPref_();
     this.$.input.blur();
@@ -129,10 +128,8 @@
 
   /**
    * Keydown handler to specify enter-key and escape-key interactions.
-   * @param {!Event} event
-   * @private
    */
-  onKeydown_(event) {
+  private onKeydown_(event: KeyboardEvent) {
     // If pressed enter when input is invalid, do not trigger on-change.
     if (event.key === 'Enter' && this.invalid) {
       event.preventDefault();
@@ -146,24 +143,17 @@
   /**
    * This function prevents unwanted change of selection of the containing
    * cr-radio-group, when the user traverses the input with arrow keys.
-   * @param {!Event} e
-   * @private
    */
-  stopKeyEventPropagation_(e) {
+  private stopKeyEventPropagation_(e: Event) {
     e.stopPropagation();
   }
 
-  /**
-   * @param {boolean} disabled
-   * @return {boolean} Whether the element should be disabled.
-   * @private
-   */
-  isDisabled_(disabled) {
+  /** @return Whether the element should be disabled. */
+  private isDisabled_(disabled: boolean) {
     return disabled || this.isPrefEnforced();
   }
 
-  /** @private */
-  validate_() {
+  private validate_() {
     if (this.value === '') {
       this.invalid = false;
       return;
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 6dd088b3..9793432 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -220,7 +220,6 @@
   out_folder = "$target_gen_dir/$preprocess_folder_v3"
   out_manifest = "$target_gen_dir/$preprocess_v3_manifest"
   in_files = [
-    "appearance_page/fonts_browser_proxy.js",
     "about_page/about_page_browser_proxy.js",
     "chromeos/ensure_lazy_loaded.m.js",
     "chromeos/lazy_load.js",
@@ -276,6 +275,7 @@
   out_folder = "$target_gen_dir/$preprocess_folder_v3"
   out_manifest = "$target_gen_dir/$browser_settings_tsc_manifest"
   in_files = [
+    "appearance_page/fonts_browser_proxy.js",
     "extension_control_browser_proxy.js",
     "i18n_setup.js",
     "icons.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index f60ab92..6c462e0 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -82,7 +82,6 @@
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/a11y_page:captions_subpage",
     "//chrome/browser/resources/settings/a11y_page:live_caption_section",
-    "//chrome/browser/resources/settings/appearance_page:fonts_browser_proxy",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior.m",
     "//chrome/browser/resources/settings/chromeos:os_route.m",
     "//chrome/browser/resources/settings/settings_page:settings_animated_pages",
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
index 2a87aaba07..1d598ef 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
@@ -106,6 +106,7 @@
   connectedCallback() {
     super.connectedCallback();
     this.startObservingAppNotifications_();
+    this.mojoInterfaceProvider_.notifyPageReady();
   }
 
   /** @override */
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index d8272c6..40f83db9 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -889,8 +889,7 @@
   // Only report if the current password changed is the primary account and it's
   // not a Gmail account or if the current password changed is a content area
   // account and it's not a Gmail account.
-  if ((!is_other_gaia_password && !IsPrimaryAccountGmail()) ||
-      (is_other_gaia_password && !IsOtherGaiaAccountGmail(username)))
+  if (!IsAccountGmail(username))
     ReportPasswordChanged();
 #endif
 }
@@ -1242,7 +1241,7 @@
   std::string email =
       password_type.is_account_syncing()
           ? GetAccountInfo().email
-          : GetSignedInNonSyncAccount(username_for_last_shown_warning()).email;
+          : GetAccountInfoForUsername(username_for_last_shown_warning()).email;
   return email.empty() ? std::string() : gaia::ExtractDomainName(email);
 }
 
@@ -1579,18 +1578,13 @@
          !GetAccountInfo().hosted_domain.empty();
 }
 
-// TODO(bdea): Combine the next two methods.
-bool ChromePasswordProtectionService::IsPrimaryAccountGmail() const {
-  return GetAccountInfo().hosted_domain == kNoHostedDomainFound;
-}
-
-bool ChromePasswordProtectionService::IsOtherGaiaAccountGmail(
+bool ChromePasswordProtectionService::IsAccountGmail(
     const std::string& username) const {
-  return GetSignedInNonSyncAccount(username).hosted_domain ==
+  return GetAccountInfoForUsername(username).hosted_domain ==
          kNoHostedDomainFound;
 }
 
-AccountInfo ChromePasswordProtectionService::GetSignedInNonSyncAccount(
+AccountInfo ChromePasswordProtectionService::GetAccountInfoForUsername(
     const std::string& username) const {
   auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
       profile_->GetOriginalProfile());
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index f40a6c5..0aa3616 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -326,19 +326,14 @@
   // If primary account is signed in.
   bool IsPrimaryAccountSignedIn() const override;
 
-  // If a domain is not defined for the primary account. This means the primary
-  // account is a Gmail account.
-  bool IsPrimaryAccountGmail() const override;
+  // Checks whether the account associated with |username| is a Gmail account.
+  bool IsAccountGmail(const std::string& username) const override;
 
   // Gets the AccountInfo for the account corresponding to |username| from the
   // list of signed-in users.
-  AccountInfo GetSignedInNonSyncAccount(
+  AccountInfo GetAccountInfoForUsername(
       const std::string& username) const override;
 
-  // If the domain for the non-syncing account is equal to
-  // |kNoHostedDomainFound|, this means that the account is a Gmail account.
-  bool IsOtherGaiaAccountGmail(const std::string& username) const override;
-
   // If Safe browsing endpoint is not enabled in the country.
   bool IsInExcludedCountry() override;
 
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index 22b06c5..081947f 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -177,10 +177,10 @@
   bool IsPrimaryAccountSignedIn() const override {
     return is_account_signed_in_;
   }
-  bool IsPrimaryAccountGmail() const override {
+  bool IsAccountGmail(const std::string& username) const override {
     return is_no_hosted_domain_found_;
   }
-  AccountInfo GetSignedInNonSyncAccount(
+  AccountInfo GetAccountInfoForUsername(
       const std::string& username) const override {
     return account_info_;
   }
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
index da926b2..44206a0 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
@@ -11,6 +11,8 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/download/download_commands.h"
+#include "chrome/browser/download/download_item_model.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
@@ -22,6 +24,8 @@
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_factory.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
+#include "chrome/browser/safe_browsing/download_protection/deep_scanning_request.h"
+#include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
 #include "chrome/browser/safe_browsing/download_protection/ppapi_download_request.h"
 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
 #include "chrome/browser/ui/browser.h"
@@ -39,6 +43,7 @@
 #include "components/safe_browsing/core/common/proto/csd.pb.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/test/browser_test.h"
@@ -112,8 +117,10 @@
   // |connectors_machine_scope| indicates whether the Connector prefs such as
   // OnFileDownloadedEnterpriseConnector and OnSecurityEventEnterpriseConnector
   // should be set at the machine or user scope.
-  explicit DownloadDeepScanningBrowserTestBase(bool connectors_machine_scope)
-      : connectors_machine_scope_(connectors_machine_scope) {}
+  explicit DownloadDeepScanningBrowserTestBase(bool connectors_machine_scope,
+                                               bool is_consumer)
+      : is_consumer_(is_consumer),
+        connectors_machine_scope_(connectors_machine_scope) {}
 
   void OnDownloadCreated(content::DownloadManager* manager,
                          download::DownloadItem* item) override {
@@ -181,22 +188,24 @@
     SetBinaryUploadServiceTestFactory();
     SetUrlLoaderInterceptor();
     ObserveDownloadManager();
-    AuthorizeForDeepScanning();
+
+    if (!is_consumer_) {
+      AuthorizeForDeepScanning();
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    SetDMTokenForTesting(
-        policy::DMToken::CreateValidTokenForTesting("dm_token"));
-#else
-    if (connectors_machine_scope()) {
       SetDMTokenForTesting(
           policy::DMToken::CreateValidTokenForTesting("dm_token"));
-    } else {
-      SetProfileDMToken(browser()->profile(), "dm_token");
-    }
+#else
+      if (connectors_machine_scope()) {
+        SetDMTokenForTesting(
+            policy::DMToken::CreateValidTokenForTesting("dm_token"));
+      } else {
+        SetProfileDMToken(browser()->profile(), "dm_token");
+      }
 #endif
-    SetAnalysisConnector(browser()->profile()->GetPrefs(),
-                         enterprise_connectors::FILE_DOWNLOADED,
-                         R"({
+      SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                           enterprise_connectors::FILE_DOWNLOADED,
+                           R"({
                               "service_provider": "google",
                               "enable": [
                                 {
@@ -206,7 +215,8 @@
                               ],
                               "block_password_protected": true
                             })",
-                         connectors_machine_scope());
+                           connectors_machine_scope());
+    }
   }
 
   void WaitForDownloadToFinish() {
@@ -218,18 +228,10 @@
     observer.WaitForFinished();
   }
 
-  void WaitForDeepScanRequest(bool is_advanced_protection) {
-    if (is_advanced_protection)
-      waiting_for_app_ = true;
-    else
-      waiting_for_enterprise_ = true;
-
+  void WaitForDeepScanRequest() {
     base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     waiting_for_upload_closure_ = run_loop.QuitClosure();
     run_loop.Run();
-
-    waiting_for_app_ = false;
-    waiting_for_enterprise_ = false;
   }
 
   void WaitForMetadataCheck() {
@@ -246,20 +248,43 @@
   }
 
   void ExpectContentAnalysisSynchronousResponse(
-      bool is_advanced_protection,
       const enterprise_connectors::ContentAnalysisResponse& response,
       const std::vector<std::string>& tags) {
-    connector_url_ =
-        "https://safebrowsing.google.com/safebrowsing/uploads/"
-        "scan?device_token=dm_token&connector=OnFileDownloaded";
-    for (const std::string& tag : tags)
-      connector_url_ += ("&tag=" + tag);
+    if (is_consumer_) {
+      connector_url_ =
+          "https://safebrowsing.google.com/safebrowsing/uploads/consumer";
+    } else {
+      connector_url_ =
+          "https://safebrowsing.google.com/safebrowsing/uploads/"
+          "scan?device_token=dm_token&connector=OnFileDownloaded";
+      for (const std::string& tag : tags)
+        connector_url_ += ("&tag=" + tag);
+    }
 
     test_sb_factory_->test_safe_browsing_service()
         ->GetTestUrlLoaderFactory()
         ->AddResponse(connector_url_, response.SerializeAsString());
   }
 
+  void ExpectContentAnalysisUploadFailure(
+      net::HttpStatusCode status_code,
+      const std::vector<std::string>& tags) {
+    if (is_consumer_) {
+      connector_url_ =
+          "https://safebrowsing.google.com/safebrowsing/uploads/consumer";
+    } else {
+      connector_url_ =
+          "https://safebrowsing.google.com/safebrowsing/uploads/"
+          "scan?device_token=dm_token&connector=OnFileDownloaded";
+      for (const std::string& tag : tags)
+        connector_url_ += ("&tag=" + tag);
+    }
+
+    test_sb_factory_->test_safe_browsing_service()
+        ->GetTestUrlLoaderFactory()
+        ->AddResponse(connector_url_, "", status_code);
+  }
+
   base::FilePath GetTestDataDirectory() {
     base::FilePath test_file_directory;
     base::PathService::Get(chrome::DIR_TEST_DATA, &test_file_directory);
@@ -272,14 +297,8 @@
     return test_sb_factory_.get();
   }
 
-  const enterprise_connectors::ContentAnalysisRequest& last_app_request()
-      const {
-    return last_app_request_;
-  }
-
-  const enterprise_connectors::ContentAnalysisRequest& last_enterprise_request()
-      const {
-    return last_enterprise_request_;
+  const enterprise_connectors::ContentAnalysisRequest& last_request() const {
+    return last_request_;
   }
 
   const base::flat_set<download::DownloadItem*>& download_items() {
@@ -345,6 +364,7 @@
     network::DataElement& data_pipe_element =
         (*request.request_body->elements_mutable())[0];
 
+    data_pipe_getter_.reset();
     data_pipe_getter_.Bind(data_pipe_element.As<network::DataElementDataPipe>()
                                .ReleaseDataPipeGetter());
     EXPECT_TRUE(data_pipe_getter_);
@@ -384,27 +404,29 @@
   }
 
   void InterceptRequest(const network::ResourceRequest& request) {
-    if (request.url ==
-        BinaryUploadService::GetUploadUrl(/*is_consumer_scan_eligible=*/true)) {
-      ASSERT_TRUE(GetUploadMetadata(GetDataPipeUploadData(request),
-                                    &last_app_request_));
-      if (waiting_for_app_)
-        std::move(waiting_for_upload_closure_).Run();
-    }
+    if (is_consumer_) {
+      if (request.url == BinaryUploadService::GetUploadUrl(
+                             /*is_consumer_scan_eligible=*/true)) {
+        ASSERT_TRUE(
+            GetUploadMetadata(GetDataPipeUploadData(request), &last_request_));
+        if (waiting_for_upload_closure_)
+          std::move(waiting_for_upload_closure_).Run();
+      }
+    } else {
+      if (request.url == BinaryUploadService::GetUploadUrl(
+                             /*is_consumer_scan_eligible=*/false)) {
+        ASSERT_TRUE(
+            GetUploadMetadata(GetDataPipeUploadData(request), &last_request_));
+        if (waiting_for_upload_closure_)
+          std::move(waiting_for_upload_closure_).Run();
+      }
 
-    if (request.url == BinaryUploadService::GetUploadUrl(
-                           /*is_consumer_scan_eligible=*/false)) {
-      ASSERT_TRUE(GetUploadMetadata(GetDataPipeUploadData(request),
-                                    &last_enterprise_request_));
-      if (waiting_for_enterprise_)
-        std::move(waiting_for_upload_closure_).Run();
-    }
-
-    if (request.url == connector_url_) {
-      ASSERT_TRUE(GetUploadMetadata(GetDataPipeUploadData(request),
-                                    &last_enterprise_request_));
-      if (waiting_for_enterprise_)
-        std::move(waiting_for_upload_closure_).Run();
+      if (request.url == connector_url_) {
+        ASSERT_TRUE(
+            GetUploadMetadata(GetDataPipeUploadData(request), &last_request_));
+        if (waiting_for_upload_closure_)
+          std::move(waiting_for_upload_closure_).Run();
+      }
     }
 
     if (request.url == PPAPIDownloadRequest::GetDownloadRequestUrl()) {
@@ -413,14 +435,12 @@
     }
   }
 
+  bool is_consumer_;
+
   std::unique_ptr<TestSafeBrowsingServiceFactory> test_sb_factory_;
   FakeBinaryFCMService* binary_fcm_service_;
 
-  bool waiting_for_app_;
-  enterprise_connectors::ContentAnalysisRequest last_app_request_;
-
-  bool waiting_for_enterprise_;
-  enterprise_connectors::ContentAnalysisRequest last_enterprise_request_;
+  enterprise_connectors::ContentAnalysisRequest last_request_;
 
   std::string connector_url_;
 
@@ -437,12 +457,21 @@
   mojo::Remote<network::mojom::DataPipeGetter> data_pipe_getter_;
 };
 
+class ConsumerDeepScanningBrowserTest
+    : public DownloadDeepScanningBrowserTestBase {
+ public:
+  ConsumerDeepScanningBrowserTest()
+      : DownloadDeepScanningBrowserTestBase(/*connectors_machine_scope=*/true,
+                                            /*is_consumer=*/true) {}
+};
+
 class DownloadDeepScanningBrowserTest
     : public DownloadDeepScanningBrowserTestBase,
       public testing::WithParamInterface<bool> {
  public:
   DownloadDeepScanningBrowserTest()
-      : DownloadDeepScanningBrowserTestBase(GetParam()) {}
+      : DownloadDeepScanningBrowserTestBase(GetParam(), /*is_consumer=*/false) {
+  }
 };
 
 INSTANTIATE_TEST_SUITE_P(, DownloadDeepScanningBrowserTest, testing::Bool());
@@ -464,8 +493,7 @@
   dlp_result->set_tag("dlp");
   dlp_result->set_status(
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp", "malware"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp", "malware"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -473,11 +501,11 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // The malware scan finishes asynchronously, and doesn't find anything.
   enterprise_connectors::ContentAnalysisResponse async_response;
-  async_response.set_request_token(last_enterprise_request().request_token());
+  async_response.set_request_token(last_request().request_token());
   auto* malware_result = async_response.add_results();
   malware_result->set_tag("malware");
   malware_result->set_status(
@@ -511,8 +539,7 @@
   dlp_result->set_tag("dlp");
   dlp_result->set_status(
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp", "malware"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp", "malware"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -520,11 +547,11 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // The malware scan finishes asynchronously, and fails
   enterprise_connectors::ContentAnalysisResponse async_response;
-  async_response.set_request_token(last_enterprise_request().request_token());
+  async_response.set_request_token(last_request().request_token());
   auto* malware_result = async_response.add_results();
   malware_result->set_tag("malware");
   malware_result->set_status(
@@ -558,8 +585,7 @@
   dlp_result->set_tag("dlp");
   dlp_result->set_status(
       enterprise_connectors::ContentAnalysisResponse::Result::FAILURE);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp", "malware"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp", "malware"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -567,11 +593,11 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // The malware scan finishes asynchronously, and finds malware.
   enterprise_connectors::ContentAnalysisResponse async_response;
-  async_response.set_request_token(last_enterprise_request().request_token());
+  async_response.set_request_token(last_request().request_token());
   auto* malware_result = async_response.add_results();
   malware_result->set_tag("malware");
   malware_result->set_status(
@@ -611,8 +637,7 @@
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
   auto* dlp_rule = dlp_result->add_triggered_rules();
   dlp_rule->set_action(enterprise_connectors::TriggeredRule::BLOCK);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp", "malware"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp", "malware"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -620,11 +645,11 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // The malware scan finishes asynchronously, and fails.
   enterprise_connectors::ContentAnalysisResponse async_response;
-  async_response.set_request_token(last_enterprise_request().request_token());
+  async_response.set_request_token(last_request().request_token());
   auto* malware_result = async_response.add_results();
   malware_result->set_tag("malware");
   malware_result->set_status(
@@ -659,8 +684,7 @@
   result->set_tag("dlp");
   result->set_status(
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/signed.exe");
@@ -668,7 +692,7 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
   WaitForDownloadToFinish();
 
   // The file should be blocked.
@@ -722,8 +746,7 @@
 
   // No scan runs synchronously.
   enterprise_connectors::ContentAnalysisResponse sync_response;
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp", "malware"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp", "malware"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -731,11 +754,11 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // The malware scan finishes asynchronously, and finds malware.
   enterprise_connectors::ContentAnalysisResponse async_response_1;
-  async_response_1.set_request_token(last_enterprise_request().request_token());
+  async_response_1.set_request_token(last_request().request_token());
   auto* result = async_response_1.add_results();
   result->set_tag("malware");
   result->set_status(
@@ -764,12 +787,12 @@
       /*size*/ 276,
       /*result*/ EventResultToString(EventResult::WARNED),
       /*username*/ kUserName,
-      /*scan_id*/ last_enterprise_request().request_token());
+      /*scan_id*/ last_request().request_token());
 
   // The DLP scan finishes asynchronously, and finds nothing. The malware result
   // is attached to the response again.
   enterprise_connectors::ContentAnalysisResponse async_response_2;
-  async_response_2.set_request_token(last_enterprise_request().request_token());
+  async_response_2.set_request_token(last_request().request_token());
   auto* malware_result = async_response_2.add_results();
   malware_result->set_tag("malware");
   malware_result->set_status(
@@ -829,11 +852,10 @@
   auto* dlp_rule = result->add_triggered_rules();
   dlp_rule->set_action(enterprise_connectors::TriggeredRule::WARN);
   dlp_rule->set_rule_name("dlp_rule_name");
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp"});
 
   WaitForMetadataCheck();
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   // Both the DLP and malware violations generate an event.
   std::set<std::string> zip_types = {"application/zip",
@@ -855,7 +877,7 @@
       /*size*/ 276,
       /*result*/ EventResultToString(EventResult::WARNED),
       /*username*/ kUserName,
-      /*scan_id*/ last_enterprise_request().request_token());
+      /*scan_id*/ last_request().request_token());
   WaitForDownloadToFinish();
 
   // The file should be blocked.
@@ -880,7 +902,8 @@
       public testing::WithParamInterface<bool> {
  public:
   DownloadRestrictionsDeepScanningBrowserTest()
-      : DownloadDeepScanningBrowserTestBase(GetParam()) {}
+      : DownloadDeepScanningBrowserTestBase(GetParam(), /*is_consumer=*/false) {
+  }
   ~DownloadRestrictionsDeepScanningBrowserTest() override = default;
 
   void SetUpOnMainThread() override {
@@ -961,7 +984,8 @@
       public testing::WithParamInterface<bool> {
  public:
   AllowlistedUrlDeepScanningBrowserTest()
-      : DownloadDeepScanningBrowserTestBase(GetParam()) {}
+      : DownloadDeepScanningBrowserTestBase(GetParam(), /*is_consumer=*/false) {
+  }
   ~AllowlistedUrlDeepScanningBrowserTest() override = default;
 
   void SetUpOnMainThread() override {
@@ -997,8 +1021,7 @@
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
   auto* dlp_rule = result->add_triggered_rules();
   dlp_rule->set_action(enterprise_connectors::TriggeredRule::BLOCK);
-  ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                           sync_response, {"dlp"});
+  ExpectContentAnalysisSynchronousResponse(sync_response, {"dlp"});
 
   GURL url = embedded_test_server()->GetURL(
       "/safe_browsing/download_protection/zipfile_two_archives.zip");
@@ -1006,7 +1029,7 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
 
-  WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+  WaitForDeepScanRequest();
 
   WaitForDownloadToFinish();
 
@@ -1029,7 +1052,8 @@
           std::tuple<ClientDownloadResponse::Verdict, ScanningVerdict, bool>> {
  public:
   MetadataCheckAndDeepScanningBrowserTest()
-      : DownloadDeepScanningBrowserTestBase(std::get<2>(GetParam())) {}
+      : DownloadDeepScanningBrowserTestBase(std::get<2>(GetParam()),
+                                            /*is_consumer=*/false) {}
 
   ClientDownloadResponse::Verdict metadata_check_verdict() const {
     return std::get<0>(GetParam());
@@ -1039,7 +1063,7 @@
 
   enterprise_connectors::ContentAnalysisResponse scanning_response() const {
     enterprise_connectors::ContentAnalysisResponse response;
-    response.set_request_token(last_enterprise_request().request_token());
+    response.set_request_token(last_request().request_token());
     auto* result = response.add_results();
     result->set_tag("malware");
     result->set_status(
@@ -1186,9 +1210,8 @@
   // Nothing is returned synchronously.
   if (deep_scan_needed()) {
     enterprise_connectors::ContentAnalysisResponse sync_response;
-    sync_response.set_request_token(last_enterprise_request().request_token());
-    ExpectContentAnalysisSynchronousResponse(/*is_advanced_protection=*/false,
-                                             sync_response, {"malware"});
+    sync_response.set_request_token(last_request().request_token());
+    ExpectContentAnalysisSynchronousResponse(sync_response, {"malware"});
   }
 
   GURL url = embedded_test_server()->GetURL(
@@ -1199,7 +1222,7 @@
 
   WaitForMetadataCheck();
   if (deep_scan_needed())
-    WaitForDeepScanRequest(/*is_advanced_protection=*/false);
+    WaitForDeepScanRequest();
 
   // Both the DLP and malware violations generate an event.
   std::set<std::string> zip_types = {"application/zip",
@@ -1213,8 +1236,7 @@
     // result will be reported over the metadata check one.
     auto scan_id =
         deep_scan_needed() && scanning_verdict() != ScanningVerdict::SAFE
-            ? absl::optional<std::string>(
-                  last_enterprise_request().request_token())
+            ? absl::optional<std::string>(last_request().request_token())
             : absl::nullopt;
 
     validator.ExpectDangerousDeepScanningResult(
@@ -1278,4 +1300,178 @@
                                 true, samples);
 }
 
+class WaitForModalObserver : public DeepScanningRequest::Observer {
+ public:
+  explicit WaitForModalObserver(DeepScanningRequest* request)
+      : request_(request),
+        run_loop_(base::RunLoop::Type::kNestableTasksAllowed) {
+    request_->AddObserver(this);
+  }
+
+  ~WaitForModalObserver() override {
+    if (request_)
+      request_->RemoveObserver(this);
+  }
+
+  void Wait() { run_loop_.Run(); }
+
+  void OnModalShown(DeepScanningRequest* request) override { run_loop_.Quit(); }
+  void OnFinish(DeepScanningRequest* request) override {
+    request_->RemoveObserver(this);
+    request_ = nullptr;
+  }
+
+ private:
+  DeepScanningRequest* request_;
+  base::RunLoop run_loop_;
+};
+
+class WaitForFinishObserver : public DeepScanningRequest::Observer {
+ public:
+  explicit WaitForFinishObserver(DeepScanningRequest* request)
+      : request_(request),
+        run_loop_(base::RunLoop::Type::kNestableTasksAllowed) {
+    request_->AddObserver(this);
+  }
+
+  ~WaitForFinishObserver() override {
+    if (request_)
+      request_->RemoveObserver(this);
+  }
+
+  void Wait() { run_loop_.Run(); }
+
+  void OnFinish(DeepScanningRequest* request) override {
+    run_loop_.Quit();
+    request_->RemoveObserver(this);
+    request_ = nullptr;
+  }
+
+ private:
+  DeepScanningRequest* request_;
+  base::RunLoop run_loop_;
+};
+
+IN_PROC_BROWSER_TEST_F(ConsumerDeepScanningBrowserTest,
+                       RetriableErrorShowsModal) {
+  SetSafeBrowsingState(browser()->profile()->GetPrefs(), ENHANCED_PROTECTION);
+
+  ClientDownloadResponse metadata_response;
+  metadata_response.set_request_deep_scan(true);
+  ExpectMetadataResponse(metadata_response);
+
+  GURL url = embedded_test_server()->GetURL(
+      "/safe_browsing/download_protection/zipfile_two_archives.zip");
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+
+  // Wait for download to show the prompt
+  {
+    content::DownloadManager* download_manager =
+        browser()->profile()->GetDownloadManager();
+    content::DownloadTestObserverTerminal observer(
+        download_manager, 1,
+        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT);
+    observer.WaitForFinished();
+  }
+
+  // Trigger upload, bypassing the prompt
+  {
+    ASSERT_EQ(download_items().size(), 1u);
+    DownloadItemModel model(*download_items().begin());
+    DownloadCommands(model.GetWeakPtr())
+        .ExecuteCommand(DownloadCommands::DEEP_SCAN);
+  }
+
+  ExpectContentAnalysisUploadFailure(net::HTTP_INTERNAL_SERVER_ERROR, {});
+
+  // Wait for the modal dialog
+  {
+    auto deep_scan_requests = test_sb_factory()
+                                  ->test_safe_browsing_service()
+                                  ->download_protection_service()
+                                  ->GetDeepScanningRequests();
+    ASSERT_EQ(deep_scan_requests.size(), 1u);
+    WaitForModalObserver observer(*deep_scan_requests.begin());
+    observer.Wait();
+  }
+
+  web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager =
+      web_modal::WebContentsModalDialogManager::FromWebContents(
+          browser()->tab_strip_model()->GetActiveWebContents());
+  EXPECT_TRUE(web_contents_modal_dialog_manager->IsDialogActive());
+
+  // If the dialog remains open, the download remains in progress. This blocks
+  // shutdown, so close the modal.
+  web_contents_modal_dialog_manager->CloseAllDialogs();
+
+  WaitForDownloadToFinish();
+
+  ASSERT_EQ(download_items().size(), 1u);
+  download::DownloadItem* download = *download_items().begin();
+  EXPECT_EQ(download->GetState(), download::DownloadItem::COMPLETE);
+  EXPECT_EQ(download->GetDangerType(),
+            download::DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
+}
+
+IN_PROC_BROWSER_TEST_F(ConsumerDeepScanningBrowserTest,
+                       NonretriableErrorDoesNotShowModal) {
+  SetSafeBrowsingState(browser()->profile()->GetPrefs(), ENHANCED_PROTECTION);
+
+  ClientDownloadResponse metadata_response;
+  metadata_response.set_request_deep_scan(true);
+  ExpectMetadataResponse(metadata_response);
+
+  // An encrypted file will always be encrypted, and therefore not suitable for
+  // deep scanning.
+  GURL url = embedded_test_server()->GetURL(
+      "/safe_browsing/download_protection/encrypted.zip");
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+
+  // Wait for download to show the prompt
+  {
+    content::DownloadManager* download_manager =
+        browser()->profile()->GetDownloadManager();
+    content::DownloadTestObserverTerminal observer(
+        download_manager, 1,
+        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT);
+    observer.WaitForFinished();
+  }
+
+  // Trigger upload, bypassing the prompt
+  {
+    ASSERT_EQ(download_items().size(), 1u);
+    DownloadItemModel model(*download_items().begin());
+    DownloadCommands(model.GetWeakPtr())
+        .ExecuteCommand(DownloadCommands::DEEP_SCAN);
+  }
+
+  // Wait for deep scanning to finish
+  {
+    auto deep_scan_requests = test_sb_factory()
+                                  ->test_safe_browsing_service()
+                                  ->download_protection_service()
+                                  ->GetDeepScanningRequests();
+    ASSERT_EQ(deep_scan_requests.size(), 1u);
+    WaitForFinishObserver observer(*deep_scan_requests.begin());
+    observer.Wait();
+  }
+
+  web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager =
+      web_modal::WebContentsModalDialogManager::FromWebContents(
+          browser()->tab_strip_model()->GetActiveWebContents());
+  EXPECT_FALSE(web_contents_modal_dialog_manager->IsDialogActive());
+
+  WaitForDownloadToFinish();
+
+  ASSERT_EQ(download_items().size(), 1u);
+  download::DownloadItem* download = *download_items().begin();
+  EXPECT_EQ(download->GetState(), download::DownloadItem::COMPLETE);
+  EXPECT_EQ(download->GetDangerType(),
+            download::DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
index 400f6c8..2708982 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -164,6 +164,23 @@
   }
 }
 
+bool ResultIsRetriable(BinaryUploadService::Result result) {
+  switch (result) {
+    case BinaryUploadService::Result::UNKNOWN:
+    case BinaryUploadService::Result::SUCCESS:
+    case BinaryUploadService::Result::UNAUTHORIZED:
+    case BinaryUploadService::Result::FILE_TOO_LARGE:
+    case BinaryUploadService::Result::FILE_ENCRYPTED:
+    case BinaryUploadService::Result::DLP_SCAN_UNSUPPORTED_FILE_TYPE:
+      return false;
+    case BinaryUploadService::Result::UPLOAD_FAILURE:
+    case BinaryUploadService::Result::TIMEOUT:
+    case BinaryUploadService::Result::FAILED_TO_GET_TOKEN:
+    case BinaryUploadService::Result::TOO_MANY_REQUESTS:
+      return true;
+  }
+}
+
 }  // namespace
 
 /* static */
@@ -207,6 +224,14 @@
   item_->RemoveObserver(this);
 }
 
+void DeepScanningRequest::AddObserver(Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void DeepScanningRequest::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 void DeepScanningRequest::Start() {
   // Indicate we're now scanning the file.
   callback_.Run(DownloadCheckResult::ASYNC_SCANNING);
@@ -306,14 +331,21 @@
         "SBClientDownload.MalwareDeepScanResult." + GetTriggerName(trigger_),
         download_result);
   } else if (trigger_ == DeepScanTrigger::TRIGGER_APP_PROMPT &&
+             ResultIsRetriable(result) &&
              MaybeShowDeepScanFailureModalDialog(
                  base::BindOnce(&DeepScanningRequest::Start,
                                 weak_ptr_factory_.GetWeakPtr()),
                  base::BindOnce(&DeepScanningRequest::FinishRequest,
                                 weak_ptr_factory_.GetWeakPtr(),
                                 DownloadCheckResult::UNKNOWN),
+                 base::BindOnce(&DeepScanningRequest::FinishRequest,
+                                weak_ptr_factory_.GetWeakPtr(),
+                                DownloadCheckResult::UNKNOWN),
                  base::BindOnce(&DeepScanningRequest::OpenDownload,
                                 weak_ptr_factory_.GetWeakPtr()))) {
+    for (auto& observer : observers_)
+      observer.OnModalShown(this);
+
     return;
   } else if (result == BinaryUploadService::Result::FILE_TOO_LARGE) {
     if (analysis_settings_.block_large_files)
@@ -331,17 +363,29 @@
       content::DownloadItemUtils::GetBrowserContext(item_));
   if (profile && trigger_ == DeepScanTrigger::TRIGGER_POLICY) {
     std::string raw_digest_sha256 = item_->GetHash();
+    std::string sha256 =
+        base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size());
     MaybeReportDeepScanningVerdict(
         profile, item_->GetURL(), item_->GetTargetFilePath().AsUTF8Unsafe(),
-        base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
-        item_->GetMimeType(),
+        sha256, item_->GetMimeType(),
         extensions::SafeBrowsingPrivateEventRouter::kTriggerFileDownload,
         DeepScanAccessPoint::DOWNLOAD, item_->GetTotalBytes(), result, response,
         GetEventResult(download_result, profile));
 
-    item_->SetUserData(
-        enterprise_connectors::ScanResult::kKey,
-        std::make_unique<enterprise_connectors::ScanResult>(response));
+    auto metadata = enterprise_connectors::FileMetadata(
+        item_->GetTargetFilePath().AsUTF8Unsafe(), sha256, item_->GetMimeType(),
+        item_->GetTotalBytes(), response);
+    enterprise_connectors::ScanResult* stored_result =
+        static_cast<enterprise_connectors::ScanResult*>(
+            item_->GetUserData(enterprise_connectors::ScanResult::kKey));
+    if (stored_result) {
+      stored_result->file_metadata.push_back(std::move(metadata));
+    } else {
+      auto result = std::make_unique<enterprise_connectors::ScanResult>(
+          std::move(metadata));
+      item_->SetUserData(enterprise_connectors::ScanResult::kKey,
+                         std::move(result));
+    }
   }
 
   FinishRequest(download_result);
@@ -353,6 +397,9 @@
 }
 
 void DeepScanningRequest::FinishRequest(DownloadCheckResult result) {
+  for (auto& observer : observers_)
+    observer.OnFinish(this);
+
   callback_.Run(result);
   weak_ptr_factory_.InvalidateWeakPtrs();
   item_->RemoveObserver(this);
@@ -363,6 +410,7 @@
 bool DeepScanningRequest::MaybeShowDeepScanFailureModalDialog(
     base::OnceClosure accept_callback,
     base::OnceClosure cancel_callback,
+    base::OnceClosure close_callback,
     base::OnceClosure open_now_callback) {
   Profile* profile = Profile::FromBrowserContext(
       content::DownloadItemUtils::GetBrowserContext(item_));
@@ -377,7 +425,7 @@
   DeepScanningFailureModalDialog::ShowForWebContents(
       browser->tab_strip_model()->GetActiveWebContents(),
       std::move(accept_callback), std::move(cancel_callback),
-      std::move(open_now_callback));
+      std::move(close_callback), std::move(open_now_callback));
   return true;
 }
 
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h
index b2c0ca6e..02706914 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h
@@ -42,6 +42,17 @@
     kMaxValue = TRIGGER_POLICY,
   };
 
+  class Observer : public base::CheckedObserver {
+   public:
+    ~Observer() override = default;
+
+    // Called when the DeepScanningRequest chooses to display a modal dialog.
+    virtual void OnModalShown(DeepScanningRequest* request) {}
+
+    // Called when the DeepScanningRequest finishes.
+    virtual void OnFinish(DeepScanningRequest* request) {}
+  };
+
   // Checks the current policies to determine whether files must be uploaded by
   // policy. Returns the settings to apply to this analysis if it should happen
   // or absl::nullopt if no analysis should happen.
@@ -62,6 +73,9 @@
   // Begin the deep scanning request. This must be called on the UI thread.
   void Start();
 
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
  private:
   // Callback when the |download_request_maker_| is finished assembling the
   // download metadata request.
@@ -84,6 +98,7 @@
   // whether the dialog was successfully shown.
   bool MaybeShowDeepScanFailureModalDialog(base::OnceClosure accept_callback,
                                            base::OnceClosure cancel_callback,
+                                           base::OnceClosure close_callback,
                                            base::OnceClosure open_now_callback);
 
   // Called to open the download. This is triggered by the timeout modal dialog.
@@ -116,6 +131,9 @@
   // Used to assemble the download metadata.
   std::unique_ptr<DownloadRequestMaker> download_request_maker_;
 
+  // This list of observers of this request.
+  base::ObserverList<Observer> observers_;
+
   base::WeakPtrFactory<DeepScanningRequest> weak_ptr_factory_;
 };
 
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
index cdf8986f..5f5f995c 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -615,29 +615,36 @@
   if (scan_result &&
       item->GetDangerType() ==
           download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING) {
-    for (const auto& result : scan_result->response.results()) {
-      if (result.tag() != "dlp")
-        continue;
+    for (const auto& metadata : scan_result->file_metadata) {
+      for (const auto& result : metadata.scan_response.results()) {
+        if (result.tag() != "dlp")
+          continue;
 
-      router->OnAnalysisConnectorWarningBypassed(
-          item->GetURL(), item->GetTargetFilePath().AsUTF8Unsafe(),
-          base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
-          item->GetMimeType(),
-          extensions::SafeBrowsingPrivateEventRouter::kTriggerFileDownload,
-          scan_result->response.request_token(), DeepScanAccessPoint::DOWNLOAD,
-          result, item->GetTotalBytes());
+        router->OnAnalysisConnectorWarningBypassed(
+            item->GetURL(), metadata.filename, metadata.sha256,
+            metadata.mime_type,
+            extensions::SafeBrowsingPrivateEventRouter::kTriggerFileDownload,
+            metadata.scan_response.request_token(),
+            DeepScanAccessPoint::DOWNLOAD, result, metadata.size);
 
-      // The won't be multiple DLP verdicts in the same response, so no need to
-      // keep iterating.
-      break;
+        // There won't be multiple DLP verdicts in the same response, so no need
+        // to keep iterating.
+        break;
+      }
+    }
+  } else if (scan_result) {
+    for (const auto& metadata : scan_result->file_metadata) {
+      router->OnDangerousDownloadOpened(item->GetURL(), metadata.filename,
+                                        metadata.sha256, metadata.mime_type,
+                                        metadata.scan_response.request_token(),
+                                        item->GetDangerType(), metadata.size);
     }
   } else {
     router->OnDangerousDownloadOpened(
         item->GetURL(), item->GetTargetFilePath().AsUTF8Unsafe(),
         base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
-        item->GetMimeType(),
-        scan_result ? scan_result->response.request_token() : "",
-        item->GetDangerType(), item->GetTotalBytes());
+        item->GetMimeType(), /*scan_id*/ "", item->GetDangerType(),
+        item->GetTotalBytes());
   }
 }
 
@@ -671,6 +678,15 @@
   insertion_result.first->second->Start();
 }
 
+std::vector<DeepScanningRequest*>
+DownloadProtectionService::GetDeepScanningRequests() {
+  std::vector<DeepScanningRequest*> requests;
+  for (const auto& pair : deep_scanning_requests_) {
+    requests.push_back(pair.first);
+  }
+  return requests;
+}
+
 scoped_refptr<network::SharedURLLoaderFactory>
 DownloadProtectionService::GetURLLoaderFactory(
     content::BrowserContext* browser_context) {
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.h b/chrome/browser/safe_browsing/download_protection/download_protection_service.h
index 7ccf22a..f4a8c45 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service.h
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.h
@@ -203,6 +203,9 @@
       DeepScanningRequest::DeepScanTrigger trigger,
       enterprise_connectors::AnalysisSettings analysis_settings);
 
+  // Returns all the currently active deep scanning requests.
+  std::vector<DeepScanningRequest*> GetDeepScanningRequests();
+
   virtual scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory(
       content::BrowserContext* browser_context);
 
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
index 8d6a0ec5..63185f3 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -2874,17 +2874,18 @@
       enterprise_connectors::
           ContentAnalysisResponse_Result_TriggeredRule_Action_WARN);
   result->set_tag("dlp");
-  item.SetUserData(
-      enterprise_connectors::ScanResult::kKey,
-      std::make_unique<enterprise_connectors::ScanResult>(response));
+  enterprise_connectors::FileMetadata file_metadata(
+      final_path_.AsUTF8Unsafe(), "68617368", "fake/mimetype", 1234, response);
+  auto scan_result = std::make_unique<enterprise_connectors::ScanResult>(
+      std::move(file_metadata));
+  item.SetUserData(enterprise_connectors::ScanResult::kKey,
+                   std::move(scan_result));
   EXPECT_CALL(item, IsDangerous()).WillRepeatedly(Return(true));
   EXPECT_CALL(item, GetDangerType())
       .WillRepeatedly(
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING));
 
-  // This test sets the mimetype to the empty string, so pass a valid set
-  // pointer, but only put the empty string in it.
-  std::set<std::string> expected_mimetypes{""};
+  std::set<std::string> expected_mimetypes{"fake/mimetype"};
   EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",                          // URL, not set in this test
@@ -2893,7 +2894,7 @@
       extensions::SafeBrowsingPrivateEventRouter::
           kTriggerFileDownload,  // expected_trigger
       response.results()[0], &expected_mimetypes,
-      0,  // expected_content_size
+      1234,  // expected_content_size
       safe_browsing::EventResultToString(
           safe_browsing::EventResult::BYPASSED),  // expected_result
       "",                                         // expected_username
@@ -2978,16 +2979,17 @@
   response.add_results()->add_triggered_rules()->set_action(
       enterprise_connectors::
           ContentAnalysisResponse_Result_TriggeredRule_Action_WARN);
-  item.SetUserData(
-      enterprise_connectors::ScanResult::kKey,
-      std::make_unique<enterprise_connectors::ScanResult>(response));
+  enterprise_connectors::FileMetadata file_metadata(
+      final_path_.AsUTF8Unsafe(), "68617368", "fake/mimetype", 1234, response);
+  auto scan_result = std::make_unique<enterprise_connectors::ScanResult>(
+      std::move(file_metadata));
+  item.SetUserData(enterprise_connectors::ScanResult::kKey,
+                   std::move(scan_result));
   EXPECT_CALL(item, GetDangerType())
       .WillRepeatedly(
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING));
 
-  // This test sets the mimetype to the empty string, so pass a valid set
-  // pointer, but only put the empty string in it.
-  std::set<std::string> expected_mimetypes{""};
+  std::set<std::string> expected_mimetypes{"fake/mimetype"};
   EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",                          // URL, not set in this test
@@ -2996,7 +2998,7 @@
       extensions::SafeBrowsingPrivateEventRouter::
           kTriggerFileDownload,  // expected_trigger
       response.results()[0], &expected_mimetypes,
-      0,  // expected_content_size
+      1234,  // expected_content_size
       safe_browsing::EventResultToString(
           safe_browsing::EventResult::BYPASSED),  // expected_result
       "",                                         // expected_username
@@ -3033,16 +3035,17 @@
   response.add_results()->add_triggered_rules()->set_action(
       enterprise_connectors::
           ContentAnalysisResponse_Result_TriggeredRule_Action_BLOCK);
-  item.SetUserData(
-      enterprise_connectors::ScanResult::kKey,
-      std::make_unique<enterprise_connectors::ScanResult>(response));
+  enterprise_connectors::FileMetadata file_metadata(
+      final_path_.AsUTF8Unsafe(), "68617368", "fake/mimetype", 1234, response);
+  auto scan_result = std::make_unique<enterprise_connectors::ScanResult>(
+      std::move(file_metadata));
+  item.SetUserData(enterprise_connectors::ScanResult::kKey,
+                   std::move(scan_result));
   EXPECT_CALL(item, GetDangerType())
       .WillRepeatedly(
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK));
 
-  // This test sets the mimetype to the empty string, so pass a valid set
-  // pointer, but only put the empty string in it.
-  std::set<std::string> expected_mimetypes{""};
+  std::set<std::string> expected_mimetypes{"fake/mimetype"};
   EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",                          // URL, not set in this test
@@ -3051,7 +3054,7 @@
       extensions::SafeBrowsingPrivateEventRouter::
           kTriggerFileDownload,  // expected_trigger
       response.results()[0], &expected_mimetypes,
-      0,  // expected_content_size
+      1234,  // expected_content_size
       safe_browsing::EventResultToString(
           safe_browsing::EventResult::BYPASSED),  // expected_result
       "",                                         // expected_username
diff --git a/chrome/browser/safe_browsing/download_protection/download_reporter.cc b/chrome/browser/safe_browsing/download_protection/download_reporter.cc
index 5ac26de..f039295f 100644
--- a/chrome/browser/safe_browsing/download_protection/download_reporter.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_reporter.cc
@@ -44,27 +44,30 @@
   // dangerous file has already been reported.
   auto* scan_result = static_cast<enterprise_connectors::ScanResult*>(
       download->GetUserData(enterprise_connectors::ScanResult::kKey));
-  if (scan_result &&
-      enterprise_connectors::ContainsMalwareVerdict(scan_result->response)) {
-    return;
+  if (scan_result) {
+    for (const auto& metadata : scan_result->file_metadata) {
+      if (enterprise_connectors::ContainsMalwareVerdict(metadata.scan_response))
+        return;
+    }
   }
 
   content::BrowserContext* browser_context =
       content::DownloadItemUtils::GetBrowserContext(download);
   Profile* profile = Profile::FromBrowserContext(browser_context);
-  if (profile) {
-    std::string raw_digest_sha256 = download->GetHash();
-    auto* router =
-        extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(
-            profile);
-    if (router) {
-      router->OnDangerousDownloadEvent(
-          download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
-          base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
-          download->GetDangerType(), download->GetMimeType(), /*scan_id*/ "",
-          download->GetTotalBytes(), EventResult::WARNED);
-    }
-  }
+  if (!profile)
+    return;
+
+  auto* router =
+      extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile);
+  if (!router)
+    return;
+
+  std::string raw_digest_sha256 = download->GetHash();
+  router->OnDangerousDownloadEvent(
+      download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
+      base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
+      download->GetDangerType(), download->GetMimeType(), /*scan_id*/ "",
+      download->GetTotalBytes(), EventResult::WARNED);
 }
 
 void ReportDangerousDownloadWarningBypassed(
@@ -73,23 +76,31 @@
   content::BrowserContext* browser_context =
       content::DownloadItemUtils::GetBrowserContext(download);
   Profile* profile = Profile::FromBrowserContext(browser_context);
-  if (profile) {
-    std::string raw_digest_sha256 = download->GetHash();
-    auto* router =
-        extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(
-            profile);
-    if (router) {
-      enterprise_connectors::ScanResult* stored_result =
-          static_cast<enterprise_connectors::ScanResult*>(
-              download->GetUserData(enterprise_connectors::ScanResult::kKey));
+  if (!profile)
+    return;
+
+  auto* router =
+      extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile);
+  if (!router)
+    return;
+
+  enterprise_connectors::ScanResult* stored_result =
+      static_cast<enterprise_connectors::ScanResult*>(
+          download->GetUserData(enterprise_connectors::ScanResult::kKey));
+  if (stored_result) {
+    for (const auto& metadata : stored_result->file_metadata) {
       router->OnDangerousDownloadWarningBypassed(
-          download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
-          base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
-          original_danger_type, download->GetMimeType(),
-          /*scan_id*/
-          stored_result ? stored_result->response.request_token() : "",
-          download->GetTotalBytes());
+          download->GetURL(), metadata.filename, metadata.sha256,
+          original_danger_type, metadata.mime_type,
+          metadata.scan_response.request_token(), metadata.size);
     }
+  } else {
+    std::string raw_digest_sha256 = download->GetHash();
+    router->OnDangerousDownloadWarningBypassed(
+        download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
+        base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
+        original_danger_type, download->GetMimeType(),
+        /*scan_id*/ "", download->GetTotalBytes());
   }
 }
 
@@ -97,12 +108,23 @@
   content::BrowserContext* browser_context =
       content::DownloadItemUtils::GetBrowserContext(download);
   Profile* profile = Profile::FromBrowserContext(browser_context);
-  if (profile) {
-    std::string raw_digest_sha256 = download->GetHash();
-    enterprise_connectors::ScanResult* stored_result =
-        static_cast<enterprise_connectors::ScanResult*>(
-            download->GetUserData(enterprise_connectors::ScanResult::kKey));
+  if (!profile)
+    return;
 
+  enterprise_connectors::ScanResult* stored_result =
+      static_cast<enterprise_connectors::ScanResult*>(
+          download->GetUserData(enterprise_connectors::ScanResult::kKey));
+
+  if (stored_result) {
+    for (const auto& metadata : stored_result->file_metadata) {
+      ReportAnalysisConnectorWarningBypass(
+          profile, download->GetURL(), metadata.filename, metadata.sha256,
+          metadata.mime_type,
+          extensions::SafeBrowsingPrivateEventRouter::kTriggerFileDownload,
+          DeepScanAccessPoint::DOWNLOAD, metadata.size, metadata.scan_response);
+    }
+  } else {
+    std::string raw_digest_sha256 = download->GetHash();
     ReportAnalysisConnectorWarningBypass(
         profile, download->GetURL(),
         download->GetTargetFilePath().AsUTF8Unsafe(),
@@ -110,8 +132,7 @@
         download->GetMimeType(),
         extensions::SafeBrowsingPrivateEventRouter::kTriggerFileDownload,
         DeepScanAccessPoint::DOWNLOAD, download->GetTotalBytes(),
-        stored_result ? stored_result->response
-                      : enterprise_connectors::ContentAnalysisResponse());
+        enterprise_connectors::ContentAnalysisResponse());
   }
 }
 
diff --git a/chrome/browser/shell_integration_linux_unittest.cc b/chrome/browser/shell_integration_linux_unittest.cc
index 6697ccf..7d44b41 100644
--- a/chrome/browser/shell_integration_linux_unittest.cc
+++ b/chrome/browser/shell_integration_linux_unittest.cc
@@ -582,10 +582,26 @@
   EXPECT_EQ(file_contents, expected_file_contents);
 }
 
+// The WM class name may be either capitalised or not, depending on the
+// platform.
+void CheckProgramClassClass(const std::string& class_name) {
+#if defined(USE_OZONE)
+  if (features::IsUsingOzonePlatform() &&
+      ui::OzonePlatform::GetPlatformNameForTest() != "x11") {
+    EXPECT_EQ("foo", class_name);
+  } else {
+    EXPECT_EQ("Foo", class_name);
+  }
+#else
+  EXPECT_EQ("foo", class_name);
+#endif
+}
+
 TEST(ShellIntegrationTest, WmClass) {
   base::CommandLine command_line((base::FilePath()));
   EXPECT_EQ("foo", internal::GetProgramClassName(command_line, "foo.desktop"));
-  EXPECT_EQ("Foo", internal::GetProgramClassClass(command_line, "foo.desktop"));
+  CheckProgramClassClass(
+      internal::GetProgramClassClass(command_line, "foo.desktop"));
 
   command_line.AppendSwitchASCII("class", "baR");
   EXPECT_EQ("foo", internal::GetProgramClassName(command_line, "foo.desktop"));
@@ -595,18 +611,8 @@
   command_line.AppendSwitchASCII("user-data-dir", "/tmp/baz");
   EXPECT_EQ("foo (/tmp/baz)",
             internal::GetProgramClassName(command_line, "foo.desktop"));
-#if defined(USE_OZONE)
-  if (features::IsUsingOzonePlatform() &&
-      ui::OzonePlatform::GetPlatformNameForTest() != "x11") {
-    EXPECT_EQ("foo",
-              internal::GetProgramClassClass(command_line, "foo.desktop"));
-  } else {
-    EXPECT_EQ("Foo",
-              internal::GetProgramClassClass(command_line, "foo.desktop"));
-  }
-#else
-  EXPECT_EQ("foo", internal::GetProgramClassClass(command_line, "foo.desktop"));
-#endif
+  CheckProgramClassClass(
+      internal::GetProgramClassClass(command_line, "foo.desktop"));
 }
 
 }  // namespace shell_integration_linux
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
index 1a7658b..186ae04a 100644
--- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
+++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -2023,8 +2023,9 @@
     // Disable mixed content autoupgrading to allow mixed content to load and
     // test that mixed content is recorded correctly on the prerender navigation
     // entry.
-    scoped_feature_list_.InitAndDisableFeature(
-        blink::features::kMixedContentAutoupgrade);
+    scoped_feature_list_.InitWithFeatures(
+        {blink::features::kPrerender2},
+        {blink::features::kMixedContentAutoupgrade});
   }
   ~SecurityStateTabHelperPrerenderTest() override = default;
   SecurityStateTabHelperPrerenderTest(
diff --git a/chrome/browser/ssl/security_state_tab_helper_unittest.cc b/chrome/browser/ssl/security_state_tab_helper_unittest.cc
index cc5eb8c..06afe81 100644
--- a/chrome/browser/ssl/security_state_tab_helper_unittest.cc
+++ b/chrome/browser/ssl/security_state_tab_helper_unittest.cc
@@ -48,7 +48,7 @@
                          content::RenderFrameHost* render_frame_host)
         : content::MockNavigationHandle(url, render_frame_host) {}
 
-    bool IsInMainFrame() override { return is_in_main_frame_; }
+    bool IsInMainFrame() const override { return is_in_main_frame_; }
 
     void set_is_in_main_frame(bool is_in_main_frame) {
       is_in_main_frame_ = is_in_main_frame;
diff --git a/chrome/browser/subresource_redirect/subresource_redirect_observer.cc b/chrome/browser/subresource_redirect/subresource_redirect_observer.cc
index 5d01c57..cdcccf3 100644
--- a/chrome/browser/subresource_redirect/subresource_redirect_observer.cc
+++ b/chrome/browser/subresource_redirect/subresource_redirect_observer.cc
@@ -167,9 +167,7 @@
 SubresourceRedirectObserver::SubresourceRedirectObserver(
     content::WebContents* web_contents)
     : content::WebContentsObserver(web_contents),
-      receivers_(web_contents,
-                 this,
-                 content::WebContentsFrameReceiverSetPassKey()) {
+      receivers_(web_contents, this) {
   DCHECK(ShouldEnablePublicImageHintsBasedCompression() ||
          ShouldEnableRobotsRulesFetching());
   if (ShouldEnablePublicImageHintsBasedCompression()) {
@@ -217,6 +215,18 @@
   hints_receiver->SetLoggedInState(!is_allowed_by_login_state);
 }
 
+void SubresourceRedirectObserver::BindSubresourceRedirectService(
+    mojo::PendingAssociatedReceiver<mojom::SubresourceRedirectService> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* tab_helper = SubresourceRedirectObserver::FromWebContents(web_contents);
+  if (!tab_helper)
+    return;
+  tab_helper->receivers_.Bind(rfh, std::move(receiver));
+}
+
 void SubresourceRedirectObserver::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
   DCHECK(navigation_handle);
diff --git a/chrome/browser/subresource_redirect/subresource_redirect_observer.h b/chrome/browser/subresource_redirect/subresource_redirect_observer.h
index 5a2ca1d1..0f1c4a9 100644
--- a/chrome/browser/subresource_redirect/subresource_redirect_observer.h
+++ b/chrome/browser/subresource_redirect/subresource_redirect_observer.h
@@ -9,8 +9,8 @@
 #include "chrome/common/subresource_redirect_service.mojom.h"
 #include "components/optimization_guide/content/browser/optimization_guide_decider.h"
 #include "content/public/browser/render_document_host_user_data.h"
+#include "content/public/browser/render_frame_host_receiver_set.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_contents_receiver_set.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "url/origin.h"
 
@@ -93,6 +93,11 @@
   SubresourceRedirectObserver& operator=(const SubresourceRedirectObserver&) =
       delete;
 
+  static void BindSubresourceRedirectService(
+      mojo::PendingAssociatedReceiver<mojom::SubresourceRedirectService>
+          receiver,
+      content::RenderFrameHost* rfh);
+
  private:
   friend class content::WebContentsUserData<SubresourceRedirectObserver>;
 
@@ -128,7 +133,7 @@
   bool IsAllowedForCurrentLoginState(
       content::NavigationHandle* navigation_handle);
 
-  content::WebContentsFrameReceiverSet<mojom::SubresourceRedirectService>
+  content::RenderFrameHostReceiverSet<mojom::SubresourceRedirectService>
       receivers_;
 
   base::WeakPtrFactory<SubresourceRedirectObserver> weak_factory_{this};
diff --git a/chrome/browser/sync/trusted_vault_client_android.cc b/chrome/browser/sync/trusted_vault_client_android.cc
index 0556ec2..3046b32d 100644
--- a/chrome/browser/sync/trusted_vault_client_android.cc
+++ b/chrome/browser/sync/trusted_vault_client_android.cc
@@ -75,28 +75,29 @@
   std::move(ongoing_fetch_keys.callback).Run(converted_keys);
 }
 
-void TrustedVaultClientAndroid::MarkLocalKeysAsStaleCompleted(JNIEnv* env,
-                                                              jint request_id,
-                                                              jboolean result) {
+void TrustedVaultClientAndroid::MarkLocalKeysAsStaleCompleted(
+    JNIEnv* env,
+    jint request_id,
+    jboolean succeeded) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   OngoingRequest ongoing_request = GetAndUnregisterOngoingRequest(request_id);
 
   std::move(absl::get<OngoingMarkLocalKeysAsStale>(ongoing_request).callback)
-      .Run(!!result);
+      .Run(!!succeeded);
 }
 
 void TrustedVaultClientAndroid::GetIsRecoverabilityDegradedCompleted(
     JNIEnv* env,
     jint request_id,
-    jboolean result) {
+    jboolean is_degraded) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   OngoingRequest ongoing_request = GetAndUnregisterOngoingRequest(request_id);
 
   std::move(
       absl::get<OngoingGetIsRecoverabilityDegraded>(ongoing_request).callback)
-      .Run(!!result);
+      .Run(!!is_degraded);
 }
 
 void TrustedVaultClientAndroid::NotifyKeysChanged(JNIEnv* env) {
diff --git a/chrome/browser/sync/trusted_vault_client_android.h b/chrome/browser/sync/trusted_vault_client_android.h
index cd67723..ff41dd4 100644
--- a/chrome/browser/sync/trusted_vault_client_android.h
+++ b/chrome/browser/sync/trusted_vault_client_android.h
@@ -45,14 +45,14 @@
   // operation previously initiated from C++ and identified by |request_id|.
   void MarkLocalKeysAsStaleCompleted(JNIEnv* env,
                                      jint request_id,
-                                     jboolean result);
+                                     jboolean succeeded);
 
   // Called from Java to notify the completion of a
   // GetIsRecoverabilityDegraded() operation previously initiated from C++ and
   // identified by |request_id|.
   void GetIsRecoverabilityDegradedCompleted(JNIEnv* env,
                                             jint request_id,
-                                            jboolean result);
+                                            jboolean is_degraded);
 
   // Called from Java to notify that the keys in the vault may have changed.
   void NotifyKeysChanged(JNIEnv* env);
diff --git a/chrome/browser/themes/theme_helper.cc b/chrome/browser/themes/theme_helper.cc
index b106199..7f8e263 100644
--- a/chrome/browser/themes/theme_helper.cc
+++ b/chrome/browser/themes/theme_helper.cc
@@ -54,7 +54,7 @@
     case TP::COLOR_TAB_GROUP_DIALOG_GREEN:
     case TP::COLOR_TAB_GROUP_TABSTRIP_FRAME_ACTIVE_GREEN:
     case TP::COLOR_TAB_GROUP_TABSTRIP_FRAME_INACTIVE_GREEN:
-      return {gfx::kGoogleGreen600, gfx::kGoogleGreen300};
+      return {gfx::kGoogleGreen700, gfx::kGoogleGreen300};
     case TP::COLOR_TAB_GROUP_CONTEXT_MENU_PINK:
     case TP::COLOR_TAB_GROUP_DIALOG_PINK:
     case TP::COLOR_TAB_GROUP_TABSTRIP_FRAME_ACTIVE_PINK:
@@ -678,8 +678,6 @@
       return url_color(results_bg_hovered_color());
     case TP::COLOR_OMNIBOX_RESULTS_URL_SELECTED:
       return url_color(results_bg_selected_color());
-    case TP::COLOR_OMNIBOX_RESULTS_SELECTION_INDICATOR:
-      return {{dark ? gfx::kGoogleBlue300 : gfx::kGoogleBlue600, false}};
     case TP::COLOR_OMNIBOX_RESULTS_BUTTON_BORDER:
       return blend_toward_max_contrast(bg, gfx::kGoogleGreyAlpha400);
     case TP::COLOR_OMNIBOX_SECURITY_CHIP_DEFAULT:
diff --git a/chrome/browser/themes/theme_helper_win.cc b/chrome/browser/themes/theme_helper_win.cc
index aa5ec79..a8c508d 100644
--- a/chrome/browser/themes/theme_helper_win.cc
+++ b/chrome/browser/themes/theme_helper_win.cc
@@ -211,7 +211,6 @@
     case ThemeProperties::COLOR_OMNIBOX_RESULTS_TEXT_DIMMED_SELECTED:
     case ThemeProperties::COLOR_OMNIBOX_RESULTS_ICON_SELECTED:
     case ThemeProperties::COLOR_OMNIBOX_RESULTS_URL_SELECTED:
-    case ThemeProperties::COLOR_OMNIBOX_RESULTS_SELECTION_INDICATOR:
       system_theme_color = ui::NativeTheme::SystemThemeColor::kHighlightText;
       break;
 
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h
index 8b1284a..55fcac8 100644
--- a/chrome/browser/themes/theme_properties.h
+++ b/chrome/browser/themes/theme_properties.h
@@ -221,7 +221,6 @@
     COLOR_OMNIBOX_RESULTS_ICON_SELECTED,
     COLOR_OMNIBOX_RESULTS_URL,
     COLOR_OMNIBOX_RESULTS_URL_SELECTED,
-    COLOR_OMNIBOX_RESULTS_SELECTION_INDICATOR,
     COLOR_OMNIBOX_RESULTS_BUTTON_BORDER,
     COLOR_OMNIBOX_BUBBLE_OUTLINE,
     COLOR_OMNIBOX_BUBBLE_OUTLINE_EXPERIMENTAL_KEYWORD_MODE,
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
index 5abbccc..092dcb44 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Споделяне</translation>
 <translation id="2195339740518523951">Получете най-високото ниво на сигурност на Chrome</translation>
 <translation id="2200113223741723867">Управление на споделянето на данни за употребата</translation>
+<translation id="2218567645332692482">Надстройва трафика до HTTPS и ви предупреждава, преди да бъдат заредени сайтове, които не поддържат този протокол</translation>
 <translation id="2227444325776770048">Продължаване като <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Празен прозорец</translation>
 <translation id="2239812875700136898">Контролирайте материалите от бутона „Опции за Discover“</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">изчаква</translation>
 <translation id="8970887620466824814">Нещо се обърка.</translation>
 <translation id="8972098258593396643">Да се изтегли ли файлът в стандартната папка?</translation>
+<translation id="8987641763863173640">Управление на настройките за визуализация на видеоклиповете</translation>
 <translation id="8988028529677883095">Използване на телефон като ключ за сигурност</translation>
 <translation id="8993760627012879038">Отваряне на нов раздел в режим „инкогнито“</translation>
 <translation id="8996847606757455498">Избиране на друг доставчик</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
index 3734423..b6194a0 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Dijeljenje</translation>
 <translation id="2195339740518523951">Odaberite maksimalnu sigurnost koju nudi Chrome</translation>
 <translation id="2200113223741723867">Upravljajte dijeljenjem podataka o korištenju</translation>
+<translation id="2218567645332692482">Navigacija se nadograđuje na HTTPS i prikazuje se upozorenje prije učitavanja web-lokacija koje ga ne podržavaju</translation>
 <translation id="2227444325776770048">Nastavite kao <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Prazan prozor</translation>
 <translation id="2239812875700136898">Kontrolirajte priče pomoću dugmeta Opcije za Discover</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">na čekanju</translation>
 <translation id="8970887620466824814">Nešto nije uredu.</translation>
 <translation id="8972098258593396643">Želite li preuzeti u zadanu mapu?</translation>
+<translation id="8987641763863173640">Upravljanje postavkama pregleda videozapisa</translation>
 <translation id="8988028529677883095">Koristite telefon kao sigurnosni ključ</translation>
 <translation id="8993760627012879038">Otvori novu karticu u anonimnom načinu rada</translation>
 <translation id="8996847606757455498">Odaberite drugog pružaoca</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
index 62915f9..b9b3df7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Compartició</translation>
 <translation id="2195339740518523951">Obtén la seguretat més efectiva de Chrome</translation>
 <translation id="2200113223741723867">Gestiona la compartició de les dades d'ús</translation>
+<translation id="2218567645332692482">Actualitza les navegacions a HTTPS i t'avisa abans de carregar llocs web que no l'admeten</translation>
 <translation id="2227444325776770048">Continua com a <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Finestra buida</translation>
 <translation id="2239812875700136898">Controla les teves històries amb el botó Opcions per a Discover</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">pendent</translation>
 <translation id="8970887620466824814">S'ha produït un error.</translation>
 <translation id="8972098258593396643">Vols baixar el fitxer a la carpeta predeterminada?</translation>
+<translation id="8987641763863173640">Gestiona la configuració de la previsualització de vídeos</translation>
 <translation id="8988028529677883095">Fes servir el telèfon com a clau de seguretat</translation>
 <translation id="8993760627012879038">Obre una pestanya nova en mode d'incògnit</translation>
 <translation id="8996847606757455498">Tria un altre proveïdor</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index eb71e11c3..28c6023 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Sharing</translation>
 <translation id="2195339740518523951">Get Chrome’s strongest security</translation>
 <translation id="2200113223741723867">Manage usage data sharing</translation>
+<translation id="2218567645332692482">Upgrade navigations to HTTPS and warn you before loading sites that don’t support it</translation>
 <translation id="2227444325776770048">Continue as <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Empty window</translation>
 <translation id="2239812875700136898">Control your stories from the 'Options for Discover' button</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">pending</translation>
 <translation id="8970887620466824814">Something went wrong.</translation>
 <translation id="8972098258593396643">Download to default folder?</translation>
+<translation id="8987641763863173640">Manage video preview settings</translation>
 <translation id="8988028529677883095">Use phone as a security key</translation>
 <translation id="8993760627012879038">Open a new tab in Incognito mode</translation>
 <translation id="8996847606757455498">Choose another provider</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
index 069687b..d0f1c400 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Jagamine</translation>
 <translation id="2195339740518523951">Hankige Chrome'i parim turvatase</translation>
 <translation id="2200113223741723867">Kasutusandmete jagamise haldamine</translation>
+<translation id="2218567645332692482">Navigeerimisel kasutatakse HTTPS-protokolli ja teid hoiatatakse enne HTTPS-toeta saitide laadimist</translation>
 <translation id="2227444325776770048">Jätka kasutajana <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Tühi aken</translation>
 <translation id="2239812875700136898">Hallake oma lugusid funktsiooni Discover nupuga Valikud</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">ootel</translation>
 <translation id="8970887620466824814">Midagi läks valesti.</translation>
 <translation id="8972098258593396643">Kas soovite alla laadida vaikekausta?</translation>
+<translation id="8987641763863173640">Videoeelvaate seadete haldamine</translation>
 <translation id="8988028529677883095">Kasutage oma telefoni turvavõtmena</translation>
 <translation id="8993760627012879038">Uue vahelehe avamine inkognito režiimis</translation>
 <translation id="8996847606757455498">Valige teine teenusepakkuja</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
index f3aede3..2e170bc 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">Buscar rapidamente coa voz. Para editar este atallo, mantén premido o botón.</translation>
 <translation id="1028699632127661925">Enviando pestana a <ph name="DEVICE_NAME" />…</translation>
 <translation id="103269572468856066">Queres borrar tamén os datos destes sitios e aplicacións?</translation>
+<translation id="1034259925032978114">A ventá está aberta</translation>
 <translation id="1036348656032585052">Desactivar</translation>
 <translation id="1036727731225946849">Engadindo <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1045899828449635435">Queres borrar tamén os datos destes sitios?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">Goza da máxima seguranza de Chrome</translation>
 <translation id="2200113223741723867">Xestionar uso compartido dos datos de uso</translation>
 <translation id="2227444325776770048">Continuar como <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">Ventá baleira</translation>
 <translation id="2239812875700136898">Fai clic no botón Opcións de Discover e controla as túas historias</translation>
 <translation id="2259659629660284697">Exportar contrasinais…</translation>
 <translation id="2276696007612801991">Inicia sesión na túa Conta de Google para comprobar os teus contrasinais</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Páxina de inicio de Chrome</translation>
 <translation id="3157842584138209013">Comproba a cantidade de datos que aforraches a través do botón Máis opcións</translation>
 <translation id="3166827708714933426">Atallos da ventá e da pestana</translation>
+<translation id="316694332262407393">Chrome xa se está executando aquí.</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">Xa case está!</translation>
 <translation id="3207960819495026254">Engadida a marcadores</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">Axudar a mellorar a seguranza na Web</translation>
 <translation id="3602290021589620013">Previsualizar</translation>
 <translation id="3616113530831147358">Audio</translation>
+<translation id="3622349720008044802">Xestionar as ventás</translation>
 <translation id="3631987586758005671">Compartindo co dispositivo <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Mostra o contrasinal</translation>
 <translation id="363596933471559332">Iniciar sesión automaticamente nos sitios web coas credenciais almacenadas. Cando a función estea desactivada, solicitaráseche sempre a verificación antes de iniciar sesión nun sitio web.</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">Configuración da tradución</translation>
 <translation id="3738139272394829648">Tocar para buscar</translation>
 <translation id="3739899004075612870">Engadiuse aos marcadores en <ph name="PRODUCT_NAME" /></translation>
+<translation id="3740525748616366977">A busca por voz non está dispoñible neste dispositivo</translation>
 <translation id="3749259744154402564">Acción non admitida</translation>
 <translation id="3771001275138982843">Non se puido descargar a actualización</translation>
 <translation id="3771033907050503522">Pestanas de incógnito</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">Datos básicos, así como información sobre os sitios web que visitas e as aplicacións que utilizas</translation>
 <translation id="3775705724665058594">Enviar contido aos teus dispositivos</translation>
 <translation id="3778956594442850293">Engadiuse á pantalla de inicio</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 pestana}other{# pestanas}}</translation>
 <translation id="3803784507854318295">Xestionar reprodución automática</translation>
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3810973564298564668">Xestionar</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">"</translation>
 <translation id="393697183122708255">A busca por voz non está dispoñible</translation>
 <translation id="395377504920307820">Usar sen conta</translation>
+<translation id="3958287878205277013">Para borrar o historial de navegación do modo de incógnito do teu dispositivo, pecha todas as pestanas que teñas abertas nese modo.</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome cargará a páxina cando o dispositivo estea listo}other{Chrome cargará as páxinas cando o dispositivo estea listo}}</translation>
 <translation id="3962957115499249330">Recibirás unha notificación cando se inicie esta descarga a través da conexión wifi.</translation>
 <translation id="3963007978381181125">A encriptación mediante frase de acceso non inclúe métodos de pago nin enderezos de Google Pay. Só alguén coa túa frase de acceso pode ler os teus datos encriptados. A frase de acceso non se envía nin se almacena en Google. Se a esqueces ou se queres cambiar esta opción de configuración, deberás restablecer a sincronización. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 É posible que a túa conta de Google teña outras formas do historial de navegación, como buscas e actividade doutros servizos de Google, en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="4532845899244822526">Selecciona cartafol</translation>
 <translation id="4538018662093857852">Activar modo básico</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> pestana}other{<ph name="TAB_COUNT_MANY" /> pestanas, <ph name="TAB_COUNT_INCOGNITO" /> no modo de incógnito}}</translation>
 <translation id="4550003330909367850">Para ver ou copiar o teu contrasinal aquí, define o bloqueo de pantalla neste dispositivo.</translation>
 <translation id="4554077758708533499">Teléfono conectado mediante un cable USB</translation>
 <translation id="4557685098773234337">Para chegar aquí máis axiña, engádelle esta páxina á pantalla de inicio</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Non se admite este número de instancias de Chrome.</translation>
 <translation id="4908869848243824489">Discover, de Google</translation>
 <translation id="4910889077668685004">Aplicacións de pagos</translation>
+<translation id="4912413785358399818">Mover pestana</translation>
 <translation id="4913161338056004800">Restablecer estatísticas</translation>
 <translation id="4913169188695071480">Deter a actualización</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# páxina}other{# páxinas}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">Permitir</translation>
 <translation id="5054455334322721892">Cando teñas a sesión iniciada, é posible que se garden na túa Conta de Google <ph name="BEGIN_LINK1" />outros datos da túa actividade<ph name="END_LINK1" />. Podes eliminalos en calquera momento.</translation>
 <translation id="5061533557687621530">Para consultar o tempo, toca o micrófono e di o seguinte: "Que tempo hai hoxe?"</translation>
+<translation id="506254248375231072">Ningunha pestana</translation>
 <translation id="5087580092889165836">Engadir tarxeta</translation>
+<translation id="5091199029769593641">Pronto se che mostrarán historias de <ph name="SITE_NAME" /> cando abras unha pestana nova. Os sitios que segues gárdanse na túa conta de Google. Podes xestionalos na configuración de Discover.</translation>
 <translation id="5091249083535528968">Datos de uso ampliados</translation>
 <translation id="509429900233858213">Produciuse un erro.</translation>
 <translation id="510275257476243843">Queda 1 hora</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656">con <ph name="PROVIDER" /></translation>
 <translation id="5456381639095306749">Descargar páxina</translation>
 <translation id="5458366071038729214">Aquí atoparás os sitios que segues</translation>
+<translation id="5468068603361015296">Queres descargar <ph name="FILE_NAME" /> de todas as formas?</translation>
 <translation id="548278423535722844">Abrir na aplicación de mapas</translation>
 <translation id="5483197086164197190">Navega por Chrome</translation>
 <translation id="5487521232677179737">Borrar datos</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos os dereitos reservados.</translation>
 <translation id="5810864297166300463">Asistencia na Web</translation>
 <translation id="5814131985548525293">Para comezar, escribe aquí ou toca a icona de micrófono</translation>
+<translation id="5814749351757353073">Non perdas as novidades dos teus sitios favoritos</translation>
 <translation id="583281660410589416">Descoñecido</translation>
 <translation id="5833984609253377421">Compartir ligazón</translation>
 <translation id="5834764604050996579">Para escanear un código QR, permite que Chrome utilice a cámara</translation>
@@ -824,6 +837,7 @@
 
 Por exemplo, algúns sitios web poden responder a esta solicitude mostrándoche anuncios que non estean baseados noutros sitios web que visitases. Moitos sitios web seguirán recompilando e utilizando os teus datos de navegación para, por exemplo, mellorar a seguranza, fornecer contido, anuncios e recomendacións e para crear estatísticas de informes.</translation>
 <translation id="624789221780392884">Actualización lista</translation>
+<translation id="6264376385120300461">Descargar de todos os modos</translation>
 <translation id="6277522088822131679">Produciuse un problema ao imprimir a páxina. Téntao de novo.</translation>
 <translation id="6278428485366576908">Tema</translation>
 <translation id="6292420053234093573">Ao utilizar Chrome, aceptas as <ph name="BEGIN_LINK1" />Condicións de servizo de Google<ph name="END_LINK1" /> e as <ph name="BEGIN_LINK2" />Condicións de servizo adicionais de Google Chrome e Chrome OS<ph name="END_LINK2" />.</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">Produciuse un erro. Téntao de novo máis tarde.</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{A comprobación realizouse hai 1 hora}other{A comprobación realizouse hai # horas}}</translation>
 <translation id="6545017243486555795">Borrar todos os datos</translation>
+<translation id="6546511553472444032">Pode que o ficheiro sexa daniño</translation>
 <translation id="6560414384669816528">Buscar con Sogou</translation>
 <translation id="656065428026159829">Ver máis</translation>
 <translation id="6565959834589222080">Úsase a conexión wifi cando está dispoñible</translation>
 <translation id="6566259936974865419">Chrome permitiuche aforrar <ph name="GIGABYTES" /> GB</translation>
+<translation id="6569373978618239158">Agora mostraránseche historias de <ph name="SITE_NAME" /> cando abras unha pestana nova. Os sitios que segues gárdanse na túa conta de Google. Podes xestionalos na configuración de Discover.</translation>
 <translation id="6573096386450695060">Permitir sempre</translation>
 <translation id="6573431926118603307">Aquí aparecerán as pestanas que abrises en Chrome noutros dispositivos.</translation>
 <translation id="6583199322650523874">Engadir aos marcadores a páxina actual</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">Saír do modo de incógnito</translation>
 <translation id="6979737339423435258">Desde sempre</translation>
 <translation id="6981982820502123353">Accesibilidade</translation>
+<translation id="6987047470128880212">O modo de incógnito non está dispoñible neste dispositivo</translation>
 <translation id="6989267951144302301">Non se puido descargar</translation>
 <translation id="6995899638241819463">Avisarte se os teus contrasinais están en risco debido a unha violación da seguranza dos datos</translation>
 <translation id="7001056293070445572">Este ficheiro é grande (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">Pestana de vista previa</translation>
 <translation id="7484997419527351112">Discover: desactivado</translation>
 <translation id="7485033510383818941">Para actualizar o contido do feed, arrastra a páxina cara abaixo</translation>
+<translation id="749294055653435199">Google Lens non está dispoñible neste dispositivo</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (actualizouse <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">datos aforrados</translation>
 <translation id="7498271377022651285">Agarda…</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">A comprobación realizouse agora mesmo</translation>
 <translation id="8040831032425909005">Icona do widget da busca de accións rápidas</translation>
 <translation id="804335162455518893">Non se atopou a tarxeta SD</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> pestana do modo de incógnito}other{<ph name="TAB_COUNT_NORMAL" /> pestanas do modo de incógnito}}</translation>
 <translation id="8051695050440594747">Almacenamento dispoñible: <ph name="MEGABYTES" /> MB</translation>
 <translation id="8058746566562539958">Abrir na pestana de Chrome</translation>
 <translation id="8063895661287329888">Non se puido engadir o marcador.</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">teléfono</translation>
 <translation id="8636825310635137004">Activa a sincronización para sincronizar as pestanas dos demais dispositivos.</translation>
 <translation id="8641930654639604085">Tentar bloquear sitios con contido para adultos</translation>
+<translation id="864544049772947936">Xestionar ventás (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">Podes borrar os datos na configuración de Chrome</translation>
 <translation id="8656747343598256512">Inicia sesión coa túa Conta de Google neste sitio e en Chrome. Podes activar a sincronización máis tarde.</translation>
 <translation id="8659579665266920523">Como facer buscas con Chrome?</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">Imaxes</translation>
 <translation id="926205370408745186">Quitar a túa actividade de Chrome de Benestar dixital</translation>
 <translation id="927968626442779827">Usa o modo básico en Google Chrome</translation>
+<translation id="928550791203542716">Comezaches a seguir <ph name="SITE_NAME" /></translation>
 <translation id="932327136139879170">Inicio</translation>
 <translation id="938850635132480979">Erro: <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">Introducir frase de acceso</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
index e7a8862..60e400f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Dijeljenje</translation>
 <translation id="2195339740518523951">Odaberite najsnažniju Chromeovu zaštitu sigurnosti</translation>
 <translation id="2200113223741723867">Upravljajte dijeljenjem podataka o upotrebi</translation>
+<translation id="2218567645332692482">Navigacija se nadograđuje na HTTPS i prikazuje se upozorenje prije učitavanja web-lokacija koje ga ne podržavaju</translation>
 <translation id="2227444325776770048">Nastavite kao <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Prazan prozor</translation>
 <translation id="2239812875700136898">Člancima možete upravljati pomoću gumba Opcije za Discover</translation>
@@ -1294,6 +1295,7 @@
 <translation id="8965591936373831584">na čekanju</translation>
 <translation id="8970887620466824814">Nešto nije u redu.</translation>
 <translation id="8972098258593396643">Želite li preuzeti u zadanu mapu?</translation>
+<translation id="8987641763863173640">Upravljanje postavkama pregleda videozapisa</translation>
 <translation id="8988028529677883095">Upotreba telefona kao sigurnosnog ključa</translation>
 <translation id="8993760627012879038">Otvaranje nove kartice u anonimnom načinu</translation>
 <translation id="8996847606757455498">Odaberi drugog davatelja usluga</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
index 069ed79..cd8c1e138 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">Արագ որոնեք ձայնային հրահանգների օգնությամբ։ Այս դյուրանցումը փոփոխելու համար հպեք դրան և պահեք։</translation>
 <translation id="1028699632127661925">Ուղարկվում է <ph name="DEVICE_NAME" /> սարքին...</translation>
 <translation id="103269572468856066">Մաքրե՞լ այս տվյալները</translation>
+<translation id="1034259925032978114">Պատուհանը բաց է</translation>
 <translation id="1036348656032585052">Անջատել</translation>
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" />-ն ավելացվում է...</translation>
 <translation id="1045899828449635435">Մաքրե՞լ այս տվյալները</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">Ուժեղացրեք Chrome-ի անվտանգությունը</translation>
 <translation id="2200113223741723867">Կառավարել օգտագործման տվյալների տրամադրումը</translation>
 <translation id="2227444325776770048">Շարունակել որպես <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">Դատարկ պատուհան</translation>
 <translation id="2239812875700136898">Կառավարեք ձեր պատմությունները «Discover-ի ընտրանքներ» կոճակի օգնությամբ</translation>
 <translation id="2259659629660284697">Գաղտնաբառերի արտահանում…</translation>
 <translation id="2276696007612801991">Մտեք Google հաշիվ՝ ձեր գաղտնաբառերը ստուգելու համար</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Chrome-ի գլխավոր էջ</translation>
 <translation id="3157842584138209013">«Այլ ընտրանքներ» կոճակի միջոցով դիտեք պահված տվյալների ծավալը</translation>
 <translation id="3166827708714933426">Ներդիրների և պատուհանների դյուրանցումներ</translation>
+<translation id="316694332262407393">Chrome-ն արդեն գործարկված է։</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">Գրեթե ավարտված է:</translation>
 <translation id="3207960819495026254">Էջանշված է</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">Օգնեք բարելավել անվտանգությունը</translation>
 <translation id="3602290021589620013">Նախադիտում</translation>
 <translation id="3616113530831147358">Աուդիո</translation>
+<translation id="3622349720008044802">Կառավարել պատուհանները</translation>
 <translation id="3631987586758005671">Ուղարկվում է <ph name="DEVICE_NAME" /> սարքին</translation>
 <translation id="3632295766818638029">Ցուցադրել գաղտնաբառը</translation>
 <translation id="363596933471559332">Ավտոմատ կերպով մուտք գործել կայքեր՝ պահված մուտքային տվյալների օգնությամբ: Եթե այս գործառույթն անջատված է, ապա ամեն անգամ կայք մտնելիս ձեզանից կպահանջվի հաստատում:</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">Թարգմանության կարգավորումներ</translation>
 <translation id="3738139272394829648">Հպեք` որոնելու համար</translation>
 <translation id="3739899004075612870">Էջանշվեց <ph name="PRODUCT_NAME" />-ում</translation>
+<translation id="3740525748616366977">Ձայնային որոնումը հասանելի չէ այս սարքում</translation>
 <translation id="3749259744154402564">Չի աջակցվում</translation>
 <translation id="3771001275138982843">Չհաջողվեց ներբեռնել թարմացումը</translation>
 <translation id="3771033907050503522">Ինկոգնիտո ներդիրներ</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">Հիմնական տվյալներ, ինչպես նաև տեղեկություններ ձեր այցելած կայքերի և օգտագործած հավելվածների մասին</translation>
 <translation id="3775705724665058594">Ուղարկել սարքերին</translation>
 <translation id="3778956594442850293">Ավելացվեց հիմնական էկրանին</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 ներդիր}one{# ներդիր}other{# ներդիր}}</translation>
 <translation id="3803784507854318295">Կառավարել ավտոմատ նվագարկումը</translation>
 <translation id="3810838688059735925">Տեսանյութ</translation>
 <translation id="3810973564298564668">Կառավարել</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">«</translation>
 <translation id="393697183122708255">Մատչելի միացված ձայնային որոնում չկա</translation>
 <translation id="395377504920307820">Օգտագործել առանց հաշվի</translation>
+<translation id="3958287878205277013">Փակեք բոլոր ինկոգնիտո ներդիրները՝ ինկոգնիտո ռեժիմում այցելությունների պատմությունը սարքից հեռացնելու համար։</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{էջը կբեռնվի, երբ սարքը միացած լինի ցանցին}one{էջը կբեռնվի, երբ սարքը միացած լինի ցանցին}other{էջերը կբեռնվեն, երբ սարքը միացած լինի ցանցին}}</translation>
 <translation id="3962957115499249330">Դուք ծանուցում կտեսնեք, երբ այս ներբեռնումը սկսվի Wi-Fi ցանցի միջոցով։</translation>
 <translation id="3963007978381181125">Անցաբառով գաղտնագրումը չի կիրառվում վճարման եղանակների և Google Pay-ի հասցեների համար։ Միայն ձեր անցաբառն ունեցող օգտատերը կարող է կարդալ ձեր գաղտնագրված տվյալները: Անցաբառը չի ուղարկվում Google-ին և չի պահվում դրա կողմից: Անցաբառը մոռանալու դեպքում ձեզ անհրաժեշտ կլինի վերակայել համաժամացումը: <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 Այցելությունների պատմությունը կարող է պահվել նաև ձեր Google հաշվում, օրինակ՝ որոնումների և Google-ի ծառայություններում ձեր գործողությունների տեսքով: Այդ տվյալները կարող եք գտնել <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> էջում:</translation>
 <translation id="4532845899244822526">Պանակի ընտրություն</translation>
 <translation id="4538018662093857852">Միացնել Lite ռեժիմը</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> ներդիր}one{<ph name="TAB_COUNT_MANY" /> ներդիր, <ph name="TAB_COUNT_INCOGNITO" /> ինկոգնիտո ներդիր}other{<ph name="TAB_COUNT_MANY" /> ներդիր, <ph name="TAB_COUNT_INCOGNITO" /> ինկոգնիտո ներդիր}}</translation>
 <translation id="4550003330909367850">Ձեր գաղտնաբառն այստեղ տեսնելու կամ պատճենելու համար այս սարքում միացրեք էկրանի կողպումը:</translation>
 <translation id="4554077758708533499">Միացված է USB մալուխով</translation>
 <translation id="4557685098773234337">Այս կայքն ավելի արագ բացելու համար ավելացրեք այն հիմնական էկրանին</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Chrome-ի բացված էջերի թիվը չի աջակցվում:</translation>
 <translation id="4908869848243824489">Discover by Google</translation>
 <translation id="4910889077668685004">Հավելվածներ վճարումների համար</translation>
+<translation id="4912413785358399818">Տեղափոխել ներդիրը</translation>
 <translation id="4913161338056004800">Վերակայել վիճակագրությունը</translation>
 <translation id="4913169188695071480">Դադարեցնել թարմացումը</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# էջ}one{# էջ}other{# էջ}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">Թույլ տալ</translation>
 <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Այլ գործողություններ<ph name="END_LINK1" /> կարող են պահվել ձեր Google հաշվում, երբ դուք մուտք եք գործում։ Դրանք ցանկացած ժամանակ հնարավոր է ջնջել։</translation>
 <translation id="5061533557687621530">Եղանակի մասին տեղեկանալու համար հպեք խոսափողին և ասեք․ «What’s the weather today?» (Ի՞նչ եղանակ է այսօր)։</translation>
+<translation id="506254248375231072">Ներդիրներ չկան</translation>
 <translation id="5087580092889165836">Ավելացնել քարտ</translation>
+<translation id="5091199029769593641">Շուտով, երբ նոր ներդիր բացեք, կտեսնեք նորություններ <ph name="SITE_NAME" /> կայքից։ Կայքերը, որոնց բաժանորդագրվում եք, պահվում են ձեր Google հաշվում։ Դրանք կարող եք կառավարել «Բացահայտեք» ներդիրի կարգավորումներում:</translation>
 <translation id="5091249083535528968">Օգտագործման լրացուցիչ տվյալներ</translation>
 <translation id="509429900233858213">Սխալ առաջացավ:</translation>
 <translation id="510275257476243843">Մնացել է 1 ժամ</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656"><ph name="PROVIDER" />-ի հետ</translation>
 <translation id="5456381639095306749">Ներբեռնել էջը</translation>
 <translation id="5458366071038729214">Կայքերը, որոնց հետևում եք, կցուցադրվեն այստեղ</translation>
+<translation id="5468068603361015296">Միևնույն է ներբեռնե՞լ <ph name="FILE_NAME" /> ֆայլը։</translation>
 <translation id="548278423535722844">Բացեք Քարտեզներ հավելվածում</translation>
 <translation id="5483197086164197190">Նավիգացիա Chrome-ում</translation>
 <translation id="5487521232677179737">Ջնջել տվյալները</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">© Google LLC <ph name="YEAR" />։ Բոլոր իրավունքները պահպանված են:</translation>
 <translation id="5810864297166300463">Օգնություն համացանցում աշխատելիս</translation>
 <translation id="5814131985548525293">Սկսելու համար հպեք այստեղ կամ ձայնի պատկերակին</translation>
+<translation id="5814749351757353073">Բաժանորդագրվեք ձեր սիրած կայքերին</translation>
 <translation id="583281660410589416">Անհայտ</translation>
 <translation id="5833984609253377421">Կիսվել հղումով</translation>
 <translation id="5834764604050996579">QR կոդը սկանավորելու համար թույլ տվեք Chrome-ին օգտագործել ձեր տեսախցիկը</translation>
@@ -824,6 +837,7 @@
 
 Օրինակ, որոշ վեբկայքեր կարող են այս հարցմանը պատասխանել՝ ներկայացնելով գովազդ, որը հիմնված չէ ձեր այցելությունների վրա: Շատ վեբկայքեր կշարունակեն հավաքել և օգտագործել ձեր այցելությունների պատմությունը: Այն կարող է օգտագործվել, օրինակ, անվտանգությունը բարելավելու, բովանդակություն, գովազդ և խորհուրդներ տրամադրելու և վիճակագրական տվյալներ հավաքելու նպատակով:</translation>
 <translation id="624789221780392884">Թարմացումը պատրաստ է</translation>
+<translation id="6264376385120300461">Ներբեռնել</translation>
 <translation id="6277522088822131679">Այս էջը տպելիս խնդիր առաջացավ: Նորից փորձեք:</translation>
 <translation id="6278428485366576908">Թեմա</translation>
 <translation id="6292420053234093573">Օգտվելով Chrome-ից՝ դուք ընդունում եք <ph name="BEGIN_LINK1" />Google-ի օգտագործման պայմանները<ph name="END_LINK1" /> և <ph name="BEGIN_LINK2" />Google Chrome-ի և Chrome OS-ի օգտագործման լրացուցիչ պայմանները<ph name="END_LINK2" />։</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">Սխալ առաջացավ: Փորձեք ավելի ուշ:</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Ստուգվել է 1 ժամ առաջ}one{Ստուգվել է # ժամ առաջ}other{Ստուգվել է # ժամ առաջ}}</translation>
 <translation id="6545017243486555795">Մաքրել բոլոր տվյալները</translation>
+<translation id="6546511553472444032">Ֆայլը կարող է վտանգավոր լինել</translation>
 <translation id="6560414384669816528">Որոնել Sogou որոնման համակարգով</translation>
 <translation id="656065428026159829">Տեսնել ավելին</translation>
 <translation id="6565959834589222080">Wi-Fi ցանցը օգտագործվում է հասանելի լինելու դեպքում</translation>
 <translation id="6566259936974865419">Chrome-ը խնայել է <ph name="GIGABYTES" /> ԳԲ տարածք</translation>
+<translation id="6569373978618239158">Այժմ, երբ նոր ներդիր բացեք, կտեսնեք նորություններ <ph name="SITE_NAME" /> կայքից։ Կայքերը, որոնց բաժանորդագրվում եք, պահվում են ձեր Google հաշվում։ Դրանք կարող եք կառավարել «Բացահայտեք» ներդիրի կարգավորումներում:</translation>
 <translation id="6573096386450695060">Միշտ թույլատրել</translation>
 <translation id="6573431926118603307">Ձեր մյուս սարքերում Chrome-ով բացված ներդիրները կտեսնեք այստեղ:</translation>
 <translation id="6583199322650523874">Էջանշել ընթացիկ էջը</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">Դուրս գալ ինկոգնիտո ռեժիմից</translation>
 <translation id="6979737339423435258">Ամբողջ ժամանակաշրջանի</translation>
 <translation id="6981982820502123353">Մատչելիությունը</translation>
+<translation id="6987047470128880212">Ինկոգնիտո ռեժիմը հասանելի չէ այս սարքում</translation>
 <translation id="6989267951144302301">Չհաջողվեց ներբեռնել</translation>
 <translation id="6995899638241819463">Զգուշացնել, եթե տվյալների արտահոսքի արդյունքում իմ գաղտնաբառերը հայտնի դառնան կողմնակի անձանց</translation>
 <translation id="7001056293070445572">Ֆայլը մեծ է (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">Նախադիտման ներդիր</translation>
 <translation id="7484997419527351112">Discover – անջատված է</translation>
 <translation id="7485033510383818941">Ֆիդի բովանդակությունը թարմացնելու համար էջը ներքև քաշեք</translation>
+<translation id="749294055653435199">Google Տեսապակին հասանելի չէ այս սարքում</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (Թարմացվել է <ph name="TIME_SINCE_UPDATE" />-ին)</translation>
 <translation id="7494974237137038751">խնայվել է</translation>
 <translation id="7498271377022651285">Սպասեք…</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">Ստուգվել է հենց նոր</translation>
 <translation id="8040831032425909005">Արագ գործողությունների վահանակում որոնման վիջեթի պատկերակ</translation>
 <translation id="804335162455518893">SD քարտը չհաջողվեց գտնել</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> ինկոգնիտո ներդիր}one{<ph name="TAB_COUNT_NORMAL" /> ինկոգնիտո ներդիր}other{<ph name="TAB_COUNT_NORMAL" /> ինկոգնիտո ներդիր}}</translation>
 <translation id="8051695050440594747">Հասանելի է <ph name="MEGABYTES" /> ՄԲ</translation>
 <translation id="8058746566562539958">Բացել Chrome-ի նոր ներդիրում</translation>
 <translation id="8063895661287329888">Չհաջողվեց ավելացնել էջանիշը:</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">հեռախոս</translation>
 <translation id="8636825310635137004">Ձեր մյուս սարքերում եղած ներդիրներն օգտագործելու համար միացրեք համաժամացումը:</translation>
 <translation id="8641930654639604085">Արգելափակել մեծահասակների համար նախատեսված կայքերը</translation>
+<translation id="864544049772947936">Կառավարել պատուհանները (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">Տվյալները կարող եք ջնջել Chrome-ի կարգավորումներում</translation>
 <translation id="8656747343598256512">Մուտք գործեք այս կայքում և Chrome-ում ձեր Google հաշվով։ Համաժամացումը կարող եք ավելի ուշ միացնել։</translation>
 <translation id="8659579665266920523">Ինչպես որոնել Chrome-ի միջոցով</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">Պատկերներ</translation>
 <translation id="926205370408745186">Հեռացրեք Chrome-ի պատմությունը Թվային բարեկեցությունից</translation>
 <translation id="927968626442779827">Փորձեք Lite ռեժիմը Google Chrome-ում</translation>
+<translation id="928550791203542716">Դուք բաժանորդագրվեցիք <ph name="SITE_NAME" /> կայքին</translation>
 <translation id="932327136139879170">Գլխավոր էջ</translation>
 <translation id="938850635132480979">Սխալ՝ <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">Մուտքագրեք անցաբառը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
index 7a7eb5a..0ae0a952 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">სწრაფად მოიძიეთ ხმის მეშვეობით. ამ მალსახმობის რედაქტირებისთვის შეეხეთ ხანგრძლივად.</translation>
 <translation id="1028699632127661925">იგზავნება <ph name="DEVICE_NAME" />-ზე…</translation>
 <translation id="103269572468856066">ამ საიტებისა და აპების მონაცემთა გასუფთავებაც გსურთ?</translation>
+<translation id="1034259925032978114">ფანჯარა გახსნილია</translation>
 <translation id="1036348656032585052">გამორთვა</translation>
 <translation id="1036727731225946849">მიმდინარეობს <ph name="WEBAPK_NAME" />-ის დამატება...</translation>
 <translation id="1045899828449635435">ამ საიტების მონაცემთა გასუფთავებაც გსურთ?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">ისარგებლეთ Chrome-ის უსაფრთხოების ყველაზე ძლიერი ფუნქციებით</translation>
 <translation id="2200113223741723867">გამოყენების მონაცემების გაზიარების მართვა</translation>
 <translation id="2227444325776770048">გაგრძელება, როგორც <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">ცარიელი ფანჯარა</translation>
 <translation id="2239812875700136898">მართეთ ამბები „Discover-ის ვარიანტების“ ღილაკის მეშვეობით</translation>
 <translation id="2259659629660284697">პაროლების ექსპორტი…</translation>
 <translation id="2276696007612801991">პაროლების შესამოწმებლად შედით თქვენს Google ანგარიშში</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Chrome-ის მთავარი გვერდი</translation>
 <translation id="3157842584138209013">იხილეთ თქვენ მიერ დაზოგილი მონაცემების მოცულობა „დამატებითი ვარიანტების“ ღილაკის მეშვეობით</translation>
 <translation id="3166827708714933426">ჩანართებისა და ფანჯრების მალსახმობები</translation>
+<translation id="316694332262407393">Chrome აქ უკვე გაშვებულია.</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">ყველაფერი თითქმის მზად არის!</translation>
 <translation id="3207960819495026254">ჩანიშნულია</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">გააუმჯობესეთ ვების უსაფრთხოება</translation>
 <translation id="3602290021589620013">გადახედვა</translation>
 <translation id="3616113530831147358">აუდიო</translation>
+<translation id="3622349720008044802">მართეთ ფანჯრები</translation>
 <translation id="3631987586758005671">მიმდინარეობს გაზიარება <ph name="DEVICE_NAME" />-თან</translation>
 <translation id="3632295766818638029">პაროლის გამოჩენა</translation>
 <translation id="363596933471559332">ავტორიზაციის შენახული მონაცემების მეშვეობით ვებსაიტებში ავტომატური შესვლა. ამ ფუნქციის გამორთვის შემთხვევაში, ვებსაიტში შესვლის ყოველი მცდელობისას დადასტურება მოგიწევთ.</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">თარგმნის პარამეტრები</translation>
 <translation id="3738139272394829648">შეეხეთ ეკრანს ძიების დასაწყებად</translation>
 <translation id="3739899004075612870">სანიშნე შენახულია „<ph name="PRODUCT_NAME" />“-ში</translation>
+<translation id="3740525748616366977">ამ მოწყობილობაზე ხმოვანი ძიება მიუწვდომელია</translation>
 <translation id="3749259744154402564">მხარდაუჭერელი</translation>
 <translation id="3771001275138982843">განახლების ჩამოტვირთვა ვერ მოხერხდა</translation>
 <translation id="3771033907050503522">ინკოგნიტო ჩანართები</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">ძირითადი მონაცემები, პლუს ინფორმაცია თქვენ მიერ მონახულებული ვებსაიტებისა და გამოყენებული აპების შესახებ</translation>
 <translation id="3775705724665058594">გააგზავნეთ თქვენს მოწყობილობებზე</translation>
 <translation id="3778956594442850293">დაემატა მთავარ ეკრანს</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 ჩანართი}other{# ჩანართი}}</translation>
 <translation id="3803784507854318295">ავტომატური დაკვრის მართვა</translation>
 <translation id="3810838688059735925">ვიდეო</translation>
 <translation id="3810973564298564668">მართვა</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">„</translation>
 <translation id="393697183122708255">ჩართული ხმოვანი ძიება მიუწვდომელია</translation>
 <translation id="395377504920307820">ანგარიშის გარეშე გამოყენება</translation>
+<translation id="3958287878205277013">თქვენი მოწყობილობიდან ინკოგნიტო რეჟიმში დათვალიერების ისტორია რომ წაშალოთ, დახურეთ ყველა ინკოგნიტო ჩანართი.</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome ჩატვირთავს თქვენს გვერდს, როცა ის მზად იქნება}other{Chrome ჩატვირთავს თქვენს გვერდებს, როცა ისინი მზად იქნება}}</translation>
 <translation id="3962957115499249330">Wi-Fi კავშირით ჩამოტვირთვის დაწყების შესახებ შეტყობინებას მიიღებთ.</translation>
 <translation id="3963007978381181125">საიდუმლო ფრაზით დაშიფვრა არ მოიცავს Google Pay-ში შენახულ გადახდის მეთოდებსა და მისამართებს. თქვენი დაშიფრული მონაცემების წაკითხვა შეუძლია მხოლოდ მას, ვინც იცის თქვენი საიდუმლო ფრაზა. საიდუმლო ფრაზა არ იგზავნება Google-ში და არ ინახება მის მიერ. საიდუმლო ფრაზის დავიწყების ან ამ პარამეტრის შეცვლის შემთხვევაში, სინქრონიზაციის გადაყენება მოგიწევთ. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 თქვენს Google ანგარიშში შეიძლება შენახული იყოს სხვა ტიპის დათვალიერების ისტორია (მაგალითად, ძიებები და აქტივობა Google-ის სხვა სერვისებზე), რომელიც ხელმისაწვდომია მისამართზე: <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="4532845899244822526">აირჩიეთ საქაღალდე</translation>
 <translation id="4538018662093857852">Lite რეჟიმის ჩართვა</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> ჩანართი}other{<ph name="TAB_COUNT_MANY" /> ჩანართი, <ph name="TAB_COUNT_INCOGNITO" /> ინკოგნიტო}}</translation>
 <translation id="4550003330909367850">თქვენი პაროლის აქ სანახავად ან დასაკოპირებლად დააყენეთ ეკრანის დაბლოკვის მეთოდი ამ მოწყობილობაზე.</translation>
 <translation id="4554077758708533499">დაკავშირებულია USB კაბელით</translation>
 <translation id="4557685098773234337">აქ სწრაფად რომ დაბრუნდეთ ხოლმე, დაამატეთ ეს გვერდი თქვენს მთავარ ეკრანს</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Chrome-ის ეგზემპლარების მხარდაუჭერელი რაოდენობა.</translation>
 <translation id="4908869848243824489">Discover by Google</translation>
 <translation id="4910889077668685004">გადახდის აპები</translation>
+<translation id="4912413785358399818">ჩანართის გადატანა</translation>
 <translation id="4913161338056004800">სტატისტიკის გადაყენება</translation>
 <translation id="4913169188695071480">განახლების შეწყვეტა</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# გვერდი}other{# გვერდი}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">დაშვება</translation>
 <translation id="5054455334322721892">თქვენს Google ანგარიშში შეიძლება ინახებოდეს <ph name="BEGIN_LINK1" />სხვა ტიპის აქტივობა<ph name="END_LINK1" />, როცა შესული ხართ სისტემაში. აღნიშნულის წაშლა ნებისმიერ დროს შეგიძლიათ.</translation>
 <translation id="5061533557687621530">ამინდის პროგნოზის გასაცნობად შეეხეთ მიკროფონს და თქვით: „რა ამინდია დღეს?“</translation>
+<translation id="506254248375231072">ჩანართები არ არის</translation>
 <translation id="5087580092889165836">ბარათის დამატება</translation>
+<translation id="5091199029769593641">მალე, ახალი ჩანართის გახსნისას, იხილავთ ამბებს <ph name="SITE_NAME" />-დან. თქვენ მიერ თვალმიდევნებული საიტები შეინახება თქვენს Google ანგარიშში. მათი მართვა Discover-ის პარამეტრებიდან შეგიძლიათ.</translation>
 <translation id="5091249083535528968">გამოყენების გაფართოებული მონაცემები</translation>
 <translation id="509429900233858213">შეცდომა მოხდა.</translation>
 <translation id="510275257476243843">დარჩენილია 1 საათი</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656"><ph name="PROVIDER" />-ით</translation>
 <translation id="5456381639095306749">გვერდის ჩამოტვირთვა</translation>
 <translation id="5458366071038729214">აქ იპოვით საიტებს, რომლებსაც თვალს ადევნებთ</translation>
+<translation id="5468068603361015296">მაინც გსურთ, ჩამოტვირთოთ <ph name="FILE_NAME" />?</translation>
 <translation id="548278423535722844">რუკების აპში გახსნა</translation>
 <translation id="5483197086164197190">Chrome-ში ნავიგაცია</translation>
 <translation id="5487521232677179737">მონაცემების წაშლა</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">© <ph name="YEAR" />, Google LLC. ყველა უფლება დაცულია.</translation>
 <translation id="5810864297166300463">ვებ-დახმარება</translation>
 <translation id="5814131985548525293">დასაწყებად აკრიფეთ ტექსტი აქ ან შეეხეთ ხმის ხატულას</translation>
+<translation id="5814749351757353073">თვალყური ადევნეთ თქვენს რჩეულ საიტებს</translation>
 <translation id="583281660410589416">უცნობი</translation>
 <translation id="5833984609253377421">ბმულის გაზიარება</translation>
 <translation id="5834764604050996579">QR კოდი რომ დაასკანიროთ, მიანიჭეთ Chrome-ს კამერაზე წვდომის ნებართვა</translation>
@@ -824,6 +837,7 @@
 
 მაგალითად, ზოგიერთი ვებსაიტის რეაგირება შეიძლება გამოიხატოს იმაში, რომ ისინი არ გიჩვენებთ თქვენ მიერ ადრე მონახულებულ ვებსაიტებზე დაფუძნებულ რეკლამას. მრავალი ვებსაიტი მაინც შეაგროვებს და გამოიყენებს თქვენს დათვალიერების მონაცემებს — მაგალითად, უსაფრთხოების გაუმჯობესების, საკუთარ ვებგვერდებზე კონტენტის უზრუნველყოფის, რეკლამისა და რეკომენდაციების ჩვენების, ან ანგარიშგების სტატისტიკის გენერირების მიზნით.</translation>
 <translation id="624789221780392884">განახლება მზადაა</translation>
+<translation id="6264376385120300461">მაინც ჩამოტვირთვა</translation>
 <translation id="6277522088822131679">გვერდის დაბეჭდვისას დაფიქსირდა შეცდომა. გთხოვთ ცადოთ ხელახლა.</translation>
 <translation id="6278428485366576908">თემა</translation>
 <translation id="6292420053234093573">Chrome-ის გამოყენებით ეთანხმებით <ph name="BEGIN_LINK1" />Google-ის მომსახურების პირობებს<ph name="END_LINK1" />, ასევე, <ph name="BEGIN_LINK2" />Google Chrome-ისა და Chrome OS-ის მომსახურების დამატებით პირობებს<ph name="END_LINK2" />.</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">წარმოიქმნა შეფერხება. ცადეთ მოგვიანებით.</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{შემოწმდა 1 საათის წინ}other{შემოწმდა # საათის წინ}}</translation>
 <translation id="6545017243486555795">ყველა მონაცემის გასუფთავება</translation>
+<translation id="6546511553472444032">ფაილი, შესაძლოა, საზიანო იყოს</translation>
 <translation id="6560414384669816528">ძიების Sogou-ს მეშვეობით განხორციელება</translation>
 <translation id="656065428026159829">მეტის ნახვა</translation>
 <translation id="6565959834589222080">ხელმისაწვდომობის მიხედვით გამოიყენება Wi-Fi</translation>
 <translation id="6566259936974865419">Chrome-ის მეშვეობით თქვენ <ph name="GIGABYTES" /> გბაიტი დაზოგეთ</translation>
+<translation id="6569373978618239158">ამიერიდან, ახალი ჩანართის გახსნისას, იხილავთ ამბებს <ph name="SITE_NAME" />-დან. თქვენ მიერ თვალმიდევნებული საიტები შეინახება თქვენს Google ანგარიშში. მათი მართვა Discover-ის პარამეტრებიდან შეგიძლიათ.</translation>
 <translation id="6573096386450695060">ყოველთვის დაშვება</translation>
 <translation id="6573431926118603307">სხვა მოწყობილობებზე თქვენ მიერ Chrome-ით გახსნილი ჩანართები აქ გამოჩნდება.</translation>
 <translation id="6583199322650523874">მიმდინარე გვერდის სანიშნეებში დამატება</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">ინკოგნიტო რეჟიმიდან გამოსვლა</translation>
 <translation id="6979737339423435258">ყველა დროის</translation>
 <translation id="6981982820502123353">სპეციალური შესაძლებლობები</translation>
+<translation id="6987047470128880212">ინკოგნიტო რეჟიმი ამ მოწყობილობაზე ხელმისაწვდომი არ არის</translation>
 <translation id="6989267951144302301">ჩამოტვირთვა ვერ მოხერხდა</translation>
 <translation id="6995899638241819463">გაფრთხილების მიღება მონაცემთა გაჟონვისას პაროლების გამოაშკარავების შემთხვევაში</translation>
 <translation id="7001056293070445572">ეს დიდი ზომის ფაილია (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">გადახედვის ჩანართი</translation>
 <translation id="7484997419527351112">Discover — გამორთული</translation>
 <translation id="7485033510383818941">არხის კონტენტი რომ განაახლოთ, ჩამოსწიეთ გვერდი</translation>
+<translation id="749294055653435199">Google Lens მიუწვდომელია ამ მოწყობილობაზე</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (განახლებულია <ph name="TIME_SINCE_UPDATE" /> )</translation>
 <translation id="7494974237137038751">დაზოგილია</translation>
 <translation id="7498271377022651285">გთხოვთ, დაელოდოთ…</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">შემოწმდა რამდენიმე წამის წინ</translation>
 <translation id="8040831032425909005">სწრაფი ქმედებების ძიების ვიჯეტის ხატულა</translation>
 <translation id="804335162455518893">SD ბარათი ვერ მოიძებნა</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> ინკოგნიტო ჩანართი}other{<ph name="TAB_COUNT_NORMAL" /> ინკოგნიტო ჩანართი}}</translation>
 <translation id="8051695050440594747">ხელმისაწვდომია <ph name="MEGABYTES" /> მბაიტი</translation>
 <translation id="8058746566562539958">Chrome-ის ახალ ჩანართში გახსნა</translation>
 <translation id="8063895661287329888">სანიშნის დამატება ვერ მოხერხდა.</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">ტელეფონი</translation>
 <translation id="8636825310635137004">თქვენს სხვა მოწყობილობებზე არსებულ ჩანართებზე წვდომის მისაღებად, ჩართეთ სინქრონიზაცია.</translation>
 <translation id="8641930654639604085">შეძლებისდაგვარად, უფროსებისთვის განკუთვნილი საიტების დაბლოკვა</translation>
+<translation id="864544049772947936">ფანჯრების მართვა (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">მონაცემების გასუფთავება შეგიძლიათ Chrome-ის პარამეტრებიდან</translation>
 <translation id="8656747343598256512">შედით ამ საიტსა და Chrome-ში თქვენი Google ანგარიშით. სინქრონიზაციის ჩართვა მოგვიანებით შეგიძლიათ.</translation>
 <translation id="8659579665266920523">Chrome-ით ძიების წესი</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">გამოსახულებები</translation>
 <translation id="926205370408745186">ციფრული კომფორტიდან Chrome-ში თქვენი აქტივობის ამოშლა</translation>
 <translation id="927968626442779827">გამოიყენეთ Lite რეჟიმი Google Chrome-ში</translation>
+<translation id="928550791203542716"><ph name="SITE_NAME" /> თვალმიდევნებულია</translation>
 <translation id="932327136139879170">საწყისი გვერდი</translation>
 <translation id="938850635132480979">შეცდომა: <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">შეიყვანეთ საიდუმლო ფრაზა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
index f2754a9..c5558b9 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">Ātra meklēšana ar balsi. Lai rediģētu šo īsinājumtaustiņu, pieskarieties un turiet.</translation>
 <translation id="1028699632127661925">Notiek sūtīšana uz: <ph name="DEVICE_NAME" />...</translation>
 <translation id="103269572468856066">Dzēst arī šo vietņu un lietotņu datus?</translation>
+<translation id="1034259925032978114">Logs ir atvērts</translation>
 <translation id="1036348656032585052">Izslēgt</translation>
 <translation id="1036727731225946849">Tiek pievienots <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1045899828449635435">Vai dzēst arī šo vietņu datus?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">Visaugstākais Chrome drošības līmenis</translation>
 <translation id="2200113223741723867">Pārvaldīt lietojuma datu kopīgošanu</translation>
 <translation id="2227444325776770048">Turpināt kā: <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">Tukšs logs</translation>
 <translation id="2239812875700136898">Pārvaldiet ziņas, izmantojot opciju pogu lapā Discover.</translation>
 <translation id="2259659629660284697">Paroļu eksportēšana…</translation>
 <translation id="2276696007612801991">Lai pārbaudītu paroles, pierakstieties Google kontā</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Chrome sākumlapa</translation>
 <translation id="3157842584138209013">Izmantojiet pogu Vairāk opciju, lai uzzinātu ietaupīto datu apjomu</translation>
 <translation id="3166827708714933426">Ciļņu un logu īsinājumtaustiņi</translation>
+<translation id="316694332262407393">Šajā ierīcē jau darbojas pārlūks Chrome.</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">Gandrīz pabeigts!</translation>
 <translation id="3207960819495026254">Atzīmēts kā grāmatzīme</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">Palīdzēt uzlabot drošību tīmeklī</translation>
 <translation id="3602290021589620013">Priekšskatīt</translation>
 <translation id="3616113530831147358">Audio</translation>
+<translation id="3622349720008044802">Logu pārvaldība</translation>
 <translation id="3631987586758005671">Notiek kopīgošana ar ierīci <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Parādīt paroli</translation>
 <translation id="363596933471559332">Automātiski pierakstīties vietnēs, izmantojot saglabātos akreditācijas datus. Ja funkcija ir izslēgta, verifikācija būs jāveic ikreiz, kad pierakstīsieties vietnē.</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">Tulkošanas iestatījumi</translation>
 <translation id="3738139272394829648">Meklēšana pieskaroties</translation>
 <translation id="3739899004075612870">Pievienota grāmatzīme pārlūkā <ph name="PRODUCT_NAME" /></translation>
+<translation id="3740525748616366977">Meklēšana ar balsi šajā ierīcē nav pieejama.</translation>
 <translation id="3749259744154402564">Darbība netiek atbalstīta</translation>
 <translation id="3771001275138982843">Nevarēja lejupielādēt atjauninājumu</translation>
 <translation id="3771033907050503522">Inkognito režīma cilnes</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">Gan pamatdati, gan informācija par jūsu apmeklētajām vietnēm un izmantotajām lietotnēm</translation>
 <translation id="3775705724665058594">Sūtīšana uz jūsu ierīcēm</translation>
 <translation id="3778956594442850293">Pievienots sākuma ekrānam</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 cilne}zero{# ciļņu}one{# cilne}other{# cilnes}}</translation>
 <translation id="3803784507854318295">Pārvaldīt automātisko atskaņošanu</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Pārvaldīt</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">“</translation>
 <translation id="393697183122708255">Nav iespējota meklēšana ar balsi.</translation>
 <translation id="395377504920307820">Izmantot bez konta</translation>
+<translation id="3958287878205277013">Lai ierīcē notīrītu inkognito režīma pārlūkošanas vēsturi, aizveriet visas inkognito cilnes.</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Kad ierīce būs gatava, jūsu lapa tiks ielādēta pārlūkā Chrome}zero{Kad ierīce būs gatava, jūsu lapas tiks ielādētas pārlūkā Chrome}one{Kad ierīce būs gatava, jūsu lapas tiks ielādētas pārlūkā Chrome}other{Kad ierīce būs gatava, jūsu lapas tiks ielādētas pārlūkā Chrome}}</translation>
 <translation id="3962957115499249330">Jums tiks parādīts paziņojums, kad tiks sākta šī lejupielāde Wi-Fi tīklā.</translation>
 <translation id="3963007978381181125">Ieejas frāzes šifrējumā nav iekļauti maksājumu veidi un adreses no pakalpojuma Google Pay. Jūsu šifrētos datus var lasīt tikai personas, kurām ir zināma jūsu ieejas frāze. Ieejas frāze netiek sūtīta Google serveriem un netiek tajos glabāta. Ja aizmirsīsiet ieejas frāzi vai vēlēsieties mainīt šo iestatījumu, jums būs jāatiestata sinhronizācija. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
@@ -544,6 +551,7 @@
 Jūsu Google kontam vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> var būt citu veidu pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation>
 <translation id="4532845899244822526">Mapes izvēlēšanās</translation>
 <translation id="4538018662093857852">Ieslēgt vienkāršoto režīmu</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> cilne}zero{<ph name="TAB_COUNT_MANY" /> ciļņu, <ph name="TAB_COUNT_INCOGNITO" /> inkognito}one{<ph name="TAB_COUNT_MANY" /> cilne, <ph name="TAB_COUNT_INCOGNITO" /> inkognito}other{<ph name="TAB_COUNT_MANY" /> cilnes, <ph name="TAB_COUNT_INCOGNITO" /> inkognito}}</translation>
 <translation id="4550003330909367850">Lai skatītu vai kopētu savu paroli šeit, iestatiet ekrāna bloķēšanu šajā ierīcē.</translation>
 <translation id="4554077758708533499">Pievienots ar USB vadu</translation>
 <translation id="4557685098773234337">Lai varētu šeit nokļūt ātrāk, pievienojiet šo lapu sākuma ekrānam</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Neatbalstīts Chrome instanču skaits</translation>
 <translation id="4908869848243824489">Google funkcija Discover</translation>
 <translation id="4910889077668685004">Maksājumu lietotnes</translation>
+<translation id="4912413785358399818">Pārvietot cilni</translation>
 <translation id="4913161338056004800">Atiestatīt statistikas datus</translation>
 <translation id="4913169188695071480">Pārtraukt atsvaidzināšanu</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# lapa}zero{# lapas}one{# lapa}other{# lapas}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">Atļaut</translation>
 <translation id="5054455334322721892">Kad esat pierakstījies, jūsu Google kontā var saglabāt <ph name="BEGIN_LINK1" />arī cita veida darbības<ph name="END_LINK1" />. Jebkurā laikā varat tās izdzēst.</translation>
 <translation id="5061533557687621530">Lai uzzinātu laika prognozi, pieskarieties mikrofonam un sakiet “What’s the weather today?” (Kāda ir šodienas laika prognoze?)</translation>
+<translation id="506254248375231072">Nav ciļņu</translation>
 <translation id="5087580092889165836">Pievienot karti</translation>
+<translation id="5091199029769593641">Drīzumā, atverot jaunu cilni, būs redzami raksti no vietnes <ph name="SITE_NAME" />. Vietnes, kurām sekojat, tiek saglabātas jūsu Google kontā. Varat tās pārvaldīt Discover iestatījumu sadaļā.</translation>
 <translation id="5091249083535528968">Detalizēti lietojuma dati</translation>
 <translation id="509429900233858213">Radās kļūda.</translation>
 <translation id="510275257476243843">Atlikusi 1 h</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656">izmantojot <ph name="PROVIDER" /></translation>
 <translation id="5456381639095306749">Lejupielādēt lapu</translation>
 <translation id="5458366071038729214">Šeit būs redzamas vietnes, kurām sekojat</translation>
+<translation id="5468068603361015296">Vai tomēr vēlaties lejupielādēt failu “<ph name="FILE_NAME" />”?</translation>
 <translation id="548278423535722844">Atvērt karšu lietotnē</translation>
 <translation id="5483197086164197190">Navigācija pārlūkā Chrome</translation>
 <translation id="5487521232677179737">Notīrīt datus</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">Autortiesības: <ph name="YEAR" /> Google LLC. Visas tiesības paturētas.</translation>
 <translation id="5810864297166300463">Palīdzība tīmeklī</translation>
 <translation id="5814131985548525293">Lai sāktu, rakstiet šeit vai pieskarieties balss ievades ikonai</translation>
+<translation id="5814749351757353073">Sekojiet savām iecienītajām vietnēm</translation>
 <translation id="583281660410589416">Nezināms</translation>
 <translation id="5833984609253377421">Kopīgot saiti</translation>
 <translation id="5834764604050996579">Lai skenētu QR kodu, atļaujiet pārlūkprogrammai Chrome izmantot jūsu kameru</translation>
@@ -824,6 +837,7 @@
 
 Piemēram, dažas vietnes, reaģējot uz šo pieprasījumu, var rādīt jums reklāmas, kuru pamatā nav citas jūsu apmeklētās vietnes. Tomēr daudzas vietnes vāks un izmantos jūsu pārlūkošanas datus, piemēram, lai uzlabotu drošību, nodrošinātu saturu, reklāmas un ieteikumus un ģenerētu pārskatu statistiku.</translation>
 <translation id="624789221780392884">Var veikt atjaunināšanu</translation>
+<translation id="6264376385120300461">Tomēr lejupielādēt</translation>
 <translation id="6277522088822131679">Drukājot lapu, radās problēma. Lūdzu, mēģiniet vēlreiz.</translation>
 <translation id="6278428485366576908">Motīvs</translation>
 <translation id="6292420053234093573">Izmantojot pārlūkprogrammu Chrome, jūs piekrītat <ph name="BEGIN_LINK1" />Google pakalpojumu sniegšanas noteikumiem<ph name="END_LINK1" /> un <ph name="BEGIN_LINK2" />Google Chrome un Chrome OS pakalpojumu sniegšanas papildu noteikumiem<ph name="END_LINK2" />.</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">Radās kļūda. Vēlāk mēģiniet vēlreiz.</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Pārbaudīts: pirms 1 stundas}zero{Pārbaudīts: pirms # stundām}one{Pārbaudīts: pirms # stundas}other{Pārbaudīts: pirms # stundām}}</translation>
 <translation id="6545017243486555795">Notīrīt visus datus</translation>
+<translation id="6546511553472444032">Fails var būt kaitīgs</translation>
 <translation id="6560414384669816528">Meklēšana, izmantojot Sogou</translation>
 <translation id="656065428026159829">Skatīt vairāk</translation>
 <translation id="6565959834589222080">Wi-Fi tiek izmantots, ja tas ir pieejams</translation>
 <translation id="6566259936974865419">Pārlūkā Chrome esat ietaupījis <ph name="GIGABYTES" /> GB.</translation>
+<translation id="6569373978618239158">Tagad, atverot jaunu cilni, būs redzami raksti no vietnes <ph name="SITE_NAME" />. Vietnes, kurām sekojat, tiek saglabātas jūsu Google kontā. Varat tās pārvaldīt Discover iestatījumu sadaļā.</translation>
 <translation id="6573096386450695060">Vienmēr atļaut</translation>
 <translation id="6573431926118603307">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs.</translation>
 <translation id="6583199322650523874">Pievienot pašreizējo lapu grāmatzīmēm</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">Iziet no inkognito režīma</translation>
 <translation id="6979737339423435258">Visā periodā</translation>
 <translation id="6981982820502123353">Pieejamība</translation>
+<translation id="6987047470128880212">Inkognito režīms šajā ierīcē nav pieejams.</translation>
 <translation id="6989267951144302301">Nevarēja lejupielādēt</translation>
 <translation id="6995899638241819463">Brīdināt, ja paroles tiek atklātas datu noplūdes dēļ</translation>
 <translation id="7001056293070445572">Šis fails ir liels (<ph name="FILE_SIZE" />).</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">Priekšskatījuma cilne</translation>
 <translation id="7484997419527351112">Funkcija Discover — izslēgta</translation>
 <translation id="7485033510383818941">Lai atsvaidzinātu plūsmas saturu, velciet lapu uz leju.</translation>
+<translation id="749294055653435199">Tehnoloģija Google Lens šajā ierīcē nav pieejama.</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (atjaunināts: <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">Saglabātie dati</translation>
 <translation id="7498271377022651285">Lūdzu, uzgaidiet...</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">Pārbaudīts: tikko</translation>
 <translation id="8040831032425909005">Ātrās darbības un logrīka Meklēšana ikona</translation>
 <translation id="804335162455518893">SD karte nav atrasta</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> inkognito cilne}zero{<ph name="TAB_COUNT_NORMAL" /> inkognito ciļņu}one{<ph name="TAB_COUNT_NORMAL" /> inkognito cilne}other{<ph name="TAB_COUNT_NORMAL" /> inkognito cilnes}}</translation>
 <translation id="8051695050440594747">Ir pieejami <ph name="MEGABYTES" /> MB</translation>
 <translation id="8058746566562539958">Atvērt jaunā Chrome cilnē</translation>
 <translation id="8063895661287329888">Neizdevās pievienot grāmatzīmi.</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">tālrunī</translation>
 <translation id="8636825310635137004">Ieslēdziet sinhronizāciju, lai būtu pieejamas cilnes no citām jūsu ierīcēm.</translation>
 <translation id="8641930654639604085">Pēc iespējas bloķēt vietnes ar pieaugušajiem paredzētu saturu</translation>
+<translation id="864544049772947936">Pārvaldīt logus (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">Varat notīrīt datus Chrome iestatījumos</translation>
 <translation id="8656747343598256512">Pierakstieties šajā vietnē un pārlūkā Chrome, izmantojot savu Google kontu. Sinhronizāciju varat ieslēgt vēlāk.</translation>
 <translation id="8659579665266920523">Meklēšana pārlūkā Chrome</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">Attēli</translation>
 <translation id="926205370408745186">Chrome darbību noņemšana no Digitālās labjutības</translation>
 <translation id="927968626442779827">Izmantojiet Google Chrome vienkāršoto režīmu.</translation>
+<translation id="928550791203542716">Jūs sekojat vietnei <ph name="SITE_NAME" />.</translation>
 <translation id="932327136139879170">Sākums</translation>
 <translation id="938850635132480979">Kļūda: <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">Ievadiet ieejas frāzi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
index b86bb88..b7633e98 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Delen</translation>
 <translation id="2195339740518523951">Gebruik het hoogste beveiligingsniveau van Chrome</translation>
 <translation id="2200113223741723867">Delen van gebruiksgegevens beheren</translation>
+<translation id="2218567645332692482">Upgrade navigaties naar HTTPS en krijg een waarschuwing als er sites worden geladen die dit niet ondersteunen</translation>
 <translation id="2227444325776770048">Doorgaan als <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Leeg venster</translation>
 <translation id="2239812875700136898">Beheer je artikelen met de knop 'Opties voor Discover'</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">in behandeling</translation>
 <translation id="8970887620466824814">Er is iets misgegaan.</translation>
 <translation id="8972098258593396643">Downloaden naar standaardmap?</translation>
+<translation id="8987641763863173640">Instellingen voor videovoorbeeld beheren</translation>
 <translation id="8988028529677883095">Telefoon gebruiken als beveiligingssleutel</translation>
 <translation id="8993760627012879038">Een nieuw venster openen in de incognitomodus</translation>
 <translation id="8996847606757455498">Een andere provider kiezen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index 4bff00d..563226e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Trimitere</translation>
 <translation id="2195339740518523951">Beneficiază de cel mai înalt nivel de securitate de la Chrome</translation>
 <translation id="2200113223741723867">Gestionează accesul la datele de utilizare</translation>
+<translation id="2218567645332692482">Doresc actualizarea navigărilor la HTTPS și un avertisment înainte de încărcarea site-urilor care nu acceptă acest protocol</translation>
 <translation id="2227444325776770048">Continuă ca <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Fereastră goală</translation>
 <translation id="2239812875700136898">Gestionează subiectele folosind butonul Opțiuni pentru Discover</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">în așteptare</translation>
 <translation id="8970887620466824814">A apărut o eroare.</translation>
 <translation id="8972098258593396643">Descarci în dosarul prestabilit?</translation>
+<translation id="8987641763863173640">Gestionează setările pentru previzualizarea videoclipurilor</translation>
 <translation id="8988028529677883095">Folosește telefonul ca pe o cheie de securitate</translation>
 <translation id="8993760627012879038">Deschide o filă nouă în modul incognito</translation>
 <translation id="8996847606757455498">Alege alt furnizor</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index 8f2c89a..8c83ce7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Deljenje z drugimi</translation>
 <translation id="2195339740518523951">Izberite Chromovo najmočnejšo varnost</translation>
 <translation id="2200113223741723867">Upravljanje deljenja podatkov o uporabi</translation>
+<translation id="2218567645332692482">Nadgraditev krmarjenj do HTTPS-ja in opozorilo pred nalaganjem spletnih mest, ki ga ne podpirajo.</translation>
 <translation id="2227444325776770048">Nadaljujte kot <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Prazno okno</translation>
 <translation id="2239812875700136898">Nadzirajte članke v možnostih za gumb Odkrivanja</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">poteka</translation>
 <translation id="8970887620466824814">Prišlo je do napake.</translation>
 <translation id="8972098258593396643">Želite prenesti v privzeto mapo?</translation>
+<translation id="8987641763863173640">Upravljanje nastavitev predogleda videoposnetkov</translation>
 <translation id="8988028529677883095">Uporaba telefona kot varnostnega ključa</translation>
 <translation id="8993760627012879038">Odpiranje novega anonimnega zavihka</translation>
 <translation id="8996847606757455498">Izberi drugega ponudnika:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
index 79a133ae..1a6f8fd 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">Kërko me shpejtësi me zërin tënd. Për ta modifikuar këtë shkurtore, preke dhe mbaje të prekur.</translation>
 <translation id="1028699632127661925">Po dërgohet te <ph name="DEVICE_NAME" />...</translation>
 <translation id="103269572468856066">Të pastrohen edhe të dhënat nga këto sajte dhe aplikacione?</translation>
+<translation id="1034259925032978114">Dritarja është e hapur</translation>
 <translation id="1036348656032585052">Çaktivizo</translation>
 <translation id="1036727731225946849">Po shton <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1045899828449635435">Të pastrohen edhe të dhënat nga këto sajte?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">Merr sigurinë më të fortë të Chrome</translation>
 <translation id="2200113223741723867">Menaxho ndarjen e të dhënave të përdorimit</translation>
 <translation id="2227444325776770048">Vazhdo si <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">Dritare bosh</translation>
 <translation id="2239812875700136898">Kontrollo historitë e tua nga butoni "Opsionet për Zbulo"</translation>
 <translation id="2259659629660284697">Eksporto fjalëkalimet…</translation>
 <translation id="2276696007612801991">Identifikohu në "Llogarinë tënde të Google" për të kontrolluar fjalëkalimet e tua</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Faqja kryesore e Chrome</translation>
 <translation id="3157842584138209013">Shiko se sa të dhëna kurseve nga butoni "Më shumë opsione"</translation>
 <translation id="3166827708714933426">Shkurtoret e skedës dhe dritares</translation>
+<translation id="316694332262407393">Chrome është tashmë duke u ekzekutuar këtu.</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">Pothuajse mbaroi!</translation>
 <translation id="3207960819495026254">Regjistruar në faqeshënues</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">Ndihmo në përmirësimin e sigurisë në ueb</translation>
 <translation id="3602290021589620013">Pamje paraprake</translation>
 <translation id="3616113530831147358">Audio</translation>
+<translation id="3622349720008044802">Menaxho dritaret</translation>
 <translation id="3631987586758005671">Po ndahet te <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Shfaq fjalëkalimin</translation>
 <translation id="363596933471559332">Identifikohu automatikisht në sajtet e uebit duke përdorur kredencialet e ruajtura. Kur funksioni është i çaktivizuar, do të të kërkohet gjithmonë verifikimi  përpara se të identifikohesh në një sajt uebi.</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">Cilësimet e përkthimit</translation>
 <translation id="3738139272394829648">Prek për të kërkuar</translation>
 <translation id="3739899004075612870">U shtua si faqeshënues në <ph name="PRODUCT_NAME" /></translation>
+<translation id="3740525748616366977">Kërkimi zanor nuk mund të përdoret në këtë pajisje</translation>
 <translation id="3749259744154402564">Nuk mbështetet</translation>
 <translation id="3771001275138982843">Përditësimi nuk mund të shkarkohej</translation>
 <translation id="3771033907050503522">Skedat "e fshehura"</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">Të dhëna bazë plus informacione rreth faqeve të internetit që viziton dhe aplikacioneve që përdor</translation>
 <translation id="3775705724665058594">Dërgo te pajisjet e tua</translation>
 <translation id="3778956594442850293">U shtua në ekranin bazë</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 skedë}other{# skeda}}</translation>
 <translation id="3803784507854318295">Menaxho luajtjen automatike</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Menaxho</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">“</translation>
 <translation id="393697183122708255">Nuk ofrohet kërkimi i aktivizuar me zë</translation>
 <translation id="395377504920307820">Përdor pa një llogari</translation>
+<translation id="3958287878205277013">Për të pastruar historikun e shfletimit "Të fshehtë" nga pajisja jote, mbylli të gjitha skedat "E fshehta".</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome do ta ngarkojë faqen tënde kur të jesh gati}other{Chrome do të ngarkojë faqet e tua kur të jesh gati}}</translation>
 <translation id="3962957115499249330">Do të shikosh një njoftim kur ky shkarkim të fillojë në Wi-Fi.</translation>
 <translation id="3963007978381181125">Enkriptimi i frazës së kalimit nuk përfshin mënyrat e pagesës dhe adresat nga Google Pay. Vetëm dikush me frazën tënde të kalimit mund t'i lexojë të dhënat e enkriptuara. Fraza e kalimit nuk dërgohet te Google dhe as nuk ruhet nga ai. Nëse e harron frazën e kalimit ose dëshiron ta ndryshosh këtë cilësim, do të duhet të rivendosësh sinkronizimin. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 Llogaria jote e Google mund të ketë forma të tjera të historikut të shfletimit, si kërkimet dhe aktivitetet nga shërbimet e tjera të Google në <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="4532845899244822526">Zgjidh dosjen</translation>
 <translation id="4538018662093857852">Aktivizo "Modalitetin e lehtë"</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> skedë}other{<ph name="TAB_COUNT_MANY" /> skeda, <ph name="TAB_COUNT_INCOGNITO" /> të fshehta}}</translation>
 <translation id="4550003330909367850">Për të parë ose për të kopjuar fjalëkalimin tënd këtu, vendos kyçjen e ekranit në këtë pajisje.</translation>
 <translation id="4554077758708533499">I lidhur me kabllo USB</translation>
 <translation id="4557685098773234337">Për të ardhur këtu më shpejt, shtoje këtë faqe në "Ekranin tënd bazë"</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Numër i pambështetur i versioneve të Chrome.</translation>
 <translation id="4908869848243824489">"Zbulo" nga Google</translation>
 <translation id="4910889077668685004">Aplikacionet e pagesës</translation>
+<translation id="4912413785358399818">Lëviz skedën</translation>
 <translation id="4913161338056004800">Rivendos statistikat</translation>
 <translation id="4913169188695071480">Ndalo rifreskimin</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# faqe}other{# faqe}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">Lejo</translation>
 <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Forma të tjera aktiviteti<ph name="END_LINK1" /> mund të ruhen në "Llogarinë tënde të Google" kur je i identifikuar. Mund t'i fshish ato në çdo kohë.</translation>
 <translation id="5061533557687621530">Për të kontrolluar motin, trokit te mikrofoni dhe thuaj “Si është moti sot?”</translation>
+<translation id="506254248375231072">Nuk ka skeda</translation>
 <translation id="5087580092889165836">Shto kartë</translation>
+<translation id="5091199029769593641">Së shpejti do të shikosh histori nga <ph name="SITE_NAME" /> kur të hapësh një skedë të re. Sajtet që ndjek ruhen në llogarinë tënde të Google. Mund t'i menaxhosh te cilësimet e "Zbulo".</translation>
 <translation id="5091249083535528968">Të dhënat e zgjeruara të përdorimit</translation>
 <translation id="509429900233858213">Ndodhi një gabim.</translation>
 <translation id="510275257476243843">1 orë e mbetur</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656">me <ph name="PROVIDER" /></translation>
 <translation id="5456381639095306749">Shkarko faqen</translation>
 <translation id="5458366071038729214">Sajtet që ndjek do t'i gjesh këtu</translation>
+<translation id="5468068603361015296">Do ta shkarkosh <ph name="FILE_NAME" /> gjithsesi?</translation>
 <translation id="548278423535722844">Hape në aplikacionin e hartave</translation>
 <translation id="5483197086164197190">Si të navigosh në Chrome</translation>
 <translation id="5487521232677179737">Pastro të dhënat</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">Të drejtat e autorit <ph name="YEAR" /> Google LLC. Të gjitha të drejtat e rezervuara.</translation>
 <translation id="5810864297166300463">Asistenca në ueb</translation>
 <translation id="5814131985548525293">Shkruaj këtu ose trokit tek ikona e mikrofonit për të filluar</translation>
+<translation id="5814749351757353073">Ndiq sajtet e tua të preferuara</translation>
 <translation id="583281660410589416">E panjohur</translation>
 <translation id="5833984609253377421">Ndaj lidhjen</translation>
 <translation id="5834764604050996579">Për të skanuar një kod QR, lejo që Chrome të përdorë kamerën tënde</translation>
@@ -824,6 +837,7 @@
 
 Për shembull, disa sajte uebi mund t'i përgjigjen kësaj kërkese duke të treguar reklama që nuk bazohen në sajtet e tjera të uebit që ke vizituar. Shumë sajte uebi do të mbledhin dhe do të përdorin përsëri të dhënat e tua të shfletimit - për shembull, për të përmirësuar sigurinë, për të ofruar përmbajtje, reklama dhe rekomandime, si dhe për të krijuar statistika raportimi.</translation>
 <translation id="624789221780392884">Përditësimi është gati</translation>
+<translation id="6264376385120300461">Shkarkoje gjithsesi</translation>
 <translation id="6277522088822131679">Pati një problem me printimin e faqes. Provo përsëri.</translation>
 <translation id="6278428485366576908">Tema</translation>
 <translation id="6292420053234093573">Duke përdorur Chrome, ti pranon <ph name="BEGIN_LINK1" />Kushtet e shërbimit të Google<ph name="END_LINK1" /> dhe <ph name="BEGIN_LINK2" />Kushtet shtesë të shërbimit të Google Chrome dhe të sistemit operativ Chrome<ph name="END_LINK2" />.</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">Ndodhi një gabim. Provo përsëri më vonë.</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Kontrolluar 1 orë më parë}other{Kontrolluar # orë më parë}}</translation>
 <translation id="6545017243486555795">Pastro të gjitha të dhënat</translation>
+<translation id="6546511553472444032">Skedari mund të jetë i dëmshëm</translation>
 <translation id="6560414384669816528">Kërko me Sogou</translation>
 <translation id="656065428026159829">Shiko më shumë</translation>
 <translation id="6565959834589222080">Wi-Fi përdoret kur ofrohet</translation>
 <translation id="6566259936974865419">Chrome të ka kursyer <ph name="GIGABYTES" /> GB</translation>
+<translation id="6569373978618239158">Tani do të shikosh histori nga <ph name="SITE_NAME" /> kur të hapësh një skedë të re. Sajtet që ndjek ruhen në llogarinë tënde të Google. Mund t'i menaxhosh te cilësimet e "Zbulo".</translation>
 <translation id="6573096386450695060">Lejo gjithmonë</translation>
 <translation id="6573431926118603307">Skedat që ke hapur në Chrome në pajisjet e tjera do të shfaqen këtu.</translation>
 <translation id="6583199322650523874">Shëno si faqeshënues faqen aktuale</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">Dil nga modaliteti "i fshehtë"</translation>
 <translation id="6979737339423435258">Gjatë të gjithë kohës</translation>
 <translation id="6981982820502123353">Qasja</translation>
+<translation id="6987047470128880212">"I fshehtë" nuk ofrohet në këtë pajisje</translation>
 <translation id="6989267951144302301">Nuk mund të shkarkohej</translation>
 <translation id="6995899638241819463">Të të paralajmërojë nëse fjalëkalimet janë ekspozuar në një nxjerrje të paautorizuar të të dhënave</translation>
 <translation id="7001056293070445572">Ky skedar është i madh (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">Skeda e shikimit paraprak</translation>
 <translation id="7484997419527351112">Zbulo - joaktiv</translation>
 <translation id="7485033510383818941">Për të rifreskuar përmbajtjen e furnizimit, tërhiqe faqen poshtë</translation>
+<translation id="749294055653435199">"Lentja e Google" nuk ofrohet në këtë pajisje</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (u përditësua <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">të dhënat e kursyera</translation>
 <translation id="7498271377022651285">Qëndro në pritje...</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">Kontrolluar pikërisht tani</translation>
 <translation id="8040831032425909005">Ikona e "Miniaplikacionit të kërkimit" të "Veprimeve të shpejta"</translation>
 <translation id="804335162455518893">Karta SD nuk u gjet</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> skedë e fshehtë}other{<ph name="TAB_COUNT_NORMAL" /> skeda të fshehta}}</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB në dispozicion</translation>
 <translation id="8058746566562539958">Hape në një skedë të re të Chrome</translation>
 <translation id="8063895661287329888">Shtimi i faqeshënuesit dështoi.</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">telefon</translation>
 <translation id="8636825310635137004">Për të marrë skedat e tua nga pajisjet e tjera, aktivizo sinkronizimin.</translation>
 <translation id="8641930654639604085">Përpiqu të bllokosh sajtet për të rriturit</translation>
+<translation id="864544049772947936">Menaxho dritaret (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">Mund t'i pastrosh të dhënat në "Cilësimet" e Chrome</translation>
 <translation id="8656747343598256512">Identifikohu në këtë sajt dhe në Chrome me "Llogarinë tënde të Google". Mund ta aktivizosh sinkronizmin më vonë.</translation>
 <translation id="8659579665266920523">Si të kërkosh me Chrome</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">Imazhet</translation>
 <translation id="926205370408745186">Hiq aktivitetin tënd të Chrome nga "Mirëqenia dixhitale"</translation>
 <translation id="927968626442779827">Përdor "Modalitetin e lehtë" në Google Chrome</translation>
+<translation id="928550791203542716">Po ndjek <ph name="SITE_NAME" /></translation>
 <translation id="932327136139879170">Faqja kryesore</translation>
 <translation id="938850635132480979">Gabim: <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">Fut frazën e kalimit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
index 30053cae..ddb0336 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Deljenje</translation>
 <translation id="2195339740518523951">Nabavite najjaču zaštitu u Chrome-u</translation>
 <translation id="2200113223741723867">Upravljajte deljenjem podataka o korišćenju</translation>
+<translation id="2218567645332692482">Nadograđuje navigacije na HTTPS i upozorava vas pre učitavanja sajtova koji ga ne podržavaju</translation>
 <translation id="2227444325776770048">Nastavi kao <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Prazan prozor</translation>
 <translation id="2239812875700136898">Kontrolišite vesti pomoću dugmeta Opcije za Discover</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">na čekanju</translation>
 <translation id="8970887620466824814">Došlo je do greške.</translation>
 <translation id="8972098258593396643">Preuzimate u podrazumevani direktorijum?</translation>
+<translation id="8987641763863173640">Upravljajte podešavanjima pregleda videa</translation>
 <translation id="8988028529677883095">Koristite telefon kao bezbednosni ključ</translation>
 <translation id="8993760627012879038">Otvaranje nove kartice u režimu bez arhiviranja</translation>
 <translation id="8996847606757455498">Odaberite drugog dobavljača</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
index b2a3621f..66c4fdf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -187,6 +187,7 @@
 <translation id="218608176142494674">Дељење</translation>
 <translation id="2195339740518523951">Набавите најјачу заштиту у Chrome-у</translation>
 <translation id="2200113223741723867">Управљајте дељењем података о коришћењу</translation>
+<translation id="2218567645332692482">Надограђује навигације на HTTPS и упозорава вас пре учитавања сајтова који га не подржавају</translation>
 <translation id="2227444325776770048">Настави као <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">Празан прозор</translation>
 <translation id="2239812875700136898">Контролишите вести помоћу дугмета Опције за Discover</translation>
@@ -1295,6 +1296,7 @@
 <translation id="8965591936373831584">на чекању</translation>
 <translation id="8970887620466824814">Дошло је до грешке.</translation>
 <translation id="8972098258593396643">Преузимате у подразумевани директоријум?</translation>
+<translation id="8987641763863173640">Управљајте подешавањима прегледа видеа</translation>
 <translation id="8988028529677883095">Користите телефон као безбедносни кључ</translation>
 <translation id="8993760627012879038">Отварање нове картице у режиму без архивирања</translation>
 <translation id="8996847606757455498">Одаберите другог добављача</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
index 00ba3b8..63a0a32 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">Tìm kiếm nhanh bằng giọng nói. Để chỉnh sửa lối tắt này, hãy chạm và giữ.</translation>
 <translation id="1028699632127661925">Đang gửi đến <ph name="DEVICE_NAME" />...</translation>
 <translation id="103269572468856066">Đồng thời xóa dữ liệu khỏi các trang web và ứng dụng này?</translation>
+<translation id="1034259925032978114">Cửa sổ đang mở</translation>
 <translation id="1036348656032585052">Tắt</translation>
 <translation id="1036727731225946849">Đang thêm <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1045899828449635435">Đồng thời xóa dữ liệu khỏi các trang web này?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">Tận dụng mức bảo mật mạnh nhất của Chrome</translation>
 <translation id="2200113223741723867">Quản lý cách chia sẻ dữ liệu sử dụng</translation>
 <translation id="2227444325776770048">Tiếp tục bằng <ph name="USER_FULL_NAME" /></translation>
+<translation id="2230777942707397948">Cửa sổ trống</translation>
 <translation id="2239812875700136898">Kiểm soát các tin bài của bạn bằng các Tùy chọn của nút Khám phá</translation>
 <translation id="2259659629660284697">Xuất mật khẩu...</translation>
 <translation id="2276696007612801991">Đăng nhập vào Tài khoản Google của bạn để kiểm tra mật khẩu</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Trang chủ của Chrome</translation>
 <translation id="3157842584138209013">Xem lượng dữ liệu bạn đã tiết kiệm được từ nút Tùy chọn khác</translation>
 <translation id="3166827708714933426">Phím tắt dành cho thẻ và cửa sổ</translation>
+<translation id="316694332262407393">Chrome hiện đang chạy trên trang này.</translation>
 <translation id="3169472444629675720">Khám phá</translation>
 <translation id="3205824638308738187">Sắp hoàn tất!</translation>
 <translation id="3207960819495026254">Đã đánh dấu trang</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">Giúp tăng cường an ninh trên web</translation>
 <translation id="3602290021589620013">Xem trước</translation>
 <translation id="3616113530831147358">Âm thanh</translation>
+<translation id="3622349720008044802">Quản lý cửa sổ</translation>
 <translation id="3631987586758005671">Đang chia sẻ đến <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Hiện mật khẩu</translation>
 <translation id="363596933471559332">Tự động đăng nhập vào các trang web bằng thông tin đăng nhập được lưu trữ. Khi tính năng này tắt, bạn sẽ luôn được yêu cầu xác minh trước khi đăng nhập vào trang web.</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">Cài đặt bản dịch</translation>
 <translation id="3738139272394829648">Chạm để tìm kiếm</translation>
 <translation id="3739899004075612870">Đã đánh dấu trang trong <ph name="PRODUCT_NAME" /></translation>
+<translation id="3740525748616366977">Không dùng được tính năng Tìm kiếm bằng giọng nói trên thiết bị này</translation>
 <translation id="3749259744154402564">Chưa hỗ trợ</translation>
 <translation id="3771001275138982843">Không thể tải bản cập nhật xuống</translation>
 <translation id="3771033907050503522">Thẻ ẩn danh</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">Dữ liệu cơ bản cùng với thông tin về những trang web bạn truy cập và các ứng dụng bạn dùng</translation>
 <translation id="3775705724665058594">Gửi đến các thiết bị của bạn</translation>
 <translation id="3778956594442850293">Đã thêm vào màn hình chính</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 thẻ}other{# thẻ}}</translation>
 <translation id="3803784507854318295">Quản lý chế độ tự động phát</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Quản lý</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">“</translation>
 <translation id="393697183122708255">Không có tìm kiếm bằng giọng nói đã bật</translation>
 <translation id="395377504920307820">Sử dụng mà không cần tài khoản</translation>
+<translation id="3958287878205277013">Để xóa nhật ký duyệt web Ẩn danh khỏi thiết bị của bạn, hãy đóng tất cả thẻ Ẩn danh.</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome sẽ tải trang của bạn khi sẵn sàng}other{Chrome sẽ tải trang của bạn khi sẵn sàng}}</translation>
 <translation id="3962957115499249330">Bạn sẽ thấy một thông báo khi tệp này bắt đầu tải xuống qua Wi-Fi.</translation>
 <translation id="3963007978381181125">Việc mã hóa cụm mật khẩu không bao gồm địa chỉ và phương thức thanh toán từ Google Pay. Chỉ người có cụm mật khẩu của bạn mới có thể đọc dữ liệu mã hóa. Cụm mật khẩu này sẽ không được gửi đến hay lưu trữ tại Google. Nếu quên cụm mật khẩu hoặc muốn thay đổi tùy chọn cài đặt này, thì bạn cần đặt lại tính năng đồng bộ hóa. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác, chẳng hạn như tìm kiếm và hoạt động từ các dịch vụ khác của Google tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="4532845899244822526">Chọn thư mục</translation>
 <translation id="4538018662093857852">Bật Chế độ thu gọn</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> thẻ}other{<ph name="TAB_COUNT_MANY" /> thẻ, <ph name="TAB_COUNT_INCOGNITO" /> ẩn danh}}</translation>
 <translation id="4550003330909367850">Để xem hoặc sao chép mật khẩu của bạn tại đây, hãy đặt khóa màn hình trên thiết bị này.</translation>
 <translation id="4554077758708533499">Đã kết nối bằng cáp USB</translation>
 <translation id="4557685098773234337">Để truy cập trang này nhanh hơn, hãy thêm trang vào Màn hình chính</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Số phiên bản Chrome không được hỗ trợ.</translation>
 <translation id="4908869848243824489">Tính năng Khám phá của Google</translation>
 <translation id="4910889077668685004">Ứng dụng thanh toán</translation>
+<translation id="4912413785358399818">Di chuyển thẻ</translation>
 <translation id="4913161338056004800">Đặt lại thống kê</translation>
 <translation id="4913169188695071480">Ngừng làm mới</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# trang}other{# trang}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">Cho phép</translation>
 <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Các hình thức hoạt động khác<ph name="END_LINK1" /> có thể được lưu vào Tài khoản Google khi bạn đăng nhập. Bạn có thể xóa những dữ liệu này bất cứ lúc nào.</translation>
 <translation id="5061533557687621530">Để xem thông tin thời tiết, hãy nhấn vào micrô và nói “Thời tiết hôm nay thế nào?”</translation>
+<translation id="506254248375231072">Không có thẻ nào</translation>
 <translation id="5087580092889165836">Thêm thẻ</translation>
+<translation id="5091199029769593641">Bạn sẽ sớm thấy các tin bài của <ph name="SITE_NAME" /> khi mở một thẻ mới. Các trang web bạn theo dõi sẽ được lưu trong tài khoản Google của bạn. Bạn có thể quản lý các trang web đó trong phần cài đặt Khám phá.</translation>
 <translation id="5091249083535528968">Dữ liệu sử dụng mở rộng</translation>
 <translation id="509429900233858213">Đã xảy ra lỗi.</translation>
 <translation id="510275257476243843">Còn 1 giờ</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656">với <ph name="PROVIDER" /></translation>
 <translation id="5456381639095306749">Tải trang xuống</translation>
 <translation id="5458366071038729214">Bạn sẽ thấy các trang web mình theo dõi tại đây</translation>
+<translation id="5468068603361015296">Bạn vẫn muốn tải <ph name="FILE_NAME" /> xuống?</translation>
 <translation id="548278423535722844">Mở trong ứng dụng bản đồ</translation>
 <translation id="5483197086164197190">Thao tác trong Chrome</translation>
 <translation id="5487521232677179737">Xóa dữ liệu</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">Bản quyền <ph name="YEAR" /> Google LLC. Mọi quyền được bảo lưu.</translation>
 <translation id="5810864297166300463">Hỗ trợ trên web</translation>
 <translation id="5814131985548525293">Nhập vào đây hoặc nhấn vào biểu tượng giọng nói để bắt đầu</translation>
+<translation id="5814749351757353073">Cập nhật thông tin với các trang web yêu thích của bạn</translation>
 <translation id="583281660410589416">Không xác định</translation>
 <translation id="5833984609253377421">Chia sẻ liên kết</translation>
 <translation id="5834764604050996579">Để quét mã QR, hãy cho phép Chrome dùng máy ảnh của bạn</translation>
@@ -824,6 +837,7 @@
 
 Ví dụ: một số trang web có thể phản hồi yêu cầu này bằng cách hiển thị cho bạn các quảng cáo không dựa trên các trang web khác mà bạn đã truy cập. Nhiều trang web sẽ vẫn thu thập và sử dụng dữ liệu duyệt web của bạn — ví dụ: để tăng cường bảo mật, cung cấp nội dung, quảng cáo và đề xuất, đồng thời tạo số liệu thống kê báo cáo.</translation>
 <translation id="624789221780392884">Bản cập nhật đã sẵn sàng</translation>
+<translation id="6264376385120300461">Vẫn tải xuống</translation>
 <translation id="6277522088822131679">Đã xảy ra sự cố khi in trang này. Vui lòng thử lại.</translation>
 <translation id="6278428485366576908">Chủ đề</translation>
 <translation id="6292420053234093573">Bằng việc sử dụng Chrome, bạn đồng ý với <ph name="BEGIN_LINK1" />Điều khoản dịch vụ của Google<ph name="END_LINK1" /> cũng như <ph name="BEGIN_LINK2" />Điều khoản dịch vụ bổ sung của Google Chrome và Chrome OS<ph name="END_LINK2" />.</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">Đã xảy ra lỗi. Hãy thử lại sau.</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Đã kiểm tra 1 giờ trước}other{Đã kiểm tra # giờ trước}}</translation>
 <translation id="6545017243486555795">Xóa tất cả dữ liệu</translation>
+<translation id="6546511553472444032">Tệp có thể gây hại</translation>
 <translation id="6560414384669816528">Tìm kiếm với Sogou</translation>
 <translation id="656065428026159829">Xem thêm</translation>
 <translation id="6565959834589222080">Dùng mạng Wi-Fi khi có sẵn</translation>
 <translation id="6566259936974865419">Chrome đã tiết kiệm <ph name="GIGABYTES" /> GB cho bạn</translation>
+<translation id="6569373978618239158">Giờ đây, bạn sẽ thấy các tin bài của <ph name="SITE_NAME" /> khi mở một thẻ mới. Các trang web bạn theo dõi sẽ được lưu trong tài khoản Google của bạn. Bạn có thể quản lý các trang web đó trong phần cài đặt Khám phá.</translation>
 <translation id="6573096386450695060">Luôn cho phép</translation>
 <translation id="6573431926118603307">Các thẻ bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</translation>
 <translation id="6583199322650523874">Đánh dấu trang hiện tại</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">Thoát khỏi chế độ Ẩn danh</translation>
 <translation id="6979737339423435258">Từ trước đến nay</translation>
 <translation id="6981982820502123353">Hỗ trợ tiếp cận</translation>
+<translation id="6987047470128880212">Không dùng được chế độ Ẩn danh trên thiết bị này</translation>
 <translation id="6989267951144302301">Không thể tải xuống</translation>
 <translation id="6995899638241819463">Cảnh báo bạn nếu mật khẩu bị lộ trong một sự cố rò rỉ dữ liệu</translation>
 <translation id="7001056293070445572">Tệp này có kích thước lớn (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">Thẻ xem trước</translation>
 <translation id="7484997419527351112">Khám phá – đang tắt</translation>
 <translation id="7485033510383818941">Để làm mới nội dung nguồn cấp dữ liệu, hãy kéo trang xuống</translation>
+<translation id="749294055653435199">Không dùng được tính năng Google Ống kính trên thiết bị này</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (Đã cập nhật <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">dữ liệu đã tiết kiệm</translation>
 <translation id="7498271377022651285">Vui lòng đợi…</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">Vừa kiểm tra xong</translation>
 <translation id="8040831032425909005">Biểu tượng Tiện ích Tìm kiếm Thao tác nhanh</translation>
 <translation id="804335162455518893">Không tìm thấy thẻ SD</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> thẻ ẩn danh}other{<ph name="TAB_COUNT_NORMAL" /> thẻ ẩn danh}}</translation>
 <translation id="8051695050440594747">Còn <ph name="MEGABYTES" /> MB</translation>
 <translation id="8058746566562539958">Mở trong thẻ Chrome mới</translation>
 <translation id="8063895661287329888">Không thêm được dấu trang.</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">điện thoại</translation>
 <translation id="8636825310635137004">Để có các thẻ từ các thiết bị khác của bạn, hãy bật đồng bộ hóa.</translation>
 <translation id="8641930654639604085">Cố gắng chặn các trang web cho người lớn</translation>
+<translation id="864544049772947936">Quản lý cửa sổ (<ph name="INSTANCE_COUNTS" />)</translation>
 <translation id="8655129584991699539">Bạn có thể xóa dữ liệu trong mục Cài đặt của Chrome</translation>
 <translation id="8656747343598256512">Bạn sẽ đăng nhập vào trang web này và Chrome bằng Tài khoản Google của bạn. Bạn có thể bật tính năng đồng bộ hóa sau.</translation>
 <translation id="8659579665266920523">Cách tìm kiếm bằng Chrome</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">Hình ảnh</translation>
 <translation id="926205370408745186">Xóa hoạt động của bạn trên Chrome khỏi Digital Wellbeing</translation>
 <translation id="927968626442779827">Dùng Chế độ thu gọn trên Google Chrome</translation>
+<translation id="928550791203542716">Đang theo dõi <ph name="SITE_NAME" /></translation>
 <translation id="932327136139879170">Trang chủ</translation>
 <translation id="938850635132480979">Lỗi: <ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">Nhập cụm mật khẩu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
index 9aeed42..5d42e08 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -4,6 +4,7 @@
 <translation id="1016498331642356377">快速透過語音進行搜尋。按住這裡即可編輯這個捷徑。</translation>
 <translation id="1028699632127661925">正在傳送到「<ph name="DEVICE_NAME" />」...</translation>
 <translation id="103269572468856066">要一併清除這些網站和應用程式中的資料嗎?</translation>
+<translation id="1034259925032978114">視窗已開啟</translation>
 <translation id="1036348656032585052">關閉</translation>
 <translation id="1036727731225946849">正在新增「<ph name="WEBAPK_NAME" />」...</translation>
 <translation id="1045899828449635435">要一併清除這些網站中的資料嗎?</translation>
@@ -187,6 +188,7 @@
 <translation id="2195339740518523951">獲得 Chrome 最強大的安全防護</translation>
 <translation id="2200113223741723867">管理使用資料分享項目</translation>
 <translation id="2227444325776770048">以「<ph name="USER_FULL_NAME" />」的身分繼續</translation>
+<translation id="2230777942707397948">空白視窗</translation>
 <translation id="2239812875700136898">按一下 [探索的選項] 按鈕來控管你的報導</translation>
 <translation id="2259659629660284697">匯出密碼…</translation>
 <translation id="2276696007612801991">登入 Google 帳戶以檢查你的密碼</translation>
@@ -338,6 +340,7 @@
 <translation id="314939179385989105">Chrome 首頁</translation>
 <translation id="3157842584138209013">如要查看節省的數據用量,請點選 [更多選項] 按鈕</translation>
 <translation id="3166827708714933426">分頁與視窗快速鍵</translation>
+<translation id="316694332262407393">Chrome 已在執行中。</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3205824638308738187">即將大功告成!</translation>
 <translation id="3207960819495026254">已加入書籤</translation>
@@ -416,6 +419,7 @@
 <translation id="3587596251841506391">協助改善網路安全</translation>
 <translation id="3602290021589620013">預覽</translation>
 <translation id="3616113530831147358">音訊</translation>
+<translation id="3622349720008044802">管理視窗</translation>
 <translation id="3631987586758005671">正在分享至「<ph name="DEVICE_NAME" />」</translation>
 <translation id="3632295766818638029">取消密碼遮罩</translation>
 <translation id="363596933471559332">自動使用已儲存的憑證登入網站。如果關閉這項功能,每次在您登入網站之前,網站一律會要求驗證。</translation>
@@ -431,6 +435,7 @@
 <translation id="3737319253362202215">翻譯設定</translation>
 <translation id="3738139272394829648">輕觸搜尋</translation>
 <translation id="3739899004075612870">已加入 <ph name="PRODUCT_NAME" /> 書籤</translation>
+<translation id="3740525748616366977">這部裝置不支援語音搜尋功能</translation>
 <translation id="3749259744154402564">不支援</translation>
 <translation id="3771001275138982843">無法下載更新</translation>
 <translation id="3771033907050503522">無痕式分頁</translation>
@@ -439,6 +444,7 @@
 <translation id="3773856050682458546">基本資料再加上你所造訪的網站和所用應用程式的相關資訊</translation>
 <translation id="3775705724665058594">傳送至你的裝置</translation>
 <translation id="3778956594442850293">已新增至主畫面</translation>
+<translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 個分頁}other{# 個分頁}}</translation>
 <translation id="3803784507854318295">管理自動播放方式</translation>
 <translation id="3810838688059735925">影片</translation>
 <translation id="3810973564298564668">管理</translation>
@@ -459,6 +465,7 @@
 <translation id="3934366560681368531">「</translation>
 <translation id="393697183122708255">沒有可用的語音搜尋功能</translation>
 <translation id="395377504920307820">在未登入帳戶的狀態下使用</translation>
+<translation id="3958287878205277013">如要清除裝置上的無痕模式瀏覽記錄,請關閉所有無痕分頁。</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome 準備就緒後將載入你的網頁}other{Chrome 準備就緒後將載入你的網頁}}</translation>
 <translation id="3962957115499249330">透過 Wi-Fi 開始下載時,系統會顯示通知。</translation>
 <translation id="3963007978381181125">通關密語加密保護的資料不包括 Google Pay 的付款方式和地址。只有知道你通關密語的人,才能讀取加密保護的資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果你忘記自己的通關密語,或是想變更這項設定,則必須重設同步功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
@@ -544,6 +551,7 @@
 你的 Google 帳戶仍可能保留了其他類型的瀏覽記錄,例如其他 Google 服務中的搜尋和活動記錄 (可前往 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 查詢)。</translation>
 <translation id="4532845899244822526">選擇資料夾</translation>
 <translation id="4538018662093857852">開啟精簡模式</translation>
+<translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> 個分頁}other{<ph name="TAB_COUNT_MANY" /> 個分頁、<ph name="TAB_COUNT_INCOGNITO" /> 個無痕分頁}}</translation>
 <translation id="4550003330909367850">如要在這裡查看或複製你的密碼,請為這個裝置設定螢幕鎖定功能。</translation>
 <translation id="4554077758708533499">已透過 USB 傳輸線連線</translation>
 <translation id="4557685098773234337">如要更快速地前往這個網頁,請將網頁新增至主畫面</translation>
@@ -609,6 +617,7 @@
 <translation id="4885273946141277891">Chrome 實例的數量已超出上限。</translation>
 <translation id="4908869848243824489">Google 探索</translation>
 <translation id="4910889077668685004">付款應用程式</translation>
+<translation id="4912413785358399818">移動分頁</translation>
 <translation id="4913161338056004800">重設統計資料</translation>
 <translation id="4913169188695071480">停止重新整理</translation>
 <translation id="4921180162323349895">{FILE_COUNT,plural, =1{# 個網頁}other{# 個網頁}}</translation>
@@ -634,7 +643,9 @@
 <translation id="5039804452771397117">允許</translation>
 <translation id="5054455334322721892">在你登入後,<ph name="BEGIN_LINK1" />其他形式的活動<ph name="END_LINK1" />可能會儲存至你的 Google 帳戶。你隨時可以刪除這些內容。</translation>
 <translation id="5061533557687621530">如要查詢天氣狀況,請輕觸麥克風圖示,然後說出「今天天氣如何?」</translation>
+<translation id="506254248375231072">沒有任何分頁</translation>
 <translation id="5087580092889165836">新增信用卡</translation>
+<translation id="5091199029769593641">不久後,你就會在開啟新分頁時看到「<ph name="SITE_NAME" />」的網路故事。你追蹤的網站會儲存在 Google 帳戶中,你可以在「探索」設定中管理這些網站。</translation>
 <translation id="5091249083535528968">延伸使用資料</translation>
 <translation id="509429900233858213">發生錯誤。</translation>
 <translation id="510275257476243843">還剩 1 小時</translation>
@@ -694,6 +705,7 @@
 <translation id="5454166040603940656">提供者:<ph name="PROVIDER" /></translation>
 <translation id="5456381639095306749">下載網頁</translation>
 <translation id="5458366071038729214">這裡會顯示你追蹤的網站</translation>
+<translation id="5468068603361015296">仍要下載「<ph name="FILE_NAME" />」嗎?</translation>
 <translation id="548278423535722844">在地圖應用程式中開啟</translation>
 <translation id="5483197086164197190">Navigate Chrome</translation>
 <translation id="5487521232677179737">清除資料</translation>
@@ -750,6 +762,7 @@
 <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. 保留所有權利。</translation>
 <translation id="5810864297166300463">網路協助</translation>
 <translation id="5814131985548525293">在此輸入內容或麥克風語音圖示即可開始搜尋</translation>
+<translation id="5814749351757353073">掌握最愛網站的最新動態</translation>
 <translation id="583281660410589416">未知</translation>
 <translation id="5833984609253377421">分享連結</translation>
 <translation id="5834764604050996579">如要掃描 QR 圖碼,請允許 Chrome 使用你的攝影機</translation>
@@ -824,6 +837,7 @@
 
 舉例來說,部分網站可能會以顯示廣告的方式回應這類要求,而這些廣告並非根據您所造訪的其他網站記錄而產生。許多網站仍會收集您的瀏覽資料,並將這些資料用於下列目的:提高網站安全性、在網站上提供更相關的內容、廣告和推薦項目,以及產生報告統計資料。</translation>
 <translation id="624789221780392884">可進行更新</translation>
+<translation id="6264376385120300461">仍要下載</translation>
 <translation id="6277522088822131679">列印網頁時發生問題,請再試一次。</translation>
 <translation id="6278428485366576908">主題</translation>
 <translation id="6292420053234093573">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。</translation>
@@ -881,10 +895,12 @@
 <translation id="6539092367496845964">發生錯誤,請稍後再試。</translation>
 <translation id="6541983376925655882">{NUM_HOURS,plural, =1{已在 1 小時前檢查}other{已在 # 小時前檢查}}</translation>
 <translation id="6545017243486555795">清除所有資料</translation>
+<translation id="6546511553472444032">檔案可能有害</translation>
 <translation id="6560414384669816528">使用 Sogou 搜尋</translation>
 <translation id="656065428026159829">顯示更多</translation>
 <translation id="6565959834589222080">有可用 Wi-Fi 時,系統會使用 Wi-Fi</translation>
 <translation id="6566259936974865419">Chrome 為你節省了 <ph name="GIGABYTES" /> GB</translation>
+<translation id="6569373978618239158">往後開啟新分頁時,你就會看到「<ph name="SITE_NAME" />」的網路故事。你追蹤的網站會儲存在 Google 帳戶中,你可以在「探索」設定中管理這些網站。</translation>
 <translation id="6573096386450695060">一律允許</translation>
 <translation id="6573431926118603307">您在其他裝置上透過 Chrome 開啟的分頁會顯示在這裡。</translation>
 <translation id="6583199322650523874">將目前的網頁加入書籤</translation>
@@ -950,6 +966,7 @@
 <translation id="696447261358045621">退出無痕模式</translation>
 <translation id="6979737339423435258">不限時間</translation>
 <translation id="6981982820502123353">無障礙設定</translation>
+<translation id="6987047470128880212">這部裝置不支援無痕模式</translation>
 <translation id="6989267951144302301">無法下載</translation>
 <translation id="6995899638241819463">當密碼因資料侵害事件遭到外洩時發出警告</translation>
 <translation id="7001056293070445572">檔案較大 (<ph name="FILE_SIZE" />)</translation>
@@ -1027,6 +1044,7 @@
 <translation id="7482656565088326534">預覽分頁</translation>
 <translation id="7484997419527351112">探索 - 關閉</translation>
 <translation id="7485033510383818941">如要重新整理動態提醒內容,請將頁面往下拉</translation>
+<translation id="749294055653435199">這部裝置不支援 Google 智慧鏡頭</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (上次更新時間:<ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">(已節省的數據量)</translation>
 <translation id="7498271377022651285">請稍候…</translation>
@@ -1128,6 +1146,7 @@
 <translation id="8037801708772278989">剛才已檢查</translation>
 <translation id="8040831032425909005">快速操作與搜尋小工具的圖示</translation>
 <translation id="804335162455518893">找不到 SD 卡</translation>
+<translation id="8048533522416101084">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> 個無痕分頁}other{<ph name="TAB_COUNT_NORMAL" /> 個無痕分頁}}</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用空間</translation>
 <translation id="8058746566562539958">在新的 Chrome 分頁中開啟</translation>
 <translation id="8063895661287329888">無法加入書籤。</translation>
@@ -1226,6 +1245,7 @@
 <translation id="8621068256433641644">手機</translation>
 <translation id="8636825310635137004">如要存取您在其他裝置上開啟的分頁,請開啟同步處理功能。</translation>
 <translation id="8641930654639604085">嘗試封鎖成人網站</translation>
+<translation id="864544049772947936">管理視窗 (<ph name="INSTANCE_COUNTS" /> 個)</translation>
 <translation id="8655129584991699539">你可以在 Chrome 設定中清除資料</translation>
 <translation id="8656747343598256512">使用你的 Google 帳戶登入這個網站和 Chrome。你可以稍後再開啟同步功能。</translation>
 <translation id="8659579665266920523">如何透過 Chrome 進行搜尋</translation>
@@ -1314,6 +1334,7 @@
 <translation id="9219103736887031265">圖片</translation>
 <translation id="926205370408745186">將你的 Chrome 活動記錄從數位健康中移除</translation>
 <translation id="927968626442779827">使用 Google Chrome 精簡模式</translation>
+<translation id="928550791203542716">正在追蹤「<ph name="SITE_NAME" />」</translation>
 <translation id="932327136139879170">首頁</translation>
 <translation id="938850635132480979">錯誤:<ph name="ERROR_CODE" /></translation>
 <translation id="939598580284253335">請輸入通關密語</translation>
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc
index 8a90e75a..d152dd47 100644
--- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc
+++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc
@@ -96,5 +96,11 @@
 void FakeAccessibilityController::
     DisableSwitchAccessDisableConfirmationDialogTesting() {}
 
-void FakeAccessibilityController::UpdateDictationButtonOnSodaChanged(
-    bool soda_download_in_progress) {}
+void FakeAccessibilityController::
+    UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+        bool download_in_progress) {}
+
+void FakeAccessibilityController::
+    ShowSpeechRecognitionDownloadNotificationForDictation(
+        bool succeeded,
+        const std::u16string& display_language) {}
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h
index aef913e32..b924bbf 100644
--- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h
+++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h
@@ -58,8 +58,11 @@
   bool IsAccessibilityFeatureVisibleInTrayMenu(
       const std::string& path) override;
   void DisableSwitchAccessDisableConfirmationDialogTesting() override;
-  void UpdateDictationButtonOnSodaChanged(
-      bool soda_download_in_progress) override;
+  void UpdateDictationButtonOnSpeechRecognitionDownloadChanged(
+      bool download_in_progress) override;
+  void ShowSpeechRecognitionDownloadNotificationForDictation(
+      bool succeeded,
+      const std::u16string& display_language) override;
 
  private:
   bool was_client_set_ = false;
diff --git a/chrome/browser/ui/ash/desks_client.cc b/chrome/browser/ui/ash/desks_client.cc
index 8449be1..e635ca8 100644
--- a/chrome/browser/ui/ash/desks_client.cc
+++ b/chrome/browser/ui/ash/desks_client.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/guid.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -29,6 +30,8 @@
     "Ash.DeskTemplate.WindowAndTabCount";
 constexpr char kLaunchFromTemplateHistogramName[] =
     "Ash.DeskTemplate.LaunchFromTemplate";
+constexpr char kUserTemplateCountHistogramName[] =
+    "Ash.DeskTemplate.UserTemplateCount";
 
 // Returns true if |profile| is a supported profile in desk template feature.
 bool IsSupportedProfile(Profile* profile) {
@@ -76,7 +79,7 @@
 
   std::unique_ptr<ash::DeskTemplate> desk_template =
       desks_helper_->CaptureActiveDeskAsTemplate();
-  RecordWindowAndTabCount(desk_template.get());
+  RecordWindowAndTabCountHistogram(desk_template.get());
   auto desk_template_clone = desk_template->Clone();
   storage_manager_->AddOrUpdateEntry(
       std::move(desk_template_clone),
@@ -162,7 +165,8 @@
       std::make_unique<DeskTemplateAppLaunchHandler>(active_profile_);
 }
 
-void DesksClient::RecordWindowAndTabCount(ash::DeskTemplate* desk_template) {
+void DesksClient::RecordWindowAndTabCountHistogram(
+    ash::DeskTemplate* desk_template) {
   full_restore::RestoreData* restore_data = desk_template->desk_restore_data();
   DCHECK(restore_data);
 
@@ -196,10 +200,16 @@
   base::UmaHistogramCounts100(kWindowAndTabCountHistogramName, total_count);
 }
 
-void DesksClient::RecordLaunchFromTemplate() {
+void DesksClient::RecordLaunchFromTemplateHistogram() {
   base::UmaHistogramBoolean(kLaunchFromTemplateHistogramName, true);
 }
 
+void DesksClient::RecordTemplateCountHistogram() {
+  UMA_HISTOGRAM_EXACT_LINEAR(kUserTemplateCountHistogramName,
+                             storage_manager_->GetTemplateCount(),
+                             storage_manager_->GetMaxEntryCount());
+}
+
 void DesksClient::OnGetTemplateForDeskLaunch(
     LaunchDeskTemplateCallback callback,
     desks_storage::DeskModel::GetEntryByUuidStatus status,
@@ -237,7 +247,7 @@
   app_launch_handler_->SetRestoreDataAndLaunch(restore_data->Clone());
   std::move(callback).Run(/*success=*/true);
 
-  RecordLaunchFromTemplate();
+  RecordLaunchFromTemplateHistogram();
 }
 
 void DesksClient::OnCaptureActiveDeskAndSaveTemplate(
@@ -247,6 +257,7 @@
   std::move(callback).Run(
       status == desks_storage::DeskModel::AddOrUpdateEntryStatus::kOk,
       std::move(desk_template));
+  RecordTemplateCountHistogram();
 }
 
 void DesksClient::OnDeleteDeskTemplate(
@@ -254,6 +265,7 @@
     desks_storage::DeskModel::DeleteEntryStatus status) {
   std::move(callback).Run(status ==
                           desks_storage::DeskModel::DeleteEntryStatus::kOk);
+  RecordTemplateCountHistogram();
 }
 
 void DesksClient::OnUpdateDeskTemplate(
diff --git a/chrome/browser/ui/ash/desks_client.h b/chrome/browser/ui/ash/desks_client.h
index 8b2630f..3e0f93a 100644
--- a/chrome/browser/ui/ash/desks_client.h
+++ b/chrome/browser/ui/ash/desks_client.h
@@ -93,8 +93,9 @@
   // Attempts to create `app_launch_handler_` if it doesn't already exist.
   void MaybeCreateAppLaunchHandler();
 
-  void RecordWindowAndTabCount(ash::DeskTemplate* desk_template);
-  void RecordLaunchFromTemplate();
+  void RecordWindowAndTabCountHistogram(ash::DeskTemplate* desk_template);
+  void RecordLaunchFromTemplateHistogram();
+  void RecordTemplateCountHistogram();
 
   // Launches DeskTemplate after retrieval from storage.
   void OnGetTemplateForDeskLaunch(
diff --git a/chrome/browser/ui/ash/desks_client_browsertest.cc b/chrome/browser/ui/ash/desks_client_browsertest.cc
index da02a2c..96b8d1e 100644
--- a/chrome/browser/ui/ash/desks_client_browsertest.cc
+++ b/chrome/browser/ui/ash/desks_client_browsertest.cc
@@ -102,6 +102,14 @@
   return desk_template;
 }
 
+void DeleteDeskTemplate(const base::GUID uuid) {
+  base::RunLoop run_loop;
+  DesksClient::Get()->DeleteDeskTemplate(
+      uuid.AsLowercaseString(),
+      base::BindLambdaForTesting([&](bool success) { run_loop.Quit(); }));
+  run_loop.Run();
+}
+
 class MockDeskTemplateAppLaunchHandler : public DeskTemplateAppLaunchHandler {
  public:
   explicit MockDeskTemplateAppLaunchHandler(Profile* profile)
@@ -682,6 +690,28 @@
   histogram_tester.ExpectTotalCount(kLaunchFromTemplateHistogramName, launches);
 }
 
+// Tests that the template count histogram is recorded properly.
+IN_PROC_BROWSER_TEST_F(DesksClientTest,
+                       DeskTemplateUserTemplateCountHistogram) {
+  ASSERT_TRUE(DesksClient::Get());
+
+  base::HistogramTester histogram_tester;
+
+  // Verify that all template saves and deletes are captured by the histogram.
+  CaptureActiveDeskAndSaveTemplate();
+  CaptureActiveDeskAndSaveTemplate();
+  std::unique_ptr<ash::DeskTemplate> desk_template =
+      CaptureActiveDeskAndSaveTemplate();
+  DeleteDeskTemplate(desk_template->uuid());
+  CaptureActiveDeskAndSaveTemplate();
+
+  constexpr char kUserTemplateCountHistogramName[] =
+      "Ash.DeskTemplate.UserTemplateCount";
+  histogram_tester.ExpectBucketCount(kUserTemplateCountHistogramName, 1, 1);
+  histogram_tester.ExpectBucketCount(kUserTemplateCountHistogramName, 2, 2);
+  histogram_tester.ExpectBucketCount(kUserTemplateCountHistogramName, 3, 2);
+}
+
 // Tests that browser windows created from a template have the correct bounds
 // and window state.
 IN_PROC_BROWSER_TEST_F(DesksClientTest, BrowserWindowRestorationTest) {
diff --git a/chrome/browser/ui/autofill/payments/autofill_dialog_models.h b/chrome/browser/ui/autofill/payments/autofill_dialog_models.h
index 3ddbee1..3e74700 100644
--- a/chrome/browser/ui/autofill/payments/autofill_dialog_models.h
+++ b/chrome/browser/ui/autofill/payments/autofill_dialog_models.h
@@ -7,7 +7,6 @@
 
 #include <string>
 
-#include "base/macros.h"
 #include "ui/base/models/combobox_model.h"
 #include "ui/base/models/simple_combobox_model.h"
 
@@ -17,6 +16,8 @@
 class MonthComboboxModel : public ui::ComboboxModel {
  public:
   MonthComboboxModel();
+  MonthComboboxModel(const MonthComboboxModel&) = delete;
+  MonthComboboxModel& operator=(const MonthComboboxModel&) = delete;
   ~MonthComboboxModel() override;
 
   // Set |default_index_| to the given |month| before user interaction. There is
@@ -32,8 +33,6 @@
   // The index of the item that is selected by default (before user
   // interaction).
   int default_index_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(MonthComboboxModel);
 };
 
 // A model for years between now and a decade hence.
@@ -43,6 +42,8 @@
   // [current year, current year + 9], this will add |additional_year| to the
   // model. Passing 0 has no effect.
   explicit YearComboboxModel(int additional_year = 0);
+  YearComboboxModel(const YearComboboxModel&) = delete;
+  YearComboboxModel& operator=(const YearComboboxModel&) = delete;
   ~YearComboboxModel() override;
 
   // Set |default_index_| to the given |year| before user interaction. There is
@@ -56,8 +57,6 @@
   // The index of the item that is selected by default (before user
   // interaction).
   int default_index_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(YearComboboxModel);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/card_unmask_prompt_view_browsertest.cc b/chrome/browser/ui/autofill/payments/card_unmask_prompt_view_browsertest.cc
index 9d3ec8b..b978d38 100644
--- a/chrome/browser/ui/autofill/payments/card_unmask_prompt_view_browsertest.cc
+++ b/chrome/browser/ui/autofill/payments/card_unmask_prompt_view_browsertest.cc
@@ -6,7 +6,6 @@
 #include "base/callback_helpers.h"
 #include "base/guid.h"
 #include "base/location.h"
-#include "base/macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -38,9 +37,12 @@
 
 class TestCardUnmaskDelegate : public CardUnmaskDelegate {
  public:
-  TestCardUnmaskDelegate() {}
+  TestCardUnmaskDelegate() = default;
 
-  virtual ~TestCardUnmaskDelegate() {}
+  TestCardUnmaskDelegate(const TestCardUnmaskDelegate&) = delete;
+  TestCardUnmaskDelegate& operator=(const TestCardUnmaskDelegate&) = delete;
+
+  virtual ~TestCardUnmaskDelegate() = default;
 
   // CardUnmaskDelegate:
   void OnUnmaskPromptAccepted(
@@ -60,8 +62,6 @@
   UserProvidedUnmaskDetails details_;
 
   base::WeakPtrFactory<TestCardUnmaskDelegate> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate);
 };
 
 class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl {
@@ -72,6 +72,10 @@
       : CardUnmaskPromptControllerImpl(
             user_prefs::UserPrefs::Get(contents->GetBrowserContext())),
         runner_(runner) {}
+  TestCardUnmaskPromptController(const TestCardUnmaskPromptController&) =
+      delete;
+  TestCardUnmaskPromptController& operator=(
+      const TestCardUnmaskPromptController&) = delete;
 
   // CardUnmaskPromptControllerImpl:.
   // When the confirm button is clicked.
@@ -137,15 +141,18 @@
   bool expected_failure_permanent_ = false;
   scoped_refptr<content::MessageLoopRunner> runner_;
   base::WeakPtrFactory<TestCardUnmaskPromptController> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskPromptController);
 };
 
 class CardUnmaskPromptViewBrowserTest : public DialogBrowserTest {
  public:
-  CardUnmaskPromptViewBrowserTest() {}
+  CardUnmaskPromptViewBrowserTest() = default;
 
-  ~CardUnmaskPromptViewBrowserTest() override {}
+  CardUnmaskPromptViewBrowserTest(const CardUnmaskPromptViewBrowserTest&) =
+      delete;
+  CardUnmaskPromptViewBrowserTest& operator=(
+      const CardUnmaskPromptViewBrowserTest&) = delete;
+
+  ~CardUnmaskPromptViewBrowserTest() override = default;
 
   // DialogBrowserTest:
   void SetUpOnMainThread() override {
@@ -191,8 +198,6 @@
   content::WebContents* contents_;
   std::unique_ptr<TestCardUnmaskPromptController> controller_;
   std::unique_ptr<TestCardUnmaskDelegate> delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViewBrowserTest);
 };
 
 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, InvokeUi_expired) {
diff --git a/chrome/browser/ui/autofill/payments/credit_card_scanner_controller.cc b/chrome/browser/ui/autofill/payments/credit_card_scanner_controller.cc
index bef64f7..615d9d34 100644
--- a/chrome/browser/ui/autofill/payments/credit_card_scanner_controller.cc
+++ b/chrome/browser/ui/autofill/payments/credit_card_scanner_controller.cc
@@ -6,10 +6,10 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/callback.h"
 #include "base/check.h"
-#include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "chrome/browser/ui/autofill/payments/credit_card_scanner_view.h"
@@ -31,6 +31,8 @@
         callback_(std::move(callback)) {
     DCHECK(view_);
   }
+  Controller(const Controller&) = delete;
+  Controller& operator=(const Controller&) = delete;
 
   // Shows the UI to scan the credit card.
   void Show() {
@@ -39,7 +41,7 @@
   }
 
  private:
-  ~Controller() override {}
+  ~Controller() override = default;
 
   // CreditCardScannerViewDelegate implementation.
   void ScanCancelled() override {
@@ -64,8 +66,6 @@
 
   // The time when the UI was shown.
   base::TimeTicks show_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(Controller);
 };
 
 }  // namespace
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h
index 20f346abb7..1a51870 100644
--- a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_LOCAL_CARD_MIGRATION_BUBBLE_CONTROLLER_IMPL_H_
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_LOCAL_CARD_MIGRATION_BUBBLE_CONTROLLER_IMPL_H_
 
-#include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
 #include "chrome/browser/ui/autofill/payments/local_card_migration_controller_observer.h"
@@ -22,6 +21,10 @@
       public content::WebContentsUserData<
           LocalCardMigrationBubbleControllerImpl> {
  public:
+  LocalCardMigrationBubbleControllerImpl(
+      const LocalCardMigrationBubbleControllerImpl&) = delete;
+  LocalCardMigrationBubbleControllerImpl& operator=(
+      const LocalCardMigrationBubbleControllerImpl&) = delete;
   ~LocalCardMigrationBubbleControllerImpl() override;
 
   // Shows the prompt that offers local credit card migration.
@@ -76,8 +79,6 @@
       observer_list_;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationBubbleControllerImpl);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc
index 0a303e3..0083f70 100644
--- a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
@@ -60,7 +59,11 @@
 class LocalCardMigrationBubbleControllerImplTest
     : public BrowserWithTestWindowTest {
  public:
-  LocalCardMigrationBubbleControllerImplTest() {}
+  LocalCardMigrationBubbleControllerImplTest() = default;
+  LocalCardMigrationBubbleControllerImplTest(
+      const LocalCardMigrationBubbleControllerImplTest&) = delete;
+  LocalCardMigrationBubbleControllerImplTest& operator=(
+      const LocalCardMigrationBubbleControllerImplTest&) = delete;
 
   void SetUp() override {
     BrowserWithTestWindowTest::SetUp();
@@ -95,8 +98,6 @@
 
  private:
   static void LocalCardMigrationCallback() {}
-
-  DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationBubbleControllerImplTest);
 };
 
 TEST_F(LocalCardMigrationBubbleControllerImplTest,
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_dialog.h b/chrome/browser/ui/autofill/payments/local_card_migration_dialog.h
index 9b6a240c5..8db72e38 100644
--- a/chrome/browser/ui/autofill/payments/local_card_migration_dialog.h
+++ b/chrome/browser/ui/autofill/payments/local_card_migration_dialog.h
@@ -6,7 +6,6 @@
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_LOCAL_CARD_MIGRATION_DIALOG_H_
 
 #include "base/callback.h"
-#include "base/macros.h"
 
 namespace autofill {
 
@@ -14,15 +13,14 @@
 // dialogs.
 class LocalCardMigrationDialog {
  public:
+  LocalCardMigrationDialog(const LocalCardMigrationDialog&) = delete;
+  LocalCardMigrationDialog& operator=(const LocalCardMigrationDialog&) = delete;
   virtual void ShowDialog() = 0;
   virtual void CloseDialog() = 0;
 
  protected:
-  LocalCardMigrationDialog() {}
-  virtual ~LocalCardMigrationDialog() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationDialog);
+  LocalCardMigrationDialog() = default;
+  virtual ~LocalCardMigrationDialog() = default;
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_dialog_controller_impl.h b/chrome/browser/ui/autofill/payments/local_card_migration_dialog_controller_impl.h
index 1956d69..d389530 100644
--- a/chrome/browser/ui/autofill/payments/local_card_migration_dialog_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/local_card_migration_dialog_controller_impl.h
@@ -6,8 +6,9 @@
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_LOCAL_CARD_MIGRATION_DIALOG_CONTROLLER_IMPL_H_
 
 #include <memory>
+#include <string>
+#include <vector>
 
-#include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/timer/elapsed_timer.h"
 #include "chrome/browser/ui/autofill/payments/local_card_migration_controller_observer.h"
@@ -30,6 +31,10 @@
       public content::WebContentsUserData<
           LocalCardMigrationDialogControllerImpl> {
  public:
+  LocalCardMigrationDialogControllerImpl(
+      const LocalCardMigrationDialogControllerImpl&) = delete;
+  LocalCardMigrationDialogControllerImpl& operator=(
+      const LocalCardMigrationDialogControllerImpl&) = delete;
   ~LocalCardMigrationDialogControllerImpl() override;
 
   void ShowOfferDialog(
@@ -135,8 +140,6 @@
       observer_list_;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationDialogControllerImpl);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h b/chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h
index 987c1689..868defc 100644
--- a/chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h
+++ b/chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h
@@ -5,7 +5,9 @@
 #ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_MANAGE_MIGRATION_UI_CONTROLLER_H_
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_MANAGE_MIGRATION_UI_CONTROLLER_H_
 
-#include "base/macros.h"
+#include <string>
+#include <vector>
+
 #include "chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/local_card_migration_controller_observer.h"
 #include "chrome/browser/ui/autofill/payments/local_card_migration_dialog_controller_impl.h"
@@ -51,6 +53,9 @@
     : public LocalCardMigrationControllerObserver,
       public content::WebContentsUserData<ManageMigrationUiController> {
  public:
+  ManageMigrationUiController(const ManageMigrationUiController&) = delete;
+  ManageMigrationUiController& operator=(const ManageMigrationUiController&) =
+      delete;
   ~ManageMigrationUiController() override;
 
   void ShowBubble(base::OnceClosure show_migration_dialog_closure);
@@ -106,8 +111,6 @@
   bool show_error_dialog_ = false;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(ManageMigrationUiController);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller.h
index a0fc59a..b895044 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller.h
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller.h
@@ -9,7 +9,6 @@
 #include <string>
 #include <vector>
 
-#include "base/macros.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/sync_utils.h"
@@ -30,6 +29,8 @@
 class SaveCardBubbleController {
  public:
   SaveCardBubbleController() = default;
+  SaveCardBubbleController(const SaveCardBubbleController&) = delete;
+  SaveCardBubbleController& operator=(const SaveCardBubbleController&) = delete;
   virtual ~SaveCardBubbleController() = default;
 
   // Returns a reference to the SaveCardBubbleController associated with the
@@ -96,9 +97,6 @@
   virtual BubbleType GetBubbleType() const = 0;
   // Returns the current sync state.
   virtual AutofillSyncSigninState GetSyncState() const = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SaveCardBubbleController);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
index ed189a2..ad26a83 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "base/macros.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
 #include "chrome/browser/ui/autofill/payments/save_card_bubble_controller.h"
 #include "chrome/browser/ui/autofill/payments/save_card_ui.h"
@@ -42,6 +41,9 @@
     virtual void OnIconShown() = 0;
   };
 
+  SaveCardBubbleControllerImpl(const SaveCardBubbleControllerImpl&) = delete;
+  SaveCardBubbleControllerImpl& operator=(const SaveCardBubbleControllerImpl&) =
+      delete;
   ~SaveCardBubbleControllerImpl() override;
 
   // Sets up the controller and offers to save the |card| locally.
@@ -223,8 +225,6 @@
   ObserverForTest* observer_for_testing_ = nullptr;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(SaveCardBubbleControllerImpl);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
index 5f677999..f04b791 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
@@ -8,7 +8,6 @@
 
 #include "base/callback_helpers.h"
 #include "base/json/json_reader.h"
-#include "base/macros.h"
 #include "base/values.h"
 #include "chrome/browser/ui/autofill/payments/save_card_ui.h"
 #include "chrome/browser/ui/browser.h"
@@ -26,7 +25,11 @@
 
 class SaveCardBubbleControllerImplTest : public DialogBrowserTest {
  public:
-  SaveCardBubbleControllerImplTest() {}
+  SaveCardBubbleControllerImplTest() = default;
+  SaveCardBubbleControllerImplTest(const SaveCardBubbleControllerImplTest&) =
+      delete;
+  SaveCardBubbleControllerImplTest& operator=(
+      const SaveCardBubbleControllerImplTest&) = delete;
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     DialogBrowserTest::SetUpCommandLine(command_line);
@@ -112,8 +115,6 @@
 
  private:
   SaveCardBubbleControllerImpl* controller_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(SaveCardBubbleControllerImplTest);
 };
 
 // Invokes a bubble asking the user if they want to save a credit card locally.
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
index ca73545..051f0c0 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
@@ -6,11 +6,11 @@
 
 #include <stddef.h>
 #include <string>
+#include <tuple>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/json/json_reader.h"
-#include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
@@ -85,7 +85,10 @@
 
 class SaveCardBubbleControllerImplTest : public BrowserWithTestWindowTest {
  public:
-  SaveCardBubbleControllerImplTest() {}
+  SaveCardBubbleControllerImplTest() = default;
+  SaveCardBubbleControllerImplTest(SaveCardBubbleControllerImplTest&) = delete;
+  SaveCardBubbleControllerImplTest& operator=(
+      SaveCardBubbleControllerImplTest&) = delete;
 
   void SetUp() override {
     BrowserWithTestWindowTest::SetUp();
@@ -178,8 +181,6 @@
           user_provided_card_details) {}
   static void LocalSaveCardCallback(
       AutofillClient::SaveCardOfferUserDecision user_decision) {}
-
-  DISALLOW_COPY_AND_ASSIGN(SaveCardBubbleControllerImplTest);
 };
 
 // Tests that the legal message lines vector is empty when doing a local save so
diff --git a/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
index 9627f1ba..9f6118c 100644
--- a/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
@@ -15,6 +15,10 @@
 class SaveUPIBubbleControllerImplTest : public DialogBrowserTest {
  public:
   SaveUPIBubbleControllerImplTest() = default;
+  SaveUPIBubbleControllerImplTest(const SaveUPIBubbleControllerImplTest&) =
+      delete;
+  SaveUPIBubbleControllerImplTest& operator=(
+      const SaveUPIBubbleControllerImplTest&) = delete;
   ~SaveUPIBubbleControllerImplTest() override = default;
 
   // DialogBrowserTest:
@@ -32,8 +36,6 @@
 
  private:
   SaveUPIBubbleControllerImpl* controller_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(SaveUPIBubbleControllerImplTest);
 };
 
 IN_PROC_BROWSER_TEST_F(SaveUPIBubbleControllerImplTest, InvokeUi) {
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h b/chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h
index 0f5f1fe..4805213 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h
@@ -5,7 +5,9 @@
 #ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_VIRTUAL_CARD_SELECTION_DIALOG_CONTROLLER_IMPL_H_
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_VIRTUAL_CARD_SELECTION_DIALOG_CONTROLLER_IMPL_H_
 
-#include "base/macros.h"
+#include <string>
+#include <vector>
+
 #include "chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
@@ -22,6 +24,10 @@
       public content::WebContentsUserData<
           VirtualCardSelectionDialogControllerImpl> {
  public:
+  VirtualCardSelectionDialogControllerImpl(
+      const VirtualCardSelectionDialogControllerImpl&) = delete;
+  VirtualCardSelectionDialogControllerImpl& operator=(
+      const VirtualCardSelectionDialogControllerImpl&) = delete;
   ~VirtualCardSelectionDialogControllerImpl() override;
 
   void ShowDialog(const std::vector<CreditCard*>& candidates,
@@ -63,8 +69,6 @@
   VirtualCardSelectionDialogView* dialog_view_ = nullptr;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(VirtualCardSelectionDialogControllerImpl);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h b/chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h
index ecd6979..90f3a223 100644
--- a/chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_WEBAUTHN_DIALOG_CONTROLLER_IMPL_H_
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_WEBAUTHN_DIALOG_CONTROLLER_IMPL_H_
 
-#include "base/macros.h"
 #include "chrome/browser/ui/autofill/payments/webauthn_dialog_controller.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -24,6 +23,9 @@
       public content::WebContentsObserver,
       public content::WebContentsUserData<WebauthnDialogControllerImpl> {
  public:
+  WebauthnDialogControllerImpl(const WebauthnDialogControllerImpl&) = delete;
+  WebauthnDialogControllerImpl& operator=(const WebauthnDialogControllerImpl&) =
+      delete;
   ~WebauthnDialogControllerImpl() override;
 
   void ShowOfferDialog(
@@ -57,8 +59,6 @@
   WebauthnDialogView* dialog_view_ = nullptr;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
-
-  DISALLOW_COPY_AND_ASSIGN(WebauthnDialogControllerImpl);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/webauthn_dialog_model.h b/chrome/browser/ui/autofill/payments/webauthn_dialog_model.h
index c31b2fd..8025a8f 100644
--- a/chrome/browser/ui/autofill/payments/webauthn_dialog_model.h
+++ b/chrome/browser/ui/autofill/payments/webauthn_dialog_model.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_WEBAUTHN_DIALOG_MODEL_H_
 #define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_WEBAUTHN_DIALOG_MODEL_H_
 
-#include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/ui/webauthn/authenticator_request_sheet_model.h"
 #include "ui/gfx/vector_icon_types.h"
@@ -20,6 +19,8 @@
 class WebauthnDialogModel : public AuthenticatorRequestSheetModel {
  public:
   explicit WebauthnDialogModel(WebauthnDialogState dialog_state);
+  WebauthnDialogModel(const WebauthnDialogModel&) = delete;
+  WebauthnDialogModel& operator=(const WebauthnDialogModel&) = delete;
   ~WebauthnDialogModel() override;
 
   // Update the current state the dialog should be. When the state is changed,
@@ -52,8 +53,6 @@
   WebauthnDialogState state_;
 
   base::ObserverList<WebauthnDialogModelObserver> observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebauthnDialogModel);
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index a51ba52..1fd8555 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_bubble_type.h"
+#include "chrome/browser/ui/hats/hats_service.h"
 #include "chrome/browser/ui/page_action/page_action_icon_type.h"
 #include "chrome/browser/ui/user_education/in_product_help.h"
 #include "chrome/common/buildflags.h"
@@ -510,15 +511,16 @@
 
   // Shows User Happiness Tracking Survey's dialog after the survey associated
   // with |site_id| has been successfully loaded. Failure to load the survey
-  // will result in the dialog not being shown. |product_specific_data| should
-  // contain key-value pairs where the keys match the field names set for
-  // the survey in hats_service.cc, and the values are those which will be
-  // associated with the survey response.
+  // will result in the dialog not being shown. |product_specific_bits_data| and
+  // |product_specific_string_data| should contain key-value pairs where the
+  // keys match the field names set for the survey in hats_service.cc, and the
+  // values are those which will be associated with the survey response.
   virtual void ShowHatsDialog(
       const std::string& site_id,
       base::OnceClosure success_callback,
       base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data) = 0;
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data) = 0;
 
   // Returns object implementing ExclusiveAccessContext interface.
   virtual ExclusiveAccessContext* GetExclusiveAccessContext() = 0;
diff --git a/chrome/browser/ui/hats/hats_helper.cc b/chrome/browser/ui/hats/hats_helper.cc
index 6e5a24b..e4b616f0 100644
--- a/chrome/browser/ui/hats/hats_helper.cc
+++ b/chrome/browser/ui/hats/hats_helper.cc
@@ -6,6 +6,7 @@
 
 #include "base/callback_helpers.h"
 #include "base/metrics/field_trial_params.h"
+#include "chrome/browser/accuracy_tips/accuracy_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/hats/hats_service.h"
 #include "chrome/browser/ui/hats/hats_service_factory.h"
@@ -13,6 +14,9 @@
 #include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/webui_url_constants.h"
+#include "components/accuracy_tips/accuracy_service.h"
+#include "components/accuracy_tips/features.h"
+#include "components/safe_browsing/core/common/features.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 
@@ -36,6 +40,13 @@
     sentiment_service->OpenedNewTabPage();
   }
 
+  if (base::FeatureList::IsEnabled(safe_browsing::kAccuracyTipsFeature)) {
+    if (auto* accuracy_service =
+            AccuracyServiceFactory::GetForProfile(profile())) {
+      accuracy_service->MaybeShowSurvey();
+    }
+  }
+
   // If the demo HaTS feature is enabled display a test survey on every NTP
   // load unless the "auto_prompt" parameter is explicitly set to false. The
   // demo feature also disables client-side HaTS rate limiting, thus setting
@@ -54,11 +65,10 @@
         profile(), /*create_if_necessary=*/true);
 
     if (hats_service) {
-        hats_service->LaunchSurvey(kHatsSurveyTriggerTesting, base::DoNothing(),
-                                   base::DoNothing(),
-                                   {{"Test Field 1", true},
-                                    {"Test Field 2", false},
-                                    {"Test Field 3", true}});
+      hats_service->LaunchSurvey(
+          kHatsSurveyTriggerTesting, base::DoNothing(), base::DoNothing(),
+          {{"Test Field 1", true}, {"Test Field 2", false}},
+          {{"Test Field 3", "Test value"}});
     }
   }
 }
diff --git a/chrome/browser/ui/hats/hats_service.cc b/chrome/browser/ui/hats/hats_service.cc
index e9024b3..08ee951 100644
--- a/chrome/browser/ui/hats/hats_service.cc
+++ b/chrome/browser/ui/hats/hats_service.cc
@@ -22,6 +22,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
+#include "components/accuracy_tips/features.h"
 #include "components/metrics_services_manager/metrics_services_manager.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -40,6 +41,7 @@
 constexpr char kHatsSurveyTriggerTrustSafetyTrustedSurface[] =
     "ts-trusted-surface";
 constexpr char kHatsSurveyTriggerTrustSafetyTransactions[] = "ts-transactions";
+constexpr char kHatsSurveyTriggerAccuracyTips[] = "accuracy-tips";
 
 constexpr char kHatsNextSurveyTriggerIDTesting[] =
     "HLpeYy5Av0ugnJ3q1cK0XzzA8UHv";
@@ -159,6 +161,11 @@
       features::kTrustSafetySentimentSurveyTransactionsTriggerId.Get(),
       std::vector<std::string>{"Saved password"});
 
+  // Accuracy tips survey.
+  survey_configs.emplace_back(
+      &accuracy_tips::features::kAccuracyTipsSurveyFeature,
+      kHatsSurveyTriggerAccuracyTips);
+
   return survey_configs;
 }
 
@@ -168,11 +175,16 @@
     const base::Feature* feature,
     const std::string& trigger,
     const absl::optional<std::string>& presupplied_trigger_id,
-    const std::vector<std::string>& product_specific_data_fields)
+    const std::vector<std::string>& product_specific_bits_data_fields,
+    const std::vector<std::string>& product_specific_string_data_fields)
     : trigger(trigger),
-      product_specific_data_fields(product_specific_data_fields) {
-  DCHECK(product_specific_data_fields.size() <= 3)
-      << "A maximum of 3 survey specific data fields is supported";
+      product_specific_bits_data_fields(product_specific_bits_data_fields),
+      product_specific_string_data_fields(product_specific_string_data_fields) {
+  DCHECK_LE(product_specific_bits_data_fields.size() +
+                product_specific_string_data_fields.size(),
+            3u)
+      << "A maximum of 3 survey specific data fields (bits and string data "
+         "together) is supported";
 
   enabled = base::FeatureList::IsEnabled(*feature);
   if (!enabled)
@@ -211,10 +223,12 @@
     HatsService* hats_service,
     const std::string& trigger,
     content::WebContents* web_contents,
-    const std::map<std::string, bool>& product_specific_data)
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data)
     : hats_service_(hats_service),
       trigger_(trigger),
-      product_specific_data_(product_specific_data) {
+      product_specific_bits_data_(product_specific_bits_data),
+      product_specific_string_data_(product_specific_string_data) {
   Observe(web_contents);
 }
 
@@ -227,7 +241,8 @@
 
 void HatsService::DelayedSurveyTask::Launch() {
   hats_service_->LaunchSurveyForWebContents(trigger_, web_contents(),
-                                            product_specific_data_);
+                                            product_specific_bits_data_,
+                                            product_specific_string_data_);
   hats_service_->RemoveTask(*this);
 }
 
@@ -235,13 +250,6 @@
   hats_service_->RemoveTask(*this);
 }
 
-struct SurveyIdentifiers {
-  const base::Feature* feature;
-  const char* trigger;
-  const char* trigger_id;
-  std::vector<std::string> product_specific_data_fields;
-};
-
 HatsService::HatsService(Profile* profile) : profile_(profile) {
   auto surveys = GetSurveyConfigs();
 
@@ -262,8 +270,9 @@
   default_survey.probability = 1.0f;
   default_survey.trigger = kHatsSurveyTriggerTesting;
   default_survey.trigger_id = kHatsNextSurveyTriggerIDTesting;
-  default_survey.product_specific_data_fields = {"Test Field 1", "Test Field 2",
-                                                 "Test Field 3"};
+  default_survey.product_specific_bits_data_fields = {"Test Field 1",
+                                                      "Test Field 2"};
+  default_survey.product_specific_string_data_fields = {"Test Field 3"};
   survey_configs_by_triggers_.emplace(kHatsSurveyTriggerTesting,
                                       default_survey);
 }
@@ -282,26 +291,29 @@
     const std::string& trigger,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   if (!ShouldShowSurvey(trigger)) {
     std::move(failure_callback).Run();
     return;
   }
 
-  LaunchSurveyForBrowser(chrome::FindLastActiveWithProfile(profile_), trigger,
-                         std::move(success_callback),
-                         std::move(failure_callback), product_specific_data);
+  LaunchSurveyForBrowser(
+      chrome::FindLastActiveWithProfile(profile_), trigger,
+      std::move(success_callback), std::move(failure_callback),
+      product_specific_bits_data, product_specific_string_data);
 }
 
 bool HatsService::LaunchDelayedSurvey(
     const std::string& trigger,
     int timeout_ms,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   return base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&HatsService::LaunchSurvey, weak_ptr_factory_.GetWeakPtr(),
                      trigger, base::DoNothing::Once(), base::DoNothing::Once(),
-                     product_specific_data),
+                     product_specific_bits_data, product_specific_string_data),
       base::TimeDelta::FromMilliseconds(timeout_ms));
 }
 
@@ -309,12 +321,14 @@
     const std::string& trigger,
     content::WebContents* web_contents,
     int timeout_ms,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   if (!web_contents)
     return false;
   auto result = pending_tasks_.emplace(this, trigger, web_contents,
-                                       product_specific_data);
+                                       product_specific_bits_data,
+                                       product_specific_string_data);
   if (!result.second)
     return false;
   auto success = base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
@@ -452,12 +466,14 @@
 void HatsService::LaunchSurveyForWebContents(
     const std::string& trigger,
     content::WebContents* web_contents,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   if (ShouldShowSurvey(trigger) && web_contents &&
       web_contents->GetVisibility() == content::Visibility::VISIBLE) {
     LaunchSurveyForBrowser(chrome::FindBrowserWithWebContents(web_contents),
                            trigger, base::DoNothing(), base::DoNothing(),
-                           product_specific_data);
+                           product_specific_bits_data,
+                           product_specific_string_data);
   }
 }
 
@@ -466,7 +482,8 @@
     const std::string& trigger,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   if (!browser ||
       (!browser->is_type_normal() && !browser->is_type_devtools()) ||
       !profiles::IsRegularOrGuestSession(browser)) {
@@ -489,7 +506,8 @@
   // we check it at the last.
   CheckSurveyStatusAndMaybeShow(browser, trigger, std::move(success_callback),
                                 std::move(failure_callback),
-                                product_specific_data);
+                                product_specific_bits_data,
+                                product_specific_string_data);
 }
 
 bool HatsService::CanShowSurvey(const std::string& trigger) const {
@@ -649,7 +667,8 @@
     const std::string& trigger,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   // Check the survey status in profile first.
   // We record the survey's over capacity information in user profile to avoid
   // duplicated checks since the survey won't change once it is full.
@@ -662,19 +681,30 @@
     return;
   }
 
-  DCHECK(survey_configs_by_triggers_.find(trigger) !=
-         survey_configs_by_triggers_.end());
+  CHECK(survey_configs_by_triggers_.find(trigger) !=
+        survey_configs_by_triggers_.end());
   auto survey_config = survey_configs_by_triggers_[trigger];
 
-  // Check that the |product_specific_data| matches the fields for this trigger.
-  // If fields are set for a trigger, they must be provided.
-  DCHECK_EQ(product_specific_data.size(),
-            survey_config.product_specific_data_fields.size());
-  for (auto field_value : product_specific_data) {
-    DCHECK(std::find(survey_config.product_specific_data_fields.begin(),
-                     survey_config.product_specific_data_fields.end(),
-                     field_value.first) !=
-           survey_config.product_specific_data_fields.end());
+  // Check that the |product_specific_bits_data| matches the fields for this
+  // trigger. If fields are set for a trigger, they must be provided.
+  CHECK_EQ(product_specific_bits_data.size(),
+           survey_config.product_specific_bits_data_fields.size());
+  for (auto field_value : product_specific_bits_data) {
+    CHECK(std::find(survey_config.product_specific_bits_data_fields.begin(),
+                    survey_config.product_specific_bits_data_fields.end(),
+                    field_value.first) !=
+          survey_config.product_specific_bits_data_fields.end());
+  }
+
+  // Check that the |product_specific_string_data| matches the fields for this
+  // trigger. If fields are set for a trigger, they must be provided.
+  CHECK_EQ(product_specific_string_data.size(),
+           survey_config.product_specific_string_data_fields.size());
+  for (auto field_value : product_specific_string_data) {
+    CHECK(std::find(survey_config.product_specific_string_data_fields.begin(),
+                    survey_config.product_specific_string_data_fields.end(),
+                    field_value.first) !=
+          survey_config.product_specific_string_data_fields.end());
   }
 
   // As soon as the HaTS Next dialog is created it will attempt to contact
@@ -687,6 +717,6 @@
   browser->window()->ShowHatsDialog(
       survey_configs_by_triggers_[trigger].trigger_id,
       std::move(success_callback), std::move(failure_callback),
-      product_specific_data);
+      product_specific_bits_data, product_specific_string_data);
   hats_next_dialog_exists_ = true;
 }
diff --git a/chrome/browser/ui/hats/hats_service.h b/chrome/browser/ui/hats/hats_service.h
index 04c9ac3..34f8b4b3 100644
--- a/chrome/browser/ui/hats/hats_service.h
+++ b/chrome/browser/ui/hats/hats_service.h
@@ -48,6 +48,7 @@
 extern const char kHatsSurveyTriggerTrustSafetyPrivacySettings[];
 extern const char kHatsSurveyTriggerTrustSafetyTrustedSurface[];
 extern const char kHatsSurveyTriggerTrustSafetyTransactions[];
+extern const char kHatsSurveyTriggerAccuracyTips[];
 
 // The Trigger ID for a test HaTS Next survey which is available for testing
 // and demo purposes when the migration feature flag is enabled.
@@ -57,6 +58,12 @@
 // reason why not.
 extern const char kHatsShouldShowSurveyReasonHistogram[];
 
+// Key-value mapping type for survey's product specific bits data.
+typedef std::map<std::string, bool> SurveyBitsData;
+
+// Key-value mapping type for survey's product specific string data.
+typedef std::map<std::string, std::string> SurveyStringData;
+
 // This class provides the client side logic for determining if a
 // survey should be shown for any trigger based on input from a finch
 // configuration. It is created on a per profile basis.
@@ -66,13 +73,16 @@
     // Constructs a SurveyConfig by inspecting |feature|. This includes checking
     // if the feature is enabled, as well as inspecting the feature parameters
     // for the survey probability, and if |presupplied_trigger_id| is not
-    // provided, the trigger ID.
+    // provided, the trigger ID. To pass any product specific data for the
+    // survey, configure fields here, matches are CHECK enforced.
     SurveyConfig(
         const base::Feature* feature,
         const std::string& trigger,
         const absl::optional<std::string>& presupplied_trigger_id =
             absl::nullopt,
-        const std::vector<std::string>& product_specific_data_fields = {});
+        const std::vector<std::string>& product_specific_bits_data_fields = {},
+        const std::vector<std::string>& product_specific_string_data_fields =
+            {});
     SurveyConfig();
     SurveyConfig(const SurveyConfig&);
     ~SurveyConfig();
@@ -93,9 +103,13 @@
     // to take the survey e.g. clicking a link.
     bool user_prompted = false;
 
-    // Product Specific Data fields which are sent with the survey
+    // Product Specific Bit Data fields which are sent with the survey
     // response.
-    std::vector<std::string> product_specific_data_fields;
+    std::vector<std::string> product_specific_bits_data_fields;
+
+    // Product Specific String Data fields which are sent with the survey
+    // response.
+    std::vector<std::string> product_specific_string_data_fields;
   };
 
   struct SurveyMetadata {
@@ -117,7 +131,8 @@
     DelayedSurveyTask(HatsService* hats_service,
                       const std::string& trigger,
                       content::WebContents* web_contents,
-                      const std::map<std::string, bool>& product_specific_data);
+                      const SurveyBitsData& product_specific_bits_data,
+                      const SurveyStringData& product_specific_string_data);
 
     // Not copyable or movable
     DelayedSurveyTask(const DelayedSurveyTask&) = delete;
@@ -143,7 +158,8 @@
    private:
     HatsService* hats_service_;
     std::string trigger_;
-    std::map<std::string, bool> product_specific_data_;
+    SurveyBitsData product_specific_bits_data_;
+    SurveyStringData product_specific_string_data_;
     base::WeakPtrFactory<DelayedSurveyTask> weak_ptr_factory_{this};
   };
 
@@ -179,14 +195,16 @@
   // Launches survey with identifier |trigger| if appropriate.
   // |success_callback| is called when the survey is shown to the user.
   // |failure_callback| is called if the survey does not launch for any reason.
-  // |product_specific_data| should contain key-value pairs where the keys match
-  // the field names set for the survey in hats_service.cc, and the values are
-  // those which will be associated with the survey response.
+  // |product_specific_bits_data| and |product_specific_string_data| must
+  // contain key-value pairs where the keys match the field names set for the
+  // survey in hats_service.cc, and the values are those which will be
+  // associated with the survey response. Field's matches are CHECK enforced.
   virtual void LaunchSurvey(
       const std::string& trigger,
       base::OnceClosure success_callback = base::DoNothing(),
       base::OnceClosure failure_callback = base::DoNothing(),
-      const std::map<std::string, bool>& product_specific_data = {});
+      const SurveyBitsData& product_specific_bits_data = {},
+      const SurveyStringData& product_specific_string_data = {});
 
   // Launches survey (with id |trigger|) with a timeout |timeout_ms| if
   // appropriate. Survey will be shown at the active window/tab by the
@@ -195,7 +213,8 @@
   virtual bool LaunchDelayedSurvey(
       const std::string& trigger,
       int timeout_ms,
-      const std::map<std::string, bool>& product_specific_data = {});
+      const SurveyBitsData& product_specific_bits_data = {},
+      const SurveyStringData& product_specific_string_data = {});
 
   // Launches survey (with id |trigger|) with a timeout |timeout_ms| for tab
   // |web_contents| if appropriate. |web_contents| required to be non-nullptr.
@@ -208,7 +227,8 @@
       const std::string& trigger,
       content::WebContents* web_contents,
       int timeout_ms,
-      const std::map<std::string, bool>& product_specific_data = {});
+      const SurveyBitsData& product_specific_bits_data = {},
+      const SurveyStringData& product_specific_string_data = {});
 
   // Updates the user preferences to record that the survey associated with
   // |survey_id| was shown to the user. |trigger_id| is the HaTS next Trigger
@@ -249,14 +269,16 @@
   void LaunchSurveyForWebContents(
       const std::string& trigger,
       content::WebContents* web_contents,
-      const std::map<std::string, bool>& product_specific_data);
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data);
 
   void LaunchSurveyForBrowser(
       Browser* browser,
       const std::string& trigger,
       base::OnceClosure success_callback,
       base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data);
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data);
 
   // Returns true is the survey trigger specified should be shown.
   bool ShouldShowSurvey(const std::string& trigger) const;
@@ -264,12 +286,14 @@
   // Check whether the survey is reachable and under capacity and show it.
   // |success_callback| is called when the survey is shown to the user.
   // |failure_callback| is called if the survey does not launch for any reason.
+  // The matches of field names with the `SurveyConfig` are CHECK enforced.
   void CheckSurveyStatusAndMaybeShow(
       Browser* browser,
       const std::string& trigger,
       base::OnceClosure success_callback,
       base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data);
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data);
 
   // Remove |task| from the set of |pending_tasks_|.
   void RemoveTask(const DelayedSurveyTask& task);
diff --git a/chrome/browser/ui/hats/mock_hats_service.h b/chrome/browser/ui/hats/mock_hats_service.h
index 01d0af7..916eb1a 100644
--- a/chrome/browser/ui/hats/mock_hats_service.h
+++ b/chrome/browser/ui/hats/mock_hats_service.h
@@ -27,20 +27,23 @@
               (const std::string& trigger,
                base::OnceClosure success_callback,
                base::OnceClosure failure_callback,
-               (const std::map<std::string, bool>&)survey_specific_data),
+               (const SurveyBitsData&)survey_specific_bits_data,
+               (const SurveyStringData&)survey_specific_string_data),
               (override));
   MOCK_METHOD(bool,
               LaunchDelayedSurvey,
               (const std::string& trigger,
                int timeout_ms,
-               (const std::map<std::string, bool>&)survey_specific_data),
+               (const SurveyBitsData&)survey_specific_bits_data,
+               (const SurveyStringData&)survey_specific_string_data),
               (override));
   MOCK_METHOD(bool,
               LaunchDelayedSurveyForWebContents,
               (const std::string& trigger,
                content::WebContents* web_contents,
                int timeout_ms,
-               (const std::map<std::string, bool>&)survey_specific_data),
+               (const SurveyBitsData&)survey_specific_bits_data,
+               (const SurveyStringData&)survey_specific_string_data),
               (override));
   MOCK_METHOD(void, HatsNextDialogClosed, (), (override));
   MOCK_METHOD(bool, CanShowAnySurvey, (bool user_prompted), (const override));
diff --git a/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc b/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
index b9c33c6..b8057da 100644
--- a/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
+++ b/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
@@ -16,6 +16,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test.h"
 
+using ::testing::_;
+
 class TrustSafetySentimentServiceBrowserTest : public InProcessBrowserTest {
  public:
   TrustSafetySentimentServiceBrowserTest() {
@@ -28,7 +30,7 @@
     mock_hats_service_ = static_cast<MockHatsService*>(
         HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             browser()->profile(), base::BindRepeating(&BuildMockHatsService)));
-    EXPECT_CALL(*mock_hats_service_, CanShowAnySurvey(testing::_))
+    EXPECT_CALL(*mock_hats_service_, CanShowAnySurvey(_))
         .WillRepeatedly(testing::Return(true));
   }
 
@@ -77,12 +79,11 @@
   // Check that after opening Page Info for the required time, then performing
   // the required eligibility actions, a survey is requested from the HaTS
   // service.
-  std::map<std::string, bool> expected_product_specific_data = {
+  SurveyBitsData expected_product_specific_data = {
       {"Interacted with Page Info", false}};
-  EXPECT_CALL(
-      *mock_hats_service_,
-      LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface, testing::_,
-                   testing::_, expected_product_specific_data));
+  EXPECT_CALL(*mock_hats_service_,
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface, _, _,
+                           expected_product_specific_data, _));
   {
     base::subtle::ScopedTimeClockOverrides override(
         []() {
@@ -122,12 +123,11 @@
   // Check that interacting with page info (through a reported change to
   // permissions in this instance) removes the time requirement, and also
   // changes the product specific data accordingly.
-  std::map<std::string, bool> expected_product_specific_data = {
+  SurveyBitsData expected_product_specific_data = {
       {"Interacted with Page Info", true}};
-  EXPECT_CALL(
-      *mock_hats_service_,
-      LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface, testing::_,
-                   testing::_, expected_product_specific_data));
+  EXPECT_CALL(*mock_hats_service_,
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface, _, _,
+                           expected_product_specific_data, _));
 
   {
     base::subtle::ScopedTimeClockOverrides override(
diff --git a/chrome/browser/ui/hats/trust_safety_sentiment_service_unittest.cc b/chrome/browser/ui/hats/trust_safety_sentiment_service_unittest.cc
index 1b4c66a..5409069 100644
--- a/chrome/browser/ui/hats/trust_safety_sentiment_service_unittest.cc
+++ b/chrome/browser/ui/hats/trust_safety_sentiment_service_unittest.cc
@@ -25,13 +25,15 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
+using ::testing::_;
+
 class TrustSafetySentimentServiceTest : public testing::Test {
  public:
   TrustSafetySentimentServiceTest() {
     mock_hats_service_ = static_cast<MockHatsService*>(
         HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             profile(), base::BindRepeating(&BuildMockHatsService)));
-    EXPECT_CALL(*mock_hats_service(), CanShowAnySurvey(testing::_))
+    EXPECT_CALL(*mock_hats_service(), CanShowAnySurvey(_))
         .WillRepeatedly(testing::Return(true));
   }
 
@@ -122,9 +124,7 @@
   params.ntp_visits_max_range = "2";
   SetupFeatureParameters(params);
 
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
 
   service()->TriggerOccurred(
       TrustSafetySentimentService::FeatureArea::kPrivacySettings, {});
@@ -142,8 +142,7 @@
                   {});
 
   // The next NTP should be eligible for a survey.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_));
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _));
   service()->OpenedNewTabPage();
 }
 
@@ -159,9 +158,7 @@
   params.ntp_visits_max_range = "0";
   SetupFeatureParameters(params);
 
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->TriggerOccurred(
       TrustSafetySentimentService::FeatureArea::kPrivacySettings, {});
   service()->OpenedNewTabPage();
@@ -175,9 +172,9 @@
   // Moving the clock forward such that only the trusted surface trigger is
   // within the window should guarantee it is the survey shown.
   task_environment()->AdvanceClock(base::TimeDelta::FromMinutes(9));
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyTrustedSurface, _, _, _, _));
   service()->OpenedNewTabPage();
 
   CheckHistograms({TrustSafetySentimentService::FeatureArea::kPrivacySettings,
@@ -187,9 +184,7 @@
 
 TEST_F(TrustSafetySentimentServiceTest, TriggerProbability) {
   // Triggers which fail the probability check should not be considered.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   FeatureParams params;
   params.trusted_surface_probability = "0.0";
   params.min_time_to_prompt = "0s";
@@ -224,8 +219,7 @@
 
   // The launched survey will be randomly selected from the two triggers.
   std::string requested_survey_trigger;
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _))
       .WillOnce(testing::SaveArg<0>(&requested_survey_trigger));
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
@@ -236,16 +230,14 @@
 
   // The trigger which did not result in a survey should no longer be
   // considered.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
 
   // Repeated triggers post survey launch should however be considered.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions, _, _, _, _));
   service()->TriggerOccurred(
       TrustSafetySentimentService::FeatureArea::kTransactions, {});
   service()->OpenedNewTabPage();
@@ -275,18 +267,16 @@
 
   // Interacting with setting shouldn't causes a survey to be immediately
   // displayed, but should require the user to stay on settings for some time.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->InteractedWithPrivacySettings(web_contents.get());
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
 
   // Once the user has spent the appropriate amount of time on settings, they
   // should be eligible for a survey.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _, _, _));
   task_environment()->AdvanceClock(base::TimeDelta::FromSeconds(20));
   task_environment()->RunUntilIdle();
   service()->OpenedNewTabPage();
@@ -294,9 +284,7 @@
 
   // Leaving settings before the required time should disqualify the user from
   // receiving a survey.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->InteractedWithPrivacySettings(web_contents.get());
   task_environment()->AdvanceClock(base::TimeDelta::FromSeconds(5));
   task_environment()->RunUntilIdle();
@@ -329,9 +317,7 @@
 
   // A survey should not be shown unless the user spends at least the required
   // time on settings after opening password manager.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->OpenedPasswordManager(web_contents.get());
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
@@ -339,10 +325,10 @@
   // Once the user has spent sufficient time on settings after visiting the
   // password manager, they should be eligible for the Transactions copy of the
   // survey.
-  std::map<std::string, bool> expected_psd = {{"Saved password", false}};
+  SurveyBitsData expected_psd = {{"Saved password", false}};
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions, _, _,
+                           expected_psd, _));
 
   task_environment()->AdvanceClock(base::TimeDelta::FromSeconds(20));
   task_environment()->RunUntilIdle();
@@ -351,9 +337,7 @@
 
   // Leaving settings before the required time should not make the user
   // eligible.
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->OpenedPasswordManager(web_contents.get());
   task_environment()->AdvanceClock(base::TimeDelta::FromSeconds(5));
   task_environment()->RunUntilIdle();
@@ -376,9 +360,9 @@
   params.ntp_visits_max_range = "0";
   SetupFeatureParameters(params);
 
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _, _, _));
   service()->RanSafetyCheck();
   service()->OpenedNewTabPage();
 }
@@ -393,11 +377,11 @@
   params.ntp_visits_max_range = "0";
   SetupFeatureParameters(params);
 
-  std::map<std::string, bool> expected_psd = {{"Saved password", true}};
+  SurveyBitsData expected_psd = {{"Saved password", true}};
 
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions, _, _,
+                           expected_psd, _));
   service()->SavedPassword();
   service()->OpenedNewTabPage();
 }
@@ -412,11 +396,11 @@
   params.ntp_visits_max_range = "0";
   SetupFeatureParameters(params);
 
-  std::map<std::string, bool> expected_psd = {{"Saved password", false}};
+  SurveyBitsData expected_psd = {{"Saved password", false}};
 
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyTransactions, _, _,
+                           expected_psd, _));
   service()->SavedCard();
   service()->OpenedNewTabPage();
 }
@@ -438,13 +422,13 @@
   content::WebContentsTester::For(web_contents.get())
       ->SetLastCommittedURL(GURL(chrome::kChromeUISettingsURL));
 
-  std::map<std::string, bool> expected_psd = {{"Non default setting", false},
-                                              {"Ran safety check", false}};
+  SurveyBitsData expected_psd = {{"Non default setting", false},
+                                 {"Ran safety check", false}};
 
   // By default, a user should have no non-default settings.
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->InteractedWithPrivacySettings(web_contents.get());
   task_environment()->RunUntilIdle();
   service()->OpenedNewTabPage();
@@ -452,8 +436,8 @@
 
   expected_psd["Ran safety check"] = true;
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->RanSafetyCheck();
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
@@ -465,8 +449,8 @@
   content_settings->SetDefaultContentSetting(
       ContentSettingsType::SOUND, ContentSetting::CONTENT_SETTING_BLOCK);
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->RanSafetyCheck();
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
@@ -478,8 +462,8 @@
   profile()->GetTestingPrefService()->SetUserPref(
       prefs::kEnableDoNotTrack, std::make_unique<base::Value>(true));
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->InteractedWithPrivacySettings(web_contents.get());
   task_environment()->RunUntilIdle();
   service()->OpenedNewTabPage();
@@ -491,8 +475,8 @@
       unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
       std::make_unique<base::Value>(true));
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->InteractedWithPrivacySettings(web_contents.get());
   task_environment()->RunUntilIdle();
   service()->OpenedNewTabPage();
@@ -501,8 +485,8 @@
   // UKM is only non default while no sync consent is present.
   expected_psd["Non default setting"] = false;
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   profile()->GetTestingPrefService()->SetUserPref(
       prefs::kGoogleServicesConsentedToSync,
       std::make_unique<base::Value>(true));
@@ -523,8 +507,8 @@
       content_settings, std::move(managed_provider),
       HostContentSettingsMap::POLICY_PROVIDER);
   EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, expected_psd));
+              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _,
+                           expected_psd, _));
   service()->InteractedWithPrivacySettings(web_contents.get());
   task_environment()->RunUntilIdle();
   service()->OpenedNewTabPage();
@@ -542,17 +526,15 @@
   auto* otr_profile =
       profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true);
 
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->RanSafetyCheck();
   service()->OpenedNewTabPage();
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
 
   profile()->DestroyOffTheRecordProfile(otr_profile);
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _, _, _));
   service()->OpenedNewTabPage();
   CheckHistograms({TrustSafetySentimentService::FeatureArea::kPrivacySettings,
                    TrustSafetySentimentService::FeatureArea::kIneligible},
@@ -571,9 +553,7 @@
 
   auto* otr_profile =
       profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true);
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(testing::_, testing::_, testing::_, testing::_))
-      .Times(0);
+  EXPECT_CALL(*mock_hats_service(), LaunchSurvey(_, _, _, _, _)).Times(0);
   service()->RanSafetyCheck();
 
   // Record 2 visits to the NTP so regardless of the random NTP count chosen,
@@ -600,9 +580,9 @@
   // Up to this point no attempt to show any survey should have been made.
   testing::Mock::VerifyAndClearExpectations(mock_hats_service());
 
-  EXPECT_CALL(*mock_hats_service(),
-              LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings,
-                           testing::_, testing::_, testing::_));
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerTrustSafetyPrivacySettings, _, _, _, _));
 
   // The next tab open which occurs after the required number of opens, and the
   // minimum time has passed, should trigger a survey.
diff --git a/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc b/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
index e9161cb..12b2ee6 100644
--- a/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
+++ b/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
@@ -383,7 +383,9 @@
   JavaScriptDialogForPrerenderTest()
       : prerender_helper_(
             base::BindRepeating(&JavaScriptDialogForPrerenderTest::web_contents,
-                                base::Unretained(this))) {}
+                                base::Unretained(this))) {
+    feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
+  }
 
   void SetUp() override {
     prerender_helper_.SetUp(embedded_test_server());
@@ -400,6 +402,7 @@
  protected:
   content::WebContents* web_contents_ = nullptr;
   content::test::PrerenderTestHelper prerender_helper_;
+  base::test::ScopedFeatureList feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(JavaScriptDialogForPrerenderTest, NoDismissalDialog) {
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.cc b/chrome/browser/ui/omnibox/omnibox_theme.cc
index 67bbeb3..d17c67f 100644
--- a/chrome/browser/ui/omnibox/omnibox_theme.cc
+++ b/chrome/browser/ui/omnibox/omnibox_theme.cc
@@ -58,8 +58,6 @@
       return OmniboxFieldTrial::IsExperimentalKeywordModeEnabled()
                  ? TP::COLOR_OMNIBOX_BUBBLE_OUTLINE_EXPERIMENTAL_KEYWORD_MODE
                  : TP::COLOR_OMNIBOX_BUBBLE_OUTLINE;
-    case OmniboxPart::RESULTS_SELECTION_INDICATOR:
-      return TP::COLOR_OMNIBOX_RESULTS_SELECTION_INDICATOR;
     case OmniboxPart::RESULTS_BUTTON_BORDER:
       return TP::COLOR_OMNIBOX_RESULTS_BUTTON_BORDER;
     default:
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.h b/chrome/browser/ui/omnibox/omnibox_theme.h
index d6e03c09..7f5550a2 100644
--- a/chrome/browser/ui/omnibox/omnibox_theme.h
+++ b/chrome/browser/ui/omnibox/omnibox_theme.h
@@ -26,7 +26,6 @@
   RESULTS_TEXT_DEFAULT,
   RESULTS_TEXT_DIMMED,
   RESULTS_TEXT_URL,
-  RESULTS_SELECTION_INDICATOR,  // Vertical bar indicating focus
   RESULTS_BUTTON_BORDER,
 };
 
diff --git a/chrome/browser/ui/sharing_hub/sharing_hub_sub_menu_model.cc b/chrome/browser/ui/sharing_hub/sharing_hub_sub_menu_model.cc
index 26f289f..438a4aa 100644
--- a/chrome/browser/ui/sharing_hub/sharing_hub_sub_menu_model.cc
+++ b/chrome/browser/ui/sharing_hub/sharing_hub_sub_menu_model.cc
@@ -80,7 +80,8 @@
   for (auto action : third_party_actions) {
     if (action.third_party_icon.isNull()) {
       AddItemWithIcon(action.command_id, action.title,
-                      ui::ImageModel::FromVectorIcon(*action.icon));
+                      ui::ImageModel::FromVectorIcon(*action.icon, /*color*/ -1,
+                                                     /*icon_size*/ 16));
     } else {
       AddItemWithIcon(action.command_id, action.title,
                       ui::ImageModel::FromImageSkia(action.third_party_icon));
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index 11b5d97..fe5fcb71 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -90,6 +90,7 @@
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
+#include "components/accuracy_tips/features.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/blocked_content/popup_blocker_tab_helper.h"
@@ -437,7 +438,9 @@
     defined(OS_CHROMEOS)
   if (base::FeatureList::IsEnabled(
           features::kHappinessTrackingSurveysForDesktopDemo) ||
-      base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurvey)) {
+      base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurvey) ||
+      base::FeatureList::IsEnabled(
+          accuracy_tips::features::kAccuracyTipsSurveyFeature)) {
     HatsHelper::CreateForWebContents(web_contents);
   }
 #endif
diff --git a/chrome/browser/ui/tab_ui_helper_browsertest.cc b/chrome/browser/ui/tab_ui_helper_browsertest.cc
index 6a62f812..506ae976 100644
--- a/chrome/browser/ui/tab_ui_helper_browsertest.cc
+++ b/chrome/browser/ui/tab_ui_helper_browsertest.cc
@@ -26,6 +26,7 @@
       const TabUIHelperWithPrerenderingTest&) = delete;
 
   void SetUp() override {
+    feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
     prerender_test_helper_.SetUp(embedded_test_server());
     InProcessBrowserTest::SetUp();
   }
@@ -45,6 +46,7 @@
 
  private:
   content::test::PrerenderTestHelper prerender_test_helper_;
+  base::test::ScopedFeatureList feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(TabUIHelperWithPrerenderingTest,
diff --git a/chrome/browser/ui/views/chrome_typography.cc b/chrome/browser/ui/views/chrome_typography.cc
index de00af33..2383687 100644
--- a/chrome/browser/ui/views/chrome_typography.cc
+++ b/chrome/browser/ui/views/chrome_typography.cc
@@ -100,21 +100,14 @@
       details.size_delta = 15 - gfx::PlatformFont::kDefaultBaseFontSize;
       break;
 #endif
-    case CONTEXT_IPH_BUBBLE_TITLE: {
+    case CONTEXT_IPH_BUBBLE_TITLE:
       details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(18);
       break;
-    }
-    case CONTEXT_IPH_BUBBLE_BODY_WITH_TITLE: {
-      details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(13);
-      break;
-    }
-    case CONTEXT_IPH_BUBBLE_BODY_WITHOUT_TITLE: {
+    case CONTEXT_IPH_BUBBLE_BODY:
       details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
       break;
-    }
-    case CONTEXT_IPH_BUBBLE_BUTTON: {
+    case CONTEXT_IPH_BUBBLE_BUTTON:
       details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(13);
       break;
-    }
   }
 }
diff --git a/chrome/browser/ui/views/chrome_typography.h b/chrome/browser/ui/views/chrome_typography.h
index 169e258..7db9e8a8 100644
--- a/chrome/browser/ui/views/chrome_typography.h
+++ b/chrome/browser/ui/views/chrome_typography.h
@@ -61,11 +61,8 @@
   // Title label in the IPH bubble. Usually 18pt.
   CONTEXT_IPH_BUBBLE_TITLE,
 
-  // Body text label in the IPH bubble when a title exists. Usually 13pt.
-  CONTEXT_IPH_BUBBLE_BODY_WITH_TITLE,
-
-  // Body text label in the IPH bubble when no title exists. Usually 14pt.
-  CONTEXT_IPH_BUBBLE_BODY_WITHOUT_TITLE,
+  // Body text label in the IPH bubble. Usually 14pt.
+  CONTEXT_IPH_BUBBLE_BODY,
 
   // Button label in the IPH bubble. Usually 13pt.
   CONTEXT_IPH_BUBBLE_BUTTON
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index dec9e3a..b4fe312cc 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3624,12 +3624,12 @@
     const std::string& site_id,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data) {
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data) {
   // Self deleting on close.
   new HatsNextWebDialog(browser(), site_id, std::move(success_callback),
-                        std::move(failure_callback), product_specific_data
-
-  );
+                        std::move(failure_callback), product_specific_bits_data,
+                        product_specific_string_data);
 }
 
 void BrowserView::ShowIncognitoClearBrowsingDataDialog() {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 820e06d..dcbd116 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -510,7 +510,8 @@
       const std::string& site_id,
       base::OnceClosure success_callback,
       base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data) override;
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data) override;
   ExclusiveAccessContext* GetExclusiveAccessContext() override;
   std::string GetWorkspace() const override;
   bool IsVisibleOnAllWorkspaces() const override;
diff --git a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
index b228b4ecf..5c9a4ec2 100644
--- a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
+++ b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
@@ -15,7 +15,8 @@
 #include "chrome/common/pref_names.h"
 #include "ui/views/widget/widget.h"
 
-#if defined(USE_OZONE)
+#if defined(USE_OZONE) && \
+    !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS))
 #include "ui/base/ui_base_features.h"
 #include "ui/ozone/public/ozone_platform.h"
 #endif
@@ -62,19 +63,21 @@
 }
 
 bool DesktopBrowserFrameAuraLinux::UseCustomFrame() const {
+#if defined(USE_OZONE) && \
+    !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS))
+  // If the platform suggests using the custom frame, likely it lacks native
+  // decorations.  In such an event, return true and ignore the user preference.
+  if (features::IsUsingOzonePlatform() &&
+      ui::OzonePlatform::GetInstance()->ShouldUseCustomFrame()) {
+    return true;
+  }
+#endif
+
   // Normal browser windows get a custom frame (per the user's preference).
   if (use_custom_frame_pref_.GetValue() && browser_view()->GetIsNormalType()) {
     return true;
   }
 
-#if defined(USE_OZONE)
-  if (features::IsUsingOzonePlatform() &&
-      ui::OzonePlatform::GetInstance()->ShouldUseCustomFrame() &&
-      !browser_view()->browser()->is_type_normal()) {
-    return true;
-  }
-#endif
-
   // Hosted app windows get a custom frame (if the desktop PWA experimental
   // feature is enabled).
   return browser_view()->GetIsWebAppType();
diff --git a/chrome/browser/ui/views/frame/system_menu_model_builder.cc b/chrome/browser/ui/views/frame/system_menu_model_builder.cc
index 5cb8a85..6c62f02 100644
--- a/chrome/browser/ui/views/frame/system_menu_model_builder.cc
+++ b/chrome/browser/ui/views/frame/system_menu_model_builder.cc
@@ -44,6 +44,12 @@
 #include "chrome/browser/lacros/move_to_desks_menu_delegate_lacros.h"
 #endif
 
+#if defined(USE_OZONE) && \
+    !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS))
+#include "ui/base/ui_base_features.h"
+#include "ui/ozone/public/ozone_platform.h"
+#endif
+
 namespace {
 
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -124,8 +130,20 @@
 // of lacros-chrome is complete.
 #if defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
   model->AddSeparator(ui::NORMAL_SEPARATOR);
-  model->AddCheckItemWithStringId(IDC_USE_SYSTEM_TITLE_BAR,
-                                  IDS_SHOW_WINDOW_DECORATIONS_MENU);
+  bool supports_server_side_decorations = true;
+#if defined(USE_OZONE) && \
+    !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS))
+  if (features::IsUsingOzonePlatform()) {
+    supports_server_side_decorations =
+        ui::OzonePlatform::GetInstance()
+            ->GetPlatformRuntimeProperties()
+            .supports_server_side_window_decorations;
+  }
+#endif
+  if (supports_server_side_decorations) {
+    model->AddCheckItemWithStringId(IDC_USE_SYSTEM_TITLE_BAR,
+                                    IDS_SHOW_WINDOW_DECORATIONS_MENU);
+  }
   model->AddSeparator(ui::NORMAL_SEPARATOR);
   model->AddItemWithStringId(IDC_CLOSE_WINDOW, IDS_CLOSE_WINDOW_MENU);
 #endif
diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_footer_view_unittest.cc b/chrome/browser/ui/views/global_media_controls/media_notification_footer_view_unittest.cc
index 4cb04cc..30603ad 100644
--- a/chrome/browser/ui/views/global_media_controls/media_notification_footer_view_unittest.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_notification_footer_view_unittest.cc
@@ -4,12 +4,19 @@
 
 #include "chrome/browser/ui/views/global_media_controls/media_notification_footer_view.h"
 
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
 #include "chrome/browser/ui/views/global_media_controls/media_notification_device_entry_ui.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/views/test/button_test_api.h"
 
+using testing::NiceMock;
+
 namespace {
 
 // A mock class for handling stop casting button.
@@ -53,7 +60,7 @@
   void CreateView(bool is_cast_session) {
     widget_ = CreateTestWidget();
     handler_ = std::make_unique<StopCastingHandler>();
-    delegate_ = std::make_unique<MockFooterViewDelegate>();
+    delegate_ = std::make_unique<NiceMock<MockFooterViewDelegate>>();
 
     view_ =
         widget_->SetContentsView(std::make_unique<MediaNotificationFooterView>(
diff --git a/chrome/browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc b/chrome/browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc
index f3a00095..48598c1 100644
--- a/chrome/browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc
+++ b/chrome/browser/ui/views/global_media_controls/overlay_media_notification_view_unittest.cc
@@ -14,6 +14,12 @@
 #include "ui/events/base_event_utils.h"
 #include "ui/views/widget/widget_delegate.h"
 
+#include <memory>
+#include <string>
+#include <utility>
+
+using testing::NiceMock;
+
 namespace {
 
 const char kTestNotificationId[] = "testid";
@@ -40,7 +46,7 @@
         media::kGlobalMediaControlsOverlayControls);
 
     manager_ = std::make_unique<MockOverlayMediaNotificationsManager>();
-    item_ = std::make_unique<MockMediaNotificationItem>();
+    item_ = std::make_unique<NiceMock<MockMediaNotificationItem>>();
 
     auto notification = std::make_unique<MediaNotificationContainerImplView>(
         kTestNotificationId, item_->GetWeakPtr(), nullptr,
diff --git a/chrome/browser/ui/views/hats/hats_browsertest.cc b/chrome/browser/ui/views/hats/hats_browsertest.cc
index 08b1ae15..9e971b4 100644
--- a/chrome/browser/ui/views/hats/hats_browsertest.cc
+++ b/chrome/browser/ui/views/hats/hats_browsertest.cc
@@ -38,10 +38,12 @@
 
 // The product specific data expected by the test survey. The boolean values are
 // checked in hats_next_mock.html.
-const std::map<std::string, bool> kHatsNextTestSurveyProductSpecificData{
+const SurveyBitsData kHatsNextTestSurveyProductSpecificBitsData{
     {"Test Field 1", true},
-    {"Test Field 2", false},
-    {"Test Field 3", true}};
+    {"Test Field 2", false}};
+
+const SurveyStringData kHatsNextTestSurveyProductSpecificStringData{
+    {"Test Field 3", "Test value"}};
 
 // The locale expected by the test survey. This value is checked in
 // hats_next_mock.html for tests that expect a loaded response.
@@ -51,21 +53,22 @@
 
 class MockHatsNextWebDialog : public HatsNextWebDialog {
  public:
-  MockHatsNextWebDialog(
-      Browser* browser,
-      const std::string& trigger_id,
-      const GURL& hats_survey_url,
-      const base::TimeDelta& timeout,
-      base::OnceClosure success_callback,
-      base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data)
+  MockHatsNextWebDialog(Browser* browser,
+                        const std::string& trigger_id,
+                        const GURL& hats_survey_url,
+                        const base::TimeDelta& timeout,
+                        base::OnceClosure success_callback,
+                        base::OnceClosure failure_callback,
+                        const SurveyBitsData& product_specific_bits_data,
+                        const SurveyStringData& product_specific_string_data)
       : HatsNextWebDialog(browser,
                           trigger_id,
                           hats_survey_url,
                           timeout,
                           std::move(success_callback),
                           std::move(failure_callback),
-                          product_specific_data) {}
+                          product_specific_bits_data,
+                          product_specific_string_data) {}
 
   MOCK_METHOD0(ShowWidget, void());
   MOCK_METHOD0(CloseWidget, void());
@@ -142,7 +145,8 @@
       browser(), kHatsNextSurveyTriggerIDTesting,
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), GetSuccessClosure(),
-      GetFailureClosure(), kHatsNextTestSurveyProductSpecificData);
+      GetFailureClosure(), kHatsNextTestSurveyProductSpecificBitsData,
+      kHatsNextTestSurveyProductSpecificStringData);
 
   // Check that no record of a survey being shown is present.
   const base::DictionaryValue* pref_data =
@@ -191,7 +195,7 @@
       browser(), "close_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), GetSuccessClosure(),
-      GetFailureClosure(), {});
+      GetFailureClosure(), {}, {});
 
   // The hats_next_mock.html will provide a state update to the dialog to
   // indicate that the survey window should be closed.
@@ -219,7 +223,8 @@
       browser(), kHatsNextSurveyTriggerIDTesting,
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), GetSuccessClosure(),
-      GetFailureClosure(), kHatsNextTestSurveyProductSpecificData);
+      GetFailureClosure(), kHatsNextTestSurveyProductSpecificBitsData,
+      kHatsNextTestSurveyProductSpecificStringData);
   dialog->WaitForClose();
 
   EXPECT_EQ(1, success_count);
@@ -242,7 +247,7 @@
       browser(), "invalid_test",
       embedded_test_server()->GetURL("/hats/non_existent.html"),
       base::TimeDelta::FromMilliseconds(1), GetSuccessClosure(),
-      GetFailureClosure(), {});
+      GetFailureClosure(), {}, {});
 
   dialog->WaitForClose();
 
@@ -263,7 +268,7 @@
       browser(), "invalid_url_fragment_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), GetSuccessClosure(),
-      GetFailureClosure(), {});
+      GetFailureClosure(), {}, {});
 
   dialog->WaitForClose();
   EXPECT_EQ(0, success_count);
@@ -277,7 +282,7 @@
       browser(), "open_new_web_contents_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing(),
-      {});
+      {}, {});
 
   // The mock hats dialog will push a close state after it has attempted to
   // open another web contents.
@@ -303,7 +308,7 @@
       devtools_browser, "open_new_web_contents_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing(),
-      {});
+      {}, {});
 
   // The mock hats dialog will push a close state after it has attempted to
   // open another web contents.
@@ -324,7 +329,7 @@
       browser(), "resize_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing(),
-      {});
+      {}, {});
 
   // Check that the dialog reports a preferred size the same as the size defined
   // in hats_next_mock.html.
@@ -349,7 +354,7 @@
       browser(), "resize_to_large_for_testing",
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing(),
-      {});
+      {}, {});
 
   // Check that the maximum size of the dialog is bounded appropriately by the
   // dialogs maximum size. Depending on renderer warm-up, an initial empty size
@@ -376,7 +381,8 @@
       browser(), kHatsNextSurveyTriggerIDTesting,
       embedded_test_server()->GetURL("/hats/hats_next_mock.html"),
       base::TimeDelta::FromSeconds(100), GetSuccessClosure(),
-      GetFailureClosure(), kHatsNextTestSurveyProductSpecificData);
+      GetFailureClosure(), kHatsNextTestSurveyProductSpecificBitsData,
+      kHatsNextTestSurveyProductSpecificStringData);
 
   // Allow the dialog to open before checking the zoom level of the contents.
   base::RunLoop run_loop;
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
index 69eac93..b7a3091 100644
--- a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
+++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
@@ -125,7 +125,8 @@
     const std::string& trigger_id,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data)
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data)
     : HatsNextWebDialog(
           browser,
           trigger_id,
@@ -133,7 +134,8 @@
           base::TimeDelta::FromSeconds(10),
           std::move(success_callback),
           std::move(failure_callback),
-          product_specific_data) {}
+          product_specific_bits_data,
+          product_specific_string_data) {}
 
 gfx::Size HatsNextWebDialog::CalculatePreferredSize() const {
   gfx::Size preferred_size = views::View::CalculatePreferredSize();
@@ -154,7 +156,8 @@
     const base::TimeDelta& timeout,
     base::OnceClosure success_callback,
     base::OnceClosure failure_callback,
-    const std::map<std::string, bool>& product_specific_data)
+    const SurveyBitsData& product_specific_bits_data,
+    const SurveyStringData& product_specific_string_data)
     : BubbleDialogDelegateView(
           browser->is_type_devtools()
               ? static_cast<views::View*>(
@@ -173,7 +176,8 @@
       timeout_(timeout),
       success_callback_(std::move(success_callback)),
       failure_callback_(std::move(failure_callback)),
-      product_specific_data_(product_specific_data) {
+      product_specific_bits_data_(product_specific_bits_data),
+      product_specific_string_data_(product_specific_string_data) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   otr_profile_->AddObserver(this);
   set_close_on_deactivate(false);
@@ -222,8 +226,10 @@
   // Append any Product Specific Data to the query. This will be interpreted
   // by the wrapper website and provided to the HaTS backend service.
   base::DictionaryValue dict;
-  for (const auto& field_value : product_specific_data_)
+  for (const auto& field_value : product_specific_bits_data_)
     dict.SetStringKey(field_value.first, field_value.second ? "true" : "false");
+  for (const auto& field_value : product_specific_string_data_)
+    dict.SetStringKey(field_value.first, field_value.second);
 
   std::string product_specific_data_json;
   base::JSONWriter::Write(dict, &product_specific_data_json);
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.h b/chrome/browser/ui/views/hats/hats_next_web_dialog.h
index ef7d730..c8f26fb48 100644
--- a/chrome/browser/ui/views/hats/hats_next_web_dialog.h
+++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_HATS_HATS_NEXT_WEB_DIALOG_H_
 
 #include "chrome/browser/profiles/profile_observer.h"
+#include "chrome/browser/ui/hats/hats_service.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -35,7 +36,8 @@
                     const std::string& trigger_id,
                     base::OnceClosure success_callback,
                     base::OnceClosure failure_callback,
-                    const std::map<std::string, bool>& product_specific_data);
+                    const SurveyBitsData& product_specific_bits_data,
+                    const SurveyStringData& product_specific_string_data);
   ~HatsNextWebDialog() override;
   HatsNextWebDialog(const HatsNextWebDialog&) = delete;
   HatsNextWebDialog& operator=(const HatsNextWebDialog&) = delete;
@@ -59,7 +61,8 @@
                     const base::TimeDelta& timeout,
                     base::OnceClosure success_callback,
                     base::OnceClosure failure_callback,
-                    const std::map<std::string, bool>& product_specific_data);
+                    const SurveyBitsData& product_specific_bits_data,
+                    const SurveyStringData& product_specific_string_data);
 
   class HatsWebView;
 
@@ -127,7 +130,8 @@
   base::OnceClosure success_callback_;
   base::OnceClosure failure_callback_;
 
-  std::map<std::string, bool> product_specific_data_;
+  SurveyBitsData product_specific_bits_data_;
+  SurveyStringData product_specific_string_data_;
 
   base::WeakPtrFactory<HatsNextWebDialog> weak_factory_{this};
 };
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
index ae04733..fac415d 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -47,6 +47,7 @@
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/flex_layout.h"
 #include "ui/views/metadata/type_conversion.h"
+#include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
 
 #if defined(OS_WIN)
@@ -107,7 +108,7 @@
   void OnThemeChanged() override {
     views::View::OnThemeChanged();
 
-    color_ = result_view_->GetColor(OmniboxPart::RESULTS_SELECTION_INDICATOR);
+    color_ = views::GetCascadingAccentColor(result_view_);
   }
 
  private:
diff --git a/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view.cc b/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view.cc
index d3441ff..5fc694b3 100644
--- a/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view.cc
+++ b/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view.cc
@@ -149,15 +149,17 @@
                                    /*adjust_height_for_width =*/true)
               .WithWeight(1));
 
-  // TODO(crbug.com/1210891): Replace placeholder strings.
-  AddChildView(
-      CreateRow(u"Who’s behind this information?", vector_icons::kGroupsIcon));
+  AddChildView(CreateRow(
+      l10n_util::GetStringUTF16(IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1),
+      vector_icons::kGroupsIcon));
 
-  AddChildView(CreateRow(u"What evidence supports it?",
-                         vector_icons::kTroubleshootIcon));
+  AddChildView(CreateRow(
+      l10n_util::GetStringUTF16(IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2),
+      vector_icons::kTroubleshootIcon));
 
-  AddChildView(
-      CreateRow(u"What do other sources say?", vector_icons::kFeedIcon));
+  AddChildView(CreateRow(
+      l10n_util::GetStringUTF16(IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3),
+      vector_icons::kFeedIcon));
 
   Layout();
   SizeToContents();
diff --git a/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view_browsertest.cc
index a646a6a..40c62fe 100644
--- a/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/accuracy_tip_bubble_view_browsertest.cc
@@ -18,6 +18,8 @@
 #include "chrome/browser/engagement/site_engagement_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
+#include "chrome/browser/ui/hats/mock_hats_service.h"
 #include "chrome/browser/ui/page_info/chrome_accuracy_tip_ui.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view_base.h"
@@ -38,6 +40,8 @@
 #include "ui/views/test/widget_test.h"
 #include "ui/views/test/widget_test_api.h"
 
+using ::testing::_;
+
 namespace {
 using accuracy_tips::AccuracyTipInteraction;
 using accuracy_tips::AccuracyTipStatus;
@@ -57,11 +61,13 @@
 
   void SetUp() override {
     ASSERT_TRUE(embedded_test_server()->Start());
-    feature_list_.InitAndEnableFeatureWithParameters(
-        safe_browsing::kAccuracyTipsFeature,
-        {{accuracy_tips::features::kSampleUrl.name,
-          GetUrl("badurl.com").spec()},
-         {accuracy_tips::features::kNumIgnorePrompts.name, "1"}});
+    const base::FieldTrialParams accuraty_tips_params = {
+        {accuracy_tips::features::kSampleUrl.name, GetUrl("badurl.com").spec()},
+        {accuracy_tips::features::kNumIgnorePrompts.name, "1"}};
+    feature_list_.InitWithFeaturesAndParameters(
+        {{safe_browsing::kAccuracyTipsFeature, accuraty_tips_params},
+         {accuracy_tips::features::kAccuracyTipsSurveyFeature, {}}},
+        {});
 
     // Disable "close on deactivation" since there seems to be an issue with
     // windows losing focus during tests.
@@ -72,6 +78,10 @@
 
   void SetUpOnMainThread() override {
     host_resolver()->AddRule("*", "127.0.0.1");
+
+    mock_hats_service_ = static_cast<MockHatsService*>(
+        HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+            browser()->profile(), base::BindRepeating(&BuildMockHatsService)));
   }
 
   void ClickExtraButton() {
@@ -85,10 +95,12 @@
   }
 
   base::HistogramTester* histogram_tester() { return &histogram_tester_; }
+  MockHatsService* mock_hats_service() { return mock_hats_service_; }
 
  private:
   base::test::ScopedFeatureList feature_list_;
   base::HistogramTester histogram_tester_;
+  MockHatsService* mock_hats_service_ = nullptr;
 };
 
 IN_PROC_BROWSER_TEST_F(AccuracyTipBubbleViewBrowserTest, NoShowOnRegularUrl) {
@@ -222,6 +234,26 @@
       AccuracyTipInteraction::kLearnMore, 1);
 }
 
+IN_PROC_BROWSER_TEST_F(AccuracyTipBubbleViewBrowserTest,
+                       SurveyShownAfterShowingTip) {
+  auto* service = AccuracyServiceFactory::GetForProfile(browser()->profile());
+  ui_test_utils::NavigateToURL(browser(), GetUrl("badurl.com"));
+  EXPECT_TRUE(IsUIShowing());
+
+  base::SimpleTestClock clock;
+  clock.SetNow(base::Time::Now());
+  service->SetClockForTesting(&clock);
+  clock.Advance(accuracy_tips::features::kMinTimeToShowSurvey.Get());
+
+  EXPECT_CALL(*mock_hats_service(),
+              LaunchSurvey(kHatsSurveyTriggerAccuracyTips, _, _, _, _));
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+  base::RunLoop().RunUntilIdle();
+}
+
 // Render test for accuracy tip ui.
 class AccuracyTipBubbleViewDialogBrowserTest : public DialogBrowserTest {
  public:
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
index 24d7c1f..ae36169 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
@@ -1655,6 +1655,7 @@
       const SafetyTipPageInfoBubbleViewPrerenderBrowserTest&) = delete;
 
   void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
     reputation::InitializeSafetyTipConfig();
     prerender_helper_.SetUp(embedded_test_server());
     InProcessBrowserTest::SetUp();
@@ -1674,6 +1675,7 @@
  private:
   content::WebContents* web_contents_ = nullptr;
   content::test::PrerenderTestHelper prerender_helper_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 // Tests that ReputationWebContentsObserver only checks heuristics when the
diff --git a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
index b62f963..b541988 100644
--- a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
@@ -23,17 +23,19 @@
     content::WebContents* web_contents,
     base::OnceClosure accept_callback,
     base::OnceClosure cancel_callback,
+    base::OnceClosure close_callback,
     base::OnceClosure open_now_callback) {
   constrained_window::ShowWebModalDialogViews(
-      new DeepScanningFailureModalDialog(std::move(accept_callback),
-                                         std::move(cancel_callback),
-                                         std::move(open_now_callback)),
+      new DeepScanningFailureModalDialog(
+          std::move(accept_callback), std::move(cancel_callback),
+          std::move(close_callback), std::move(open_now_callback)),
       web_contents);
 }
 
 DeepScanningFailureModalDialog::DeepScanningFailureModalDialog(
     base::OnceClosure accept_callback,
     base::OnceClosure cancel_callback,
+    base::OnceClosure close_callback,
     base::OnceClosure open_now_callback)
     : open_now_callback_(std::move(open_now_callback)) {
   SetModalType(ui::MODAL_TYPE_CHILD);
@@ -46,6 +48,7 @@
                      IDS_DEEP_SCANNING_TIMED_OUT_DIALOG_CANCEL_BUTTON));
   SetAcceptCallback(std::move(accept_callback));
   SetCancelCallback(std::move(cancel_callback));
+  SetCloseCallback(std::move(close_callback));
   SetExtraView(std::make_unique<views::MdTextButton>(
       base::BindRepeating(
           [](DeepScanningFailureModalDialog* dialog) {
diff --git a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.h b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.h
index 4f3ba96d..63edb8c 100644
--- a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.h
+++ b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.h
@@ -28,12 +28,14 @@
   static void ShowForWebContents(content::WebContents* web_contents,
                                  base::OnceClosure accept_callback,
                                  base::OnceClosure cancel_callback,
+                                 base::OnceClosure close_callback,
                                  base::OnceClosure open_now_callback);
 
   // Create a DeepScanningFailureModalDialog attached to |web_contents|. The
   // dialog will call |accept_callback| if the user accepts the prompt.
   DeepScanningFailureModalDialog(base::OnceClosure accept_callback,
                                  base::OnceClosure cancel_callback,
+                                 base::OnceClosure close_callback,
                                  base::OnceClosure open_now_callback);
   DeepScanningFailureModalDialog(const DeepScanningFailureModalDialog&) =
       delete;
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.cc b/chrome/browser/ui/views/tabs/tab_group_header.cc
index 646939c..e4ae185 100644
--- a/chrome/browser/ui/views/tabs/tab_group_header.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_header.cc
@@ -109,6 +109,10 @@
   views::HighlightPathGenerator::Install(
       this,
       std::make_unique<TabGroupHighlightPathGenerator>(title_chip_, title_));
+  // The tab group gets painted with a solid color that may not contrast well
+  // with the focus indicator, so draw an outline around the focus ring for it
+  // to contrast with the solid color.
+  SetProperty(views::kDrawFocusRingBackgroundOutline, true);
 
   SetEventTargeter(std::make_unique<views::ViewTargeter>(this));
 
diff --git a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc
index 314e9d9..2b651379 100644
--- a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc
+++ b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc
@@ -57,10 +57,10 @@
 constexpr int kBubbleMaxWidthDip = 340;
 
 // The insets from the bubble border to the text inside.
-constexpr gfx::Insets kBubbleContentsInsets(12, 16);
+constexpr gfx::Insets kBubbleContentsInsets(16, 20);
 
 // The insets from the button border to the text inside.
-constexpr gfx::Insets kBubbleButtonPadding(8, 10);
+constexpr gfx::Insets kBubbleButtonPadding(6, 16);
 
 // The text color of the button.
 constexpr SkColor kBubbleButtonTextColor = SK_ColorWHITE;
@@ -254,7 +254,6 @@
     }
   }
 
-  ChromeTextContext body_label_context;
   if (params.title_text.has_value()) {
     auto* title_label = AddChildView(std::make_unique<views::Label>(
         std::move(*params.title_text),
@@ -265,14 +264,10 @@
 
     if (params.preferred_width.has_value())
       title_label->SetMultiLine(true);
-
-    body_label_context = CONTEXT_IPH_BUBBLE_BODY_WITH_TITLE;
-  } else {
-    body_label_context = CONTEXT_IPH_BUBBLE_BODY_WITHOUT_TITLE;
   }
 
   auto* body_label = AddChildView(
-      std::make_unique<views::Label>(body_text, body_label_context));
+      std::make_unique<views::Label>(body_text, CONTEXT_IPH_BUBBLE_BODY));
   body_label->SetBackgroundColor(background_color);
   body_label->SetEnabledColor(text_color);
   body_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 779d10d4..b8751d3 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -60,7 +60,6 @@
 #include "chrome/browser/ui/webui/usb_internals/usb_internals_ui.h"
 #include "chrome/browser/ui/webui/user_actions/user_actions_ui.h"
 #include "chrome/browser/ui/webui/version/version_ui.h"
-#include "chrome/browser/ui/webui/whats_new/whats_new_ui.h"
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/buildflags.h"
@@ -144,6 +143,7 @@
 #include "chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.h"
 #include "chrome/browser/ui/webui/system_info_ui.h"
 #include "chrome/browser/ui/webui/tab_search/tab_search_ui.h"
+#include "chrome/browser/ui/webui/whats_new/whats_new_ui.h"
 #include "media/base/media_switches.h"
 #endif  // defined(OS_ANDROID)
 
@@ -1265,6 +1265,9 @@
   if (page_url.host_piece() == chrome::kChromeUINewTabPageHost)
     return NewTabPageUI::GetFaviconResourceBytes(scale_factor);
 
+  if (page_url.host_piece() == chrome::kChromeUIWhatsNewHost)
+    return WhatsNewUI::GetFaviconResourceBytes(scale_factor);
+
   // Bookmarks are part of NTP on Android.
   if (page_url.host_piece() == chrome::kChromeUIBookmarksHost)
     return BookmarksUI::GetFaviconResourceBytes(scale_factor);
diff --git a/chrome/browser/ui/webui/settings/captions_handler.cc b/chrome/browser/ui/webui/settings/captions_handler.cc
index 0d5117c..2c32738 100644
--- a/chrome/browser/ui/webui/settings/captions_handler.cc
+++ b/chrome/browser/ui/webui/settings/captions_handler.cc
@@ -85,6 +85,9 @@
 
 void CaptionsHandler::OnSodaLanguagePackInstalled(
     speech::LanguageCode language_code) {
+  if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage))
+    return;
+
   FireWebUIListener("soda-download-progress-changed",
                     base::Value(l10n_util::GetStringUTF16(
                         IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_COMPLETE)),
@@ -104,10 +107,10 @@
 
 void CaptionsHandler::OnSodaLanguagePackError(
     speech::LanguageCode language_code) {
-  if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
-    prefs_->SetBoolean(prefs::kLiveCaptionEnabled, false);
-  }
+  if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage))
+    return;
 
+  prefs_->SetBoolean(prefs::kLiveCaptionEnabled, false);
   FireWebUIListener("soda-download-progress-changed",
                     base::Value(l10n_util::GetStringUTF16(
                         IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR)),
@@ -125,6 +128,9 @@
 void CaptionsHandler::OnSodaLanguagePackProgress(
     int language_progress,
     speech::LanguageCode language_code) {
+  if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage))
+    return;
+
   FireWebUIListener("soda-download-progress-changed",
                     base::Value(l10n_util::GetStringFUTF16Int(
                         IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS,
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.cc b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.cc
index 7fc34c1..5fa8398 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.cc
@@ -130,5 +130,9 @@
   Observe(nullptr);
 }
 
+void AppNotificationHandler::NotifyPageReady() {
+  OnQuietModeChanged(ash::MessageCenterAsh::Get()->IsQuietMode());
+}
+
 }  // namespace settings
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.h b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.h
index 6553ae13..c56817a 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/app_notification_handler.h
@@ -46,6 +46,7 @@
 
   // settings::mojom::AppNotificationHandler:
   void SetQuietMode(bool in_quiet_mode) override;
+  void NotifyPageReady() override;
 
   // apps::AppRegistryCache::Observer:
   void OnAppUpdate(const apps::AppUpdate& update) override;
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/mojom/app_notification_handler.mojom b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/mojom/app_notification_handler.mojom
index 7116aa0..8908439 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_apps_page/mojom/app_notification_handler.mojom
+++ b/chrome/browser/ui/webui/settings/chromeos/os_apps_page/mojom/app_notification_handler.mojom
@@ -26,6 +26,9 @@
 // Interface for for fetching and setting App notification
 // properties in OSSettings.
 interface AppNotificationsHandler {
+  // Notify the App Notification Page of the quiet mode state.
+  NotifyPageReady();
+
   // Updates QuietMode to enabled or disabled based on toggle state.
   SetQuietMode(bool enabled);
 
diff --git a/chrome/browser/ui/webui/settings/hats_handler_unittest.cc b/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
index a801f015..76f21c8 100644
--- a/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
@@ -22,6 +22,8 @@
 #include "content/public/test/test_web_ui.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
+using ::testing::_;
+
 class Profile;
 
 namespace settings {
@@ -41,7 +43,7 @@
     mock_hats_service_ = static_cast<MockHatsService*>(
         HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             profile(), base::BindRepeating(&BuildMockHatsService)));
-    EXPECT_CALL(*mock_hats_service_, CanShowAnySurvey(testing::_))
+    EXPECT_CALL(*mock_hats_service_, CanShowAnySurvey(_))
         .WillRepeatedly(testing::Return(true));
 
     mock_sentiment_service_ = static_cast<MockTrustSafetySentimentService*>(
@@ -77,7 +79,7 @@
   profile()->GetPrefs()->SetInteger(
       prefs::kCookieControlsMode,
       static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty));
-  std::map<std::string, bool> expected_product_specific_data = {
+  SurveyBitsData expected_product_specific_data = {
       {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}};
 
   // Check that both interacting with the privacy card, and running Safety Check
@@ -85,7 +87,7 @@
   EXPECT_CALL(*mock_hats_service_,
               LaunchDelayedSurveyForWebContents(
                   kHatsSurveyTriggerSettingsPrivacy, web_contents(), 20000,
-                  expected_product_specific_data))
+                  expected_product_specific_data, _))
       .Times(2);
   base::Value args(base::Value::Type::LIST);
   args.Append(
@@ -105,8 +107,7 @@
   // Enable targeting for users who have not seen the Privacy Sandbox page and
   // ensure the handler does not attempt to launch the survey.
   EXPECT_CALL(*mock_hats_service_,
-              LaunchDelayedSurveyForWebContents(testing::_, testing::_,
-                                                testing::_, testing::_))
+              LaunchDelayedSurveyForWebContents(_, _, _, _, _))
       .Times(0);
 
   base::test::ScopedFeatureList::FeatureAndParams feature_and_params{
@@ -128,11 +129,12 @@
   profile()->GetPrefs()->SetInteger(
       prefs::kCookieControlsMode,
       static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty));
-  std::map<std::string, bool> expected_product_specific_data = {
+  SurveyBitsData expected_product_specific_data = {
       {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}};
-  EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(
-                                       kHatsSurveyTriggerPrivacySandbox,
-                                       web_contents(), 20000, expected_product_specific_data));
+  EXPECT_CALL(*mock_hats_service_,
+              LaunchDelayedSurveyForWebContents(
+                  kHatsSurveyTriggerPrivacySandbox, web_contents(), 20000,
+                  expected_product_specific_data, _));
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       HatsHandler::TrustSafetyInteraction::OPENED_PRIVACY_SANDBOX));
diff --git a/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc b/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
index bde9f8e..5ca2f79 100644
--- a/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc
@@ -54,7 +54,7 @@
       HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
           browser()->profile(), base::BindRepeating(&BuildMockHatsService)));
   EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(
-                                       kHatsSurveyTriggerSettings, _, _, _));
+                                       kHatsSurveyTriggerSettings, _, _, _, _));
   NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
   base::RunLoop().RunUntilIdle();
 }
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
index 0bc5e549..396b4d7 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
@@ -52,7 +52,7 @@
       {"tabCount", IDS_TAB_SEARCH_TAB_COUNT},
       {"recentlyClosed", IDS_TAB_SEARCH_RECENTLY_CLOSED},
       {"recentlyClosedExpandA11yLabel",
-       IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ENTRIES},
+       IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS},
   };
   source->AddLocalizedStrings(kStrings);
   source->AddBoolean("useRipples", views::PlatformStyle::kUseRipples);
diff --git a/chrome/browser/ui/webui/whats_new/whats_new_ui.cc b/chrome/browser/ui/webui/whats_new/whats_new_ui.cc
index f274e40..fe5726a 100644
--- a/chrome/browser/ui/webui/whats_new/whats_new_ui.cc
+++ b/chrome/browser/ui/webui/whats_new/whats_new_ui.cc
@@ -15,6 +15,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "chrome/grit/theme_resources.h"
 #include "chrome/grit/whats_new_resources.h"
 #include "chrome/grit/whats_new_resources_map.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -22,6 +23,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "ui/base/webui/web_ui_util.h"
 
 namespace {
@@ -54,6 +56,14 @@
   registry->RegisterIntegerPref(prefs::kLastWhatsNewVersion, 0);
 }
 
+// static
+base::RefCountedMemory* WhatsNewUI::GetFaviconResourceBytes(
+    ui::ResourceScaleFactor scale_factor) {
+  return static_cast<base::RefCountedMemory*>(
+      ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale(
+          IDR_NTP_FAVICON, scale_factor));
+}
+
 WhatsNewUI::WhatsNewUI(content::WebUI* web_ui) : WebUIController(web_ui) {
   content::WebUIDataSource* source =
       CreateWhatsNewUIHtmlSource(Profile::FromWebUI(web_ui));
diff --git a/chrome/browser/ui/webui/whats_new/whats_new_ui.h b/chrome/browser/ui/webui/whats_new/whats_new_ui.h
index f1af727..045fde50 100644
--- a/chrome/browser/ui/webui/whats_new/whats_new_ui.h
+++ b/chrome/browser/ui/webui/whats_new/whats_new_ui.h
@@ -7,6 +7,11 @@
 
 #include "base/macros.h"
 #include "content/public/browser/web_ui_controller.h"
+#include "ui/base/resource/scale_factor.h"
+
+namespace base {
+class RefCountedMemory;
+}
 
 namespace content {
 class WebUI;
@@ -22,6 +27,9 @@
 
   static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
 
+  static base::RefCountedMemory* GetFaviconResourceBytes(
+      ui::ResourceScaleFactor scale_factor);
+
   WhatsNewUI(const WhatsNewUI&) = delete;
   WhatsNewUI& operator=(const WhatsNewUI&) = delete;
 };
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
index f85710ea..4e2a37e 100644
--- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
@@ -1203,7 +1203,7 @@
    public:
     explicit MockNavigationHandle(const GURL& url)
         : content::MockNavigationHandle(url, nullptr) {}
-    bool IsInMainFrame() override { return IsInPrimaryMainFrame(); }
+    bool IsInMainFrame() const override { return IsInPrimaryMainFrame(); }
   };
 
   std::unique_ptr<content::WebContents> CreateTestWebContents() {
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index e4fd75c9..b20921d 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -334,9 +334,7 @@
   }
 
   if (!is_fuchsia) {
-    deps += [
-      "//components/crash/core/app",
-    ]
+    deps += [ "//components/crash/core/app" ]
   }
 
   if (is_mac) {
@@ -432,6 +430,8 @@
       "conflicts/remote_module_watcher_win.cc",
       "conflicts/remote_module_watcher_win.h",
       "multi_process_lock_win.cc",
+      "protobuf_init.cc",
+      "protobuf_init.h",
     ]
     deps += [
       "//chrome/chrome_elf:chrome_elf_main_include",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 99f0a7d..f1b3d5bb 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -541,6 +541,11 @@
 // When enabled, keeps Incognito UI consistent regardless of any selected theme.
 const base::Feature kIncognitoBrandConsistencyForAndroid{
     "IncognitoBrandConsistencyForAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// When enabled, user gets a new setting which allows them to gate their
+// existing Incognito tabs behind a reauthentication flow.
+const base::Feature kIncognitoReauthenticationForAndroid{
+    "IncognitoReauthenticationForAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
 #if defined(OS_MAC) || defined(OS_WIN) || defined(OS_LINUX) || \
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 6089313..60bd237 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -353,6 +353,9 @@
 #if defined(OS_ANDROID)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kIncognitoBrandConsistencyForAndroid;
+
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kIncognitoReauthenticationForAndroid;
 #endif
 
 #if defined(OS_MAC) || defined(OS_WIN) || defined(OS_LINUX) || \
diff --git a/chrome/common/protobuf_init.cc b/chrome/common/protobuf_init.cc
new file mode 100644
index 0000000..9a06624
--- /dev/null
+++ b/chrome/common/protobuf_init.cc
@@ -0,0 +1,35 @@
+// 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/common/protobuf_init.h"
+
+#include <google/protobuf/generated_message_util.h>
+#include "base/check.h"
+#include "base/threading/scoped_thread_priority.h"
+
+namespace chrome {
+namespace {
+
+using ScopedBoostThreadPriority =
+    base::internal::ScopedMayLoadLibraryAtBackgroundPriority;
+ScopedBoostThreadPriority* g_boost_thread_priority;
+
+void EnterInitSCC() {
+  DCHECK(!g_boost_thread_priority);
+  g_boost_thread_priority = new ScopedBoostThreadPriority(FROM_HERE, nullptr);
+}
+
+void LeaveInitSCC() {
+  DCHECK(g_boost_thread_priority);
+  delete g_boost_thread_priority;
+  g_boost_thread_priority = nullptr;
+}
+
+}  // namespace
+
+void InitializeProtobuf() {
+  google::protobuf::internal::RegisterInitSCCHooks(EnterInitSCC, LeaveInitSCC);
+}
+
+}  // namespace chrome
diff --git a/chrome/common/protobuf_init.h b/chrome/common/protobuf_init.h
new file mode 100644
index 0000000..818af37
--- /dev/null
+++ b/chrome/common/protobuf_init.h
@@ -0,0 +1,11 @@
+// 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 CHROME_COMMON_PROTOBUF_INIT_H_
+#define CHROME_COMMON_PROTOBUF_INIT_H_
+
+namespace chrome {
+void InitializeProtobuf();
+}  // namespace chrome
+#endif  // CHROME_COMMON_PROTOBUF_INIT_H_
diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc
index 9ce54a3..5184391 100644
--- a/chrome/installer/setup/setup_util.cc
+++ b/chrome/installer/setup/setup_util.cc
@@ -85,16 +85,8 @@
   delegate_execute_path.append(handler_class_uuid);
 
   // Delete both 64 and 32 keys to handle 32->64 or 64->32 migration.
-  for (REGSAM bitness : {KEY_WOW64_32KEY, KEY_WOW64_64KEY}) {
-    if (base::win::RegKey(root, delegate_execute_path.c_str(),
-                          KEY_QUERY_VALUE | bitness)
-            .Valid()) {
-      const bool success =
-          InstallUtil::DeleteRegistryKey(root, delegate_execute_path, bitness);
-      UMA_HISTOGRAM_BOOLEAN("Setup.Install.DeleteIExecuteCommandClassKey",
-                            success);
-    }
-  }
+  for (REGSAM bitness : {KEY_WOW64_32KEY, KEY_WOW64_64KEY})
+    InstallUtil::DeleteRegistryKey(root, delegate_execute_path, bitness);
 }
 
 // Remove the registration of profile statistics. This used to be reported to
@@ -145,13 +137,8 @@
   // Assume that non-Google is Chromium branding.
   std::wstring path(L"Software\\Chromium Binaries");
 #endif
-  if (base::win::RegKey(installer_state.root_key(), path.c_str(),
-                        KEY_QUERY_VALUE | KEY_WOW64_32KEY)
-          .Valid()) {
-    const bool success = InstallUtil::DeleteRegistryKey(
-        installer_state.root_key(), path, KEY_WOW64_32KEY);
-    UMA_HISTOGRAM_BOOLEAN("Setup.Install.DeleteBinariesClientsKey", success);
-  }
+  InstallUtil::DeleteRegistryKey(installer_state.root_key(), path,
+                                 KEY_WOW64_32KEY);
 }
 
 void RemoveAppLauncherVersionKey(const InstallerState& installer_state) {
@@ -160,31 +147,18 @@
   static constexpr wchar_t kLauncherGuid[] =
       L"{FDA71E6F-AC4C-4a00-8B70-9958A68906BF}";
 
-  std::wstring path = install_static::GetClientsKeyPath(kLauncherGuid);
-  if (base::win::RegKey(installer_state.root_key(), path.c_str(),
-                        KEY_QUERY_VALUE | KEY_WOW64_32KEY)
-          .Valid()) {
-    const bool succeeded = InstallUtil::DeleteRegistryKey(
-        installer_state.root_key(), path, KEY_WOW64_32KEY);
-    UMA_HISTOGRAM_BOOLEAN("Setup.Install.DeleteAppLauncherClientsKey",
-                          succeeded);
-  }
+  InstallUtil::DeleteRegistryKey(
+      installer_state.root_key(),
+      install_static::GetClientsKeyPath(kLauncherGuid), KEY_WOW64_32KEY);
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
 void RemoveLegacyChromeAppCommands(const InstallerState& installer_state) {
 // These app commands were only registered for Google Chrome.
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  std::wstring path(GetCommandKey(L"install-extension"));
-
-  if (base::win::RegKey(installer_state.root_key(), path.c_str(),
-                        KEY_QUERY_VALUE | KEY_WOW64_32KEY)
-          .Valid()) {
-    const bool succeeded = InstallUtil::DeleteRegistryKey(
-        installer_state.root_key(), path, KEY_WOW64_32KEY);
-    UMA_HISTOGRAM_BOOLEAN("Setup.Install.DeleteInstallExtensionCommand",
-                          succeeded);
-  }
+  InstallUtil::DeleteRegistryKey(installer_state.root_key(),
+                                 GetCommandKey(L"install-extension"),
+                                 KEY_WOW64_32KEY);
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index bdb6cdb..99cfd40 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2619,6 +2619,7 @@
       if (is_chromeos) {
         sources +=
             [ "../browser/extensions/clipboard_extension_apitest_chromeos.cc" ]
+        deps += [ "//chromeos/dbus/constants" ]
       }
 
       if (is_chromeos_ash) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java
index 123a999..302c525 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java
@@ -99,8 +99,11 @@
         mIsInitialized = isInitialized;
     }
 
-    public void setIsDestroyed(boolean isDestroyed) {
-        mIsDestroyed = isDestroyed;
+    @Override
+    public void destroy() {
+        mIsDestroyed = true;
+        for (TabObserver observer : mObservers) observer.onDestroyed(this);
+        mObservers.clear();
     }
 
     @Override
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index 537e7fe..00dfccb6 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -202,7 +202,8 @@
       const std::string& site_id,
       base::OnceClosure success_callback,
       base::OnceClosure failure_callback,
-      const std::map<std::string, bool>& product_specific_data) override {}
+      const SurveyBitsData& product_specific_bits_data,
+      const SurveyStringData& product_specific_string_data) override {}
 
   void ShowIncognitoClearBrowsingDataDialog() override {}
 #endif
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js
index 04bd394e..7f923d5 100644
--- a/chrome/test/data/extensions/api_test/autotest_private/test.js
+++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -976,6 +976,31 @@
       });
     });
   },
+  function stopSmoothnessTrackingMultiple() {
+    chrome.autotestPrivate.startSmoothnessTracking(async function() {
+      chrome.test.assertNoLastError();
+
+      // Wait for a few frames.
+      await raf();
+
+      // A few racing stopSmoothnessTracking calls.
+      const count = 3;
+      let promises = [];
+      for (let i = 0; i < count; ++i)
+        promises.push(promisify(chrome.autotestPrivate.stopSmoothnessTracking));
+
+      // Only one should succeed and no crashes/DCHECKs.
+      let success = 0;
+      for (let i = 0; i < count; ++i) {
+        try {
+          await promises[i];
+          ++success;
+        } catch(error) {}
+      }
+      chrome.test.assertEq(success, 1);
+      chrome.test.succeed();
+    });
+  },
 
   function collectThoughputTrackerData() {
     chrome.autotestPrivate.startThroughputTrackerDataCollection(function() {
diff --git a/chrome/test/data/hats/hats_next_mock.html b/chrome/test/data/hats/hats_next_mock.html
index fe1e9be..32829925 100644
--- a/chrome/test/data/hats/hats_next_mock.html
+++ b/chrome/test/data/hats/hats_next_mock.html
@@ -24,7 +24,7 @@
             JSON.parse(decodeURIComponent(params.get('languages')));
         if (productSpecificData['Test Field 1'] === 'true' &&
             productSpecificData['Test Field 2'] === 'false' &&
-            productSpecificData['Test Field 3'] === 'true' &&
+            productSpecificData['Test Field 3'] === 'Test value' &&
             languages.length == 1 && languages[0] == 'lt') {
           history.pushState('', '', '#loaded');
         }
diff --git a/chrome/test/data/pdf/accessibility/directional-text-runs-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/directional-text-runs-expected-uia-win.txt
index 443d1a3..cead382 100644
--- a/chrome/test/data/pdf/accessibility/directional-text-runs-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/directional-text-runs-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Hello,<newline> world!<newline><newline>Goodbye,<newline> world!<newline>'
diff --git a/chrome/test/data/pdf/accessibility/hello-world-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/hello-world-expected-uia-win.txt
index 5e72d6c6..ecad203 100644
--- a/chrome/test/data/pdf/accessibility/hello-world-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/hello-world-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Hello, world!'
diff --git a/chrome/test/data/pdf/accessibility/highlights-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/highlights-expected-uia-win.txt
index 9996ea4..92ec3eb 100644
--- a/chrome/test/data/pdf/accessibility/highlights-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/highlights-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Custom Name='Hello'
diff --git a/chrome/test/data/pdf/accessibility/image_alt_text-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/image_alt_text-expected-uia-win.txt
index e86141f0..a42c5892 100644
--- a/chrome/test/data/pdf/accessibility/image_alt_text-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/image_alt_text-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Image Name='Image 1'
diff --git a/chrome/test/data/pdf/accessibility/multi-page-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/multi-page-expected-uia-win.txt
index 54f6fe4..fd747c2 100644
--- a/chrome/test/data/pdf/accessibility/multi-page-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/multi-page-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 2 pages'
+++Document Name='PDF document containing 2 pages' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Page 1'
diff --git a/chrome/test/data/pdf/accessibility/overlapping-links-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/overlapping-links-expected-uia-win.txt
index 8d97687..38d2303 100644
--- a/chrome/test/data/pdf/accessibility/overlapping-links-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/overlapping-links-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Hyperlink Name='start first link start second link end second link end first link<newline>'
diff --git a/chrome/test/data/pdf/accessibility/paragraphs-and-heading-untagged-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/paragraphs-and-heading-untagged-expected-uia-win.txt
index 1eed1b2..1bf9606 100644
--- a/chrome/test/data/pdf/accessibility/paragraphs-and-heading-untagged-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/paragraphs-and-heading-untagged-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Text IsControlElement=false
 ++++++++Text Name='Heading<newline>' IsControlElement=false
diff --git a/chrome/test/data/pdf/accessibility/text-image-link-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/text-image-link-expected-uia-win.txt
index acfc618..a373f17 100644
--- a/chrome/test/data/pdf/accessibility/text-image-link-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/text-image-link-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 2 pages'
+++Document Name='PDF document containing 2 pages' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Text IsControlElement=false
 ++++++++Text Name='Link Annotations - Page 1<newline>' IsControlElement=false
diff --git a/chrome/test/data/pdf/accessibility/text-run-style-heuristic-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/text-run-style-heuristic-expected-uia-win.txt
index 76b3df4..27d92725 100644
--- a/chrome/test/data/pdf/accessibility/text-run-style-heuristic-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/text-run-style-heuristic-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Hello world! One word equals to one text run.'
diff --git a/chrome/test/data/pdf/accessibility/text-style-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/text-style-expected-uia-win.txt
index 68f0ef0..14249e8 100644
--- a/chrome/test/data/pdf/accessibility/text-style-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/text-style-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Case 1<newline>'
diff --git a/chrome/test/data/pdf/accessibility/text_fields-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/text_fields-expected-uia-win.txt
index 128af85f..3882f5d 100644
--- a/chrome/test/data/pdf/accessibility/text_fields-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/text_fields-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Test Form<newline>'
diff --git a/chrome/test/data/pdf/accessibility/weblinks-expected-uia-win.txt b/chrome/test/data/pdf/accessibility/weblinks-expected-uia-win.txt
index f3fd405..64fbb231 100644
--- a/chrome/test/data/pdf/accessibility/weblinks-expected-uia-win.txt
+++ b/chrome/test/data/pdf/accessibility/weblinks-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Pane
-++Document Name='PDF document containing 1 page'
+++Document Name='PDF document containing 1 page' Value.Value='chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html'
 ++++Group Name='Page 1'
 ++++++Group IsControlElement=false
 ++++++++Text Name='Hello, '
diff --git a/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js b/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
index 5f8c6d4..4247df74 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
@@ -74,7 +74,6 @@
     get featureList() {
       return {
         enabled: [
-          'chromeos::features::kUpdatedCellularActivationUi',
           'chromeos::features::kCellularUseAttachApn',
         ],
       };
diff --git a/chrome/test/data/webui/settings/appearance_fonts_page_test.js b/chrome/test/data/webui/settings/appearance_fonts_page_test.js
index 66da6e28..fd7c972a 100644
--- a/chrome/test/data/webui/settings/appearance_fonts_page_test.js
+++ b/chrome/test/data/webui/settings/appearance_fonts_page_test.js
@@ -6,7 +6,7 @@
 import 'chrome://settings/settings.js';
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {FontsBrowserProxy, FontsBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
+import {FontsBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
 import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
 // clang-format on
 
@@ -39,7 +39,7 @@
 suite('AppearanceFontHandler', function() {
   setup(function() {
     fontsBrowserProxy = new TestFontsBrowserProxy();
-    FontsBrowserProxyImpl.instance_ = fontsBrowserProxy;
+    FontsBrowserProxyImpl.setInstance(fontsBrowserProxy);
 
     PolymerTest.clearBody();
 
diff --git a/chrome/test/data/webui/settings/appearance_page_test.js b/chrome/test/data/webui/settings/appearance_page_test.js
index 78c7b586..b1635fc 100644
--- a/chrome/test/data/webui/settings/appearance_page_test.js
+++ b/chrome/test/data/webui/settings/appearance_page_test.js
@@ -5,7 +5,7 @@
 // clang-format off
 import {isChromeOS, isLinux} from 'chrome://resources/js/cr.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {AppearanceBrowserProxy, AppearanceBrowserProxyImpl} from 'chrome://settings/settings.js';
+import {AppearanceBrowserProxyImpl} from 'chrome://settings/settings.js';
 import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
 // clang-format on
 
@@ -126,7 +126,7 @@
 suite('AppearanceHandler', function() {
   setup(function() {
     appearanceBrowserProxy = new TestAppearanceBrowserProxy();
-    AppearanceBrowserProxyImpl.instance_ = appearanceBrowserProxy;
+    AppearanceBrowserProxyImpl.setInstance(appearanceBrowserProxy);
     createAppearancePage();
   });
 
@@ -300,7 +300,7 @@
 
   setup(function() {
     appearanceBrowserProxy = new TestAppearanceBrowserProxy();
-    AppearanceBrowserProxyImpl.instance_ = appearanceBrowserProxy;
+    AppearanceBrowserProxyImpl.setInstance(appearanceBrowserProxy);
     PolymerTest.clearBody();
 
     homeUrlInput = document.createElement('home-url-input');
diff --git a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
index 80f8d42..da1a20b 100644
--- a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
@@ -34,6 +34,7 @@
 
     this.resolverMap_.set('addObserver', new PromiseResolver());
     this.resolverMap_.set('setQuietMode', new PromiseResolver());
+    this.resolverMap_.set('notifyPageReady', new PromiseResolver());
   }
 
   /**
@@ -106,8 +107,17 @@
       resolve({success: true});
     });
   }
+
+  /** @return {!Promise} */
+  notifyPageReady() {
+    return new Promise(resolve => {
+      this.methodCalled('notifyPageReady');
+      resolve();
+    });
+  }
 }
 
+
 suite('AppNotificationsSubpageTests', function() {
   /** @type {AppNotificationsSubpage} */
   let page;
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index 43b56d22..91c640e 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -28,7 +28,6 @@
     return {
       enabled: [
         'chromeos::features::kEnableHostnameSetting',
-        'chromeos::features::kUpdatedCellularActivationUi',
         'features::kCrostini',
       ],
     };
diff --git a/chromeos/components/personalization_app/resources/common/icons.js b/chromeos/components/personalization_app/resources/common/icons.js
index e71d164..c7f9dea 100644
--- a/chromeos/components/personalization_app/resources/common/icons.js
+++ b/chromeos/components/personalization_app/resources/common/icons.js
@@ -8,105 +8,93 @@
  * cannot import polymer and iron-iconset-svg itself. Any consumer should
  * import necessary dependencies before this file.
  *
+ * These icons should have transparent fill color to adapt to its container's
+ * light/dark theme.
+ *
  * Following the demo here:
  * @see https://github.com/PolymerElements/iron-iconset-svg/blob/v3.0.1/demo/svg-sample-icons.js
  */
 
-const template = document.createElement('template');
+ const template = document.createElement('template');
 
-template.innerHTML = `
-<iron-iconset-svg name="personalization" size="20">
-  <svg>
-    <defs>
-      <g id="checkmark">
-        <!-- this is visually identical to os-settings:ic-checked-filled, but
-             that icon is not accessible from chrome-untrusted://personalization
-        -->
-        <svg width="20" height="20" fill="none"
-            xmlns="http://www.w3.org/2000/svg">
-          <circle cx="10" cy="10" r="8" fill="white"/>
-          <path d="M10 1.66666C5.40001 1.66666 1.66667 5.39999 1.66667 9.99999C1.66667 14.6 5.40001 18.3333 10 18.3333C14.6 18.3333 18.3333 14.6 18.3333 9.99999C18.3333 5.39999 14.6 1.66666 10 1.66666ZM8.33334 14.1667L5.00001 10.8333L6.16667 9.66666L8.33334 11.8333L13.8333 6.33332L15 7.49999L8.33334 14.1667Z" fill="#1A73E8"/>
-        </svg>
-      </g>
-    </defs>
-  </svg>
-  <svg>
-    <defs>
-      <g id="change-daily">
-      <svg width="20" height="20" viewBox="0 0 20 20" fill="none"
-            xmlns="http://www.w3.org/2000/svg">>
-          <rect width="20" height="20" fill="none"/>
-          <path d="M17.4989 4.16672H19.1656V15.8334H17.4989V4.16672ZM14.1656
-          4.16672H15.8322V15.8334H14.1656V4.16672ZM11.6656
-          4.16672H1.66558C1.20724 4.16672 0.832245 4.54172 0.832245
-          5.00005V15.0001C0.832245 15.4584 1.20724 15.8334 1.66558
-          15.8334H11.6656C12.1239 15.8334 12.4989 15.4584 12.4989
-          15.0001V5.00005C12.4989 4.54172 12.1239 4.16672 11.6656
-          4.16672ZM10.8322 14.1667H2.49891V5.83338H10.8322V14.1667ZM8.00724
-          9.37505L6.04058 11.7084L4.79058 10.0001L2.91558
-          12.5001H10.4156L8.00724 9.37505Z" fill="#1A73E8"/>
-        </svg>
-      </g>
-    </defs>
-  </svg>
-  <svg>
-    <defs>
-      <g id="refresh">
-      <svg width="20" height="20" viewBox="0 0 20 20" fill="none"
-          xmlns="http://www.w3.org/2000/svg">
-          <rect width="20" height="20" fill="none"/>
-          <path d="M10 3C6.136 3 3 6.136 3 10C3 13.864 6.136 17 10 17C12.1865 17
-          14.1399 15.9959 15.4239 14.4239L13.9984 12.9984C13.0852 14.2129
-          11.6325 15 10 15C7.24375 15 5 12.7563 5 10C5 7.24375 7.24375 5 10
-          5C11.6318 5 13.0839 5.78641 13.9972 7H11V9H17V3H15V5.10253C13.7292
-          3.80529 11.9581 3 10 3Z" fill="#1A73E8"/>
-      </svg>
-      </g>
-    </defs>
-  </svg>
-  <svg>
-    <defs>
-      <g id="layout_fill">
-      <svg width="20" height="20" viewBox="0 0 20 20" fill="none"
-          xmlns="http://www.w3.org/2000/svg">
-        <rect width="20" height="20" fill="none"/>
-        <path fill-rule="evenodd" clip-rule="evenodd" d="M3.75
-        13.125H16.25V6.875L3.75 6.78571V13.125ZM2.5
-        14.375H17.5V5.625H2.5V14.375ZM12.5 4.375H14.375V2.5H12.5V4.375ZM12.5
-        17.5H14.375V15.625H12.5V17.5ZM15.625 17.5C16.6562 17.5 17.5 16.6562 17.5
-        15.625H15.625V17.5ZM8.75 17.5H10.625V15.625H8.75V17.5ZM5.625
-        4.375H7.5V2.5H5.625V4.375ZM4.375 17.5V15.625H2.5C2.5 16.6562 3.34375
-        17.5 4.375 17.5ZM15.625 2.5V4.375H17.5C17.5 3.34375 16.6562 2.5 15.625
-        2.5ZM8.75 4.375H10.625V2.5H8.75V4.375ZM5.625
-        17.5H7.5V15.625H5.625V17.5ZM2.5 4.375H4.375V2.5C3.34375 2.5 2.5 3.34375
-        2.5 4.375Z" fill="#1A73E8"/>
-      </svg>
-      </g>
-    </defs>
-  </svg>
-  <svg>
-    <defs>
-      <g id="layout_center">
-      <svg width="20" height="20" viewBox="0 0 20 20" fill="none"
-          xmlns="http://www.w3.org/2000/svg">
-        <rect width="20" height="20" fill="none"/>
-        <path fill-rule="evenodd" clip-rule="evenodd"
-        d="M7.5 12.5H12.5V7.5H7.5V12.5ZM6.25 13.75H13.75V6.25H6.25V13.75ZM12.5
-        4.375H14.375V2.5H12.5V4.375ZM11.875
-        17.5H13.75V15.625H11.875V17.5ZM15.625
-        13.75H17.5V11.875H15.625V13.75ZM15.625 7.5H17.5V5.625H15.625V7.5ZM15.625
-        17.5C16.6562 17.5 17.5 16.6562 17.5 15.625H15.625V17.5ZM15.625
-        10.625H17.5V8.75H15.625V10.625ZM8.75 17.5H10.625V15.625H8.75V17.5ZM6.25
-        4.375H8.125V2.5H6.25V4.375ZM2.5 13.75H4.375V11.875H2.5V13.75ZM4.375
-        17.5V15.625H2.5C2.5 16.6562 3.34375 17.5 4.375 17.5ZM15.625
-        2.5V4.375H17.5C17.5 3.34375 16.6562 2.5 15.625 2.5ZM9.375
-        4.375H11.25V2.5H9.375V4.375ZM2.5 7.5H4.375V5.625H2.5V7.5ZM5.625
-        17.5H7.5V15.625H5.625V17.5ZM2.5 10.625H4.375V8.75H2.5V10.625ZM2.5
-        4.375H4.375V2.5C3.34375 2.5 2.5 3.34375 2.5 4.375Z" fill="#4285F4"/>
-      </svg>
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>`;
+ template.innerHTML = `
+ <iron-iconset-svg name="personalization" size="20">
+   <svg>
+     <defs>
+       <g id="checkmark">
+         <!-- this is visually identical to os-settings:ic-checked-filled, but
+          that icon is not accessible from chrome-untrusted://personalization.
 
-document.head.appendChild(template.content);
+          We need to apply styling for this icon as it is also displayed in the
+          photo container which does not have its own light/dark styling.
+         -->
+         <style>
+           circle {
+             fill: white;
+           }
+           @media (prefers-color-scheme: dark) {
+             circle {
+               fill: black;
+             }
+           }
+           path {
+             fill: var(--cros-icon-color-prominent);
+           }
+         </style>
+         <circle cx="10" cy="10" r="8"/>
+         <path d="M10 1.66666C5.40001 1.66666 1.66667 5.39999 1.66667 9.99999C1.66667 14.6 5.40001 18.3333 10 18.3333C14.6 18.3333 18.3333 14.6 18.3333 9.99999C18.3333 5.39999 14.6 1.66666 10 1.66666ZM8.33334 14.1667L5.00001 10.8333L6.16667 9.66666L8.33334 11.8333L13.8333 6.33332L15 7.49999L8.33334 14.1667Z"/>
+       </g>
+       <g id="change-daily">
+         <rect width="20" height="20" fill="none"/>
+         <path d="M17.4989 4.16672H19.1656V15.8334H17.4989V4.16672ZM14.1656
+         4.16672H15.8322V15.8334H14.1656V4.16672ZM11.6656
+         4.16672H1.66558C1.20724 4.16672 0.832245 4.54172 0.832245
+         5.00005V15.0001C0.832245 15.4584 1.20724 15.8334 1.66558
+         15.8334H11.6656C12.1239 15.8334 12.4989 15.4584 12.4989
+         15.0001V5.00005C12.4989 4.54172 12.1239 4.16672 11.6656
+         4.16672ZM10.8322 14.1667H2.49891V5.83338H10.8322V14.1667ZM8.00724
+         9.37505L6.04058 11.7084L4.79058 10.0001L2.91558
+         12.5001H10.4156L8.00724 9.37505Z"/>
+       </g>
+       <g id="refresh">
+         <rect width="20" height="20" fill="none"/>
+         <path d="M10 3C6.136 3 3 6.136 3 10C3 13.864 6.136 17 10 17C12.1865 17
+         14.1399 15.9959 15.4239 14.4239L13.9984 12.9984C13.0852 14.2129
+         11.6325 15 10 15C7.24375 15 5 12.7563 5 10C5 7.24375 7.24375 5 10
+         5C11.6318 5 13.0839 5.78641 13.9972 7H11V9H17V3H15V5.10253C13.7292
+         3.80529 11.9581 3 10 3Z"/>
+       </g>
+       <g id="layout_fill">
+         <rect width="20" height="20" fill="none"/>
+         <path fill-rule="evenodd" clip-rule="evenodd" d="M3.75
+         13.125H16.25V6.875L3.75 6.78571V13.125ZM2.5
+         14.375H17.5V5.625H2.5V14.375ZM12.5 4.375H14.375V2.5H12.5V4.375ZM12.5
+         17.5H14.375V15.625H12.5V17.5ZM15.625 17.5C16.6562 17.5 17.5 16.6562 17.5
+         15.625H15.625V17.5ZM8.75 17.5H10.625V15.625H8.75V17.5ZM5.625
+         4.375H7.5V2.5H5.625V4.375ZM4.375 17.5V15.625H2.5C2.5 16.6562 3.34375
+         17.5 4.375 17.5ZM15.625 2.5V4.375H17.5C17.5 3.34375 16.6562 2.5 15.625
+         2.5ZM8.75 4.375H10.625V2.5H8.75V4.375ZM5.625
+         17.5H7.5V15.625H5.625V17.5ZM2.5 4.375H4.375V2.5C3.34375 2.5 2.5 3.34375
+         2.5 4.375Z"/>
+       </g>
+       <g id="layout_center">
+         <rect width="20" height="20" fill="none"/>
+         <path fill-rule="evenodd" clip-rule="evenodd"
+         d="M7.5 12.5H12.5V7.5H7.5V12.5ZM6.25 13.75H13.75V6.25H6.25V13.75ZM12.5
+         4.375H14.375V2.5H12.5V4.375ZM11.875
+         17.5H13.75V15.625H11.875V17.5ZM15.625
+         13.75H17.5V11.875H15.625V13.75ZM15.625 7.5H17.5V5.625H15.625V7.5ZM15.625
+         17.5C16.6562 17.5 17.5 16.6562 17.5 15.625H15.625V17.5ZM15.625
+         10.625H17.5V8.75H15.625V10.625ZM8.75 17.5H10.625V15.625H8.75V17.5ZM6.25
+         4.375H8.125V2.5H6.25V4.375ZM2.5 13.75H4.375V11.875H2.5V13.75ZM4.375
+         17.5V15.625H2.5C2.5 16.6562 3.34375 17.5 4.375 17.5ZM15.625
+         2.5V4.375H17.5C17.5 3.34375 16.6562 2.5 15.625 2.5ZM9.375
+         4.375H11.25V2.5H9.375V4.375ZM2.5 7.5H4.375V5.625H2.5V7.5ZM5.625
+         17.5H7.5V15.625H5.625V17.5ZM2.5 10.625H4.375V8.75H2.5V10.625ZM2.5
+         4.375H4.375V2.5C3.34375 2.5 2.5 3.34375 2.5 4.375Z"/>
+       </g>
+     </defs>
+   </svg>
+ </iron-iconset-svg>`;
+
+ document.head.appendChild(template.content);
diff --git a/chromeos/components/personalization_app/resources/trusted/wallpaper_selected_element.html b/chromeos/components/personalization_app/resources/trusted/wallpaper_selected_element.html
index 33aa070..8def415 100644
--- a/chromeos/components/personalization_app/resources/trusted/wallpaper_selected_element.html
+++ b/chromeos/components/personalization_app/resources/trusted/wallpaper_selected_element.html
@@ -1,10 +1,12 @@
 <style include="common-style">
   #container {
+    border-bottom: 1px solid var(--cros-separator-color);
     box-sizing: border-box;
     display: flex;
     flex-flow: row nowrap;
     height: 100%;
-    padding: 0 8px 20px 8px;
+    margin: 0 8px;
+    padding-bottom: 20px;
   }
 
   #imageContainer {
@@ -77,10 +79,17 @@
 
   #wallpaperOptions > cr-button,
   #collectionOptions > cr-button {
-    padding: 16px;
-    margin-inline-end: 8px;
+    border-color: var(--cros-button-stroke-color-secondary);
     border-radius: 16px;
     box-shadow: none;
+    margin-inline-end: 8px;
+    padding: 16px;
+  }
+
+  #wallpaperOptions > cr-button[aria-selected='true'],
+  #collectionOptions > cr-button[aria-pressed='true'] {
+    background-color: var(--cros-highlight-color);
+    border: 0;
   }
 </style>
 <header id="container" tabindex="0" aria-label="[[getAriaLabel_(image_)]]"
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index 68482ee..cf84e35 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -303,10 +303,9 @@
   if (network_policy)
     NET_LOG(DEBUG) << "Configuration is managed: " << NetworkId(state);
 
-  std::unique_ptr<base::DictionaryValue> shill_dictionary(
-      policy_util::CreateShillConfiguration(
-          *profile, guid, &policies->global_network_config, network_policy,
-          validated_user_settings.get()));
+  base::Value shill_dictionary = policy_util::CreateShillConfiguration(
+      *profile, guid, &policies->global_network_config, network_policy,
+      validated_user_settings.get());
 
   SetShillProperties(service_path, std::move(shill_dictionary),
                      std::move(callback), std::move(error_callback));
@@ -332,11 +331,11 @@
 
 void ManagedNetworkConfigurationHandlerImpl::SetShillProperties(
     const std::string& service_path,
-    std::unique_ptr<base::DictionaryValue> shill_dictionary,
+    base::Value shill_dictionary,
     base::OnceClosure callback,
     network_handler::ErrorCallback error_callback) {
   network_configuration_handler_->SetShillProperties(
-      service_path, *shill_dictionary, std::move(callback),
+      service_path, shill_dictionary, std::move(callback),
       std::move(error_callback));
 }
 
@@ -446,14 +445,14 @@
     guid = base::GenerateGUID();
   }
 
-  std::unique_ptr<base::DictionaryValue> shill_dictionary(
+  base::Value shill_dictionary =
       policy_util::CreateShillConfiguration(*profile, guid,
                                             nullptr,  // no global policy
                                             nullptr,  // no network policy
-                                            validated_properties.get()));
+                                            validated_properties.get());
 
   network_configuration_handler_->CreateShillConfiguration(
-      *shill_dictionary, std::move(callback), std::move(error_callback));
+      shill_dictionary, std::move(callback), std::move(error_callback));
 }
 
 void ManagedNetworkConfigurationHandlerImpl::RemoveConfiguration(
@@ -620,7 +619,7 @@
 }
 
 void ManagedNetworkConfigurationHandlerImpl::CreateConfigurationFromPolicy(
-    const base::DictionaryValue& shill_properties,
+    const base::Value& shill_properties,
     base::OnceClosure callback) {
   auto split_callback = base::SplitOnceCallback(std::move(callback));
   network_configuration_handler_->CreateShillConfiguration(
@@ -1152,13 +1151,11 @@
     global_policy = &policies->global_network_config;
   }
 
-  std::unique_ptr<base::Value> augmented_properties =
-      policy_util::CreateManagedONC(global_policy, network_policy,
-                                    user_settings, onc_network.get(), profile);
-  SetManagedActiveProxyValues(*guid, augmented_properties.get());
+  base::Value augmented_properties = policy_util::CreateManagedONC(
+      global_policy, network_policy, user_settings, onc_network.get(), profile);
+  SetManagedActiveProxyValues(*guid, &augmented_properties);
   std::move(callback).Run(service_path,
-                          absl::make_optional(base::Value::FromUniquePtrValue(
-                              std::move(augmented_properties))),
+                          absl::make_optional(std::move(augmented_properties)),
                           absl::nullopt);
 }
 
diff --git a/chromeos/network/managed_network_configuration_handler_impl.h b/chromeos/network/managed_network_configuration_handler_impl.h
index 81e7462..7c021d0 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.h
+++ b/chromeos/network/managed_network_configuration_handler_impl.h
@@ -114,9 +114,8 @@
   void OnProfileRemoved(const NetworkProfile& profile) override;
 
   // PolicyApplicator::ConfigurationHandler overrides
-  void CreateConfigurationFromPolicy(
-      const base::DictionaryValue& shill_properties,
-      base::OnceClosure callback) override;
+  void CreateConfigurationFromPolicy(const base::Value& shill_properties,
+                                     base::OnceClosure callback) override;
 
   void UpdateExistingConfigurationWithPropertiesFromPolicy(
       const base::DictionaryValue& existing_properties,
@@ -202,11 +201,10 @@
                       absl::optional<base::Value> shill_properties);
 
   // Called from SetProperties, calls NCH::SetShillProperties.
-  void SetShillProperties(
-      const std::string& service_path,
-      std::unique_ptr<base::DictionaryValue> shill_dictionary,
-      base::OnceClosure callback,
-      network_handler::ErrorCallback error_callback);
+  void SetShillProperties(const std::string& service_path,
+                          base::Value shill_dictionary,
+                          base::OnceClosure callback,
+                          network_handler::ErrorCallback error_callback);
 
   // Sets the active proxy values in managed network configurations depending on
   // the source of the configuration. Proxy enforced by user policy
diff --git a/chromeos/network/network_configuration_handler.cc b/chromeos/network/network_configuration_handler.cc
index 3af9cb07..20242f2 100644
--- a/chromeos/network/network_configuration_handler.cc
+++ b/chromeos/network/network_configuration_handler.cc
@@ -72,13 +72,12 @@
 
 void LogConfigProperties(const std::string& desc,
                          const std::string& path,
-                         const base::DictionaryValue& properties) {
-  for (base::DictionaryValue::Iterator iter(properties); !iter.IsAtEnd();
-       iter.Advance()) {
+                         const base::Value& properties) {
+  for (auto iter : properties.DictItems()) {
     std::string v = "******";
-    if (shill_property_util::IsLoggableShillProperty(iter.key()))
-      base::JSONWriter::Write(iter.value(), &v);
-    NET_LOG(USER) << desc << ": " << path + "." + iter.key() + "=" + v;
+    if (shill_property_util::IsLoggableShillProperty(iter.first))
+      base::JSONWriter::Write(iter.second, &v);
+    NET_LOG(USER) << desc << ": " << path + "." + iter.first + "=" + v;
   }
 }
 
@@ -283,7 +282,7 @@
 
 void NetworkConfigurationHandler::SetShillProperties(
     const std::string& service_path,
-    const base::DictionaryValue& shill_properties,
+    const base::Value& shill_properties,
     base::OnceClosure callback,
     network_handler::ErrorCallback error_callback) {
   if (shill_properties.DictEmpty()) {
@@ -293,27 +292,25 @@
   }
   NET_LOG(USER) << "SetShillProperties: " << NetworkPathId(service_path);
 
-  std::unique_ptr<base::DictionaryValue> properties_to_set(
-      shill_properties.DeepCopy());
+  base::Value properties_to_set = shill_properties.Clone();
 
   // Make sure that the GUID is saved to Shill when setting properties.
-  std::string guid = GetString(*properties_to_set, shill::kGuidProperty);
+  std::string guid = GetString(properties_to_set, shill::kGuidProperty);
   if (guid.empty()) {
     const NetworkState* network_state =
         network_state_handler_->GetNetworkState(service_path);
     guid = network_state ? network_state->guid() : base::GenerateGUID();
-    properties_to_set->SetKey(shill::kGuidProperty, base::Value(guid));
+    properties_to_set.SetKey(shill::kGuidProperty, base::Value(guid));
   }
 
-  LogConfigProperties("SetProperty", service_path, *properties_to_set);
+  LogConfigProperties("SetProperty", service_path, properties_to_set);
 
   // Clear error state when setting Shill properties.
   network_state_handler_->ClearLastErrorForNetwork(service_path);
 
-  std::unique_ptr<base::DictionaryValue> properties_copy(
-      properties_to_set->DeepCopy());
+  base::Value properties_copy = properties_to_set.Clone();
   ShillServiceClient::Get()->SetProperties(
-      dbus::ObjectPath(service_path), *properties_to_set,
+      dbus::ObjectPath(service_path), properties_to_set,
       base::BindOnce(&NetworkConfigurationHandler::SetPropertiesSuccessCallback,
                      weak_ptr_factory_.GetWeakPtr(), service_path,
                      std::move(properties_copy), std::move(callback)),
@@ -350,36 +347,34 @@
 }
 
 void NetworkConfigurationHandler::CreateShillConfiguration(
-    const base::DictionaryValue& shill_properties,
+    const base::Value& shill_properties,
     network_handler::ServiceResultCallback callback,
     network_handler::ErrorCallback error_callback) {
   ShillManagerClient* manager = ShillManagerClient::Get();
   std::string type = GetString(shill_properties, shill::kTypeProperty);
   DCHECK(!type.empty());
 
-  std::unique_ptr<base::DictionaryValue> properties_to_set(
-      shill_properties.DeepCopy());
+  base::Value properties_to_set = shill_properties.Clone();
 
   NET_LOG(USER) << "CreateShillConfiguration: " << type << ": "
                 << shill_property_util::GetNetworkIdFromProperties(
                        shill_properties);
 
   std::string profile_path =
-      GetString(*properties_to_set, shill::kProfileProperty);
+      GetString(properties_to_set, shill::kProfileProperty);
   DCHECK(!profile_path.empty());
 
   // Make sure that the GUID is saved to Shill when configuring networks.
-  std::string guid = GetString(*properties_to_set, shill::kGuidProperty);
+  std::string guid = GetString(properties_to_set, shill::kGuidProperty);
   if (guid.empty()) {
     guid = base::GenerateGUID();
-    properties_to_set->SetKey(shill::kGuidProperty, base::Value(guid));
+    properties_to_set.SetKey(shill::kGuidProperty, base::Value(guid));
   }
 
-  LogConfigProperties("Configure", type, *properties_to_set);
-  std::unique_ptr<base::DictionaryValue> properties_copy(
-      properties_to_set->DeepCopy());
+  LogConfigProperties("Configure", type, properties_to_set);
+  base::Value properties_copy = properties_to_set.Clone();
   manager->ConfigureServiceForProfile(
-      dbus::ObjectPath(profile_path), *properties_to_set,
+      dbus::ObjectPath(profile_path), properties_to_set,
       base::BindOnce(&NetworkConfigurationHandler::ConfigurationCompleted,
                      weak_ptr_factory_.GetWeakPtr(), profile_path, guid,
                      std::move(properties_copy), std::move(callback)),
@@ -537,7 +532,7 @@
 void NetworkConfigurationHandler::ConfigurationCompleted(
     const std::string& profile_path,
     const std::string& guid,
-    std::unique_ptr<base::DictionaryValue> configure_properties,
+    base::Value configure_properties,
     network_handler::ServiceResultCallback callback,
     const dbus::ObjectPath& service_path) {
   // It is possible that the newly-configured network was already being tracked
@@ -621,7 +616,7 @@
 
 void NetworkConfigurationHandler::SetPropertiesSuccessCallback(
     const std::string& service_path,
-    std::unique_ptr<base::DictionaryValue> set_properties,
+    base::Value set_properties,
     base::OnceClosure callback) {
   if (!callback.is_null())
     std::move(callback).Run();
@@ -632,7 +627,7 @@
 
   for (auto& observer : observers_) {
     observer.OnConfigurationModified(service_path, network_state->guid(),
-                                     set_properties.get());
+                                     &set_properties);
   }
 
   network_state_handler_->RequestUpdateForNetwork(service_path);
diff --git a/chromeos/network/network_configuration_handler.h b/chromeos/network/network_configuration_handler.h
index bd373a9..c8a5386 100644
--- a/chromeos/network/network_configuration_handler.h
+++ b/chromeos/network/network_configuration_handler.h
@@ -70,7 +70,7 @@
   // given properties will be merged with the existing settings, and it won't
   // clear any existing properties.
   void SetShillProperties(const std::string& service_path,
-                          const base::DictionaryValue& shill_properties,
+                          const base::Value& shill_properties,
                           base::OnceClosure callback,
                           network_handler::ErrorCallback error_callback);
 
@@ -94,7 +94,7 @@
   // Manager.ConfigureServiceForProfile. NOTE: Normally
   // ManagedNetworkConfigurationHandler should be used to call
   // CreateConfiguration. This will set GUID if not provided.
-  void CreateShillConfiguration(const base::DictionaryValue& shill_properties,
+  void CreateShillConfiguration(const base::Value& shill_properties,
                                 network_handler::ServiceResultCallback callback,
                                 network_handler::ErrorCallback error_callback);
 
@@ -149,12 +149,11 @@
 
   // Called when a configuration completes. This will wait for the cached
   // state (NetworkStateHandler) to update before triggering the callback.
-  void ConfigurationCompleted(
-      const std::string& profile_path,
-      const std::string& guid,
-      std::unique_ptr<base::DictionaryValue> configure_properties,
-      network_handler::ServiceResultCallback callback,
-      const dbus::ObjectPath& service_path);
+  void ConfigurationCompleted(const std::string& profile_path,
+                              const std::string& guid,
+                              base::Value configure_properties,
+                              network_handler::ServiceResultCallback callback,
+                              const dbus::ObjectPath& service_path);
 
   void ConfigurationFailed(network_handler::ErrorCallback error_callback,
                            const std::string& dbus_error_name,
@@ -181,10 +180,9 @@
 
   // Invoke |callback| and inform NetworkStateHandler to request an update
   // for the service after setting properties.
-  void SetPropertiesSuccessCallback(
-      const std::string& service_path,
-      std::unique_ptr<base::DictionaryValue> set_properties,
-      base::OnceClosure callback);
+  void SetPropertiesSuccessCallback(const std::string& service_path,
+                                    base::Value set_properties,
+                                    base::OnceClosure callback);
   void SetPropertiesErrorCallback(const std::string& service_path,
                                   network_handler::ErrorCallback error_callback,
                                   const std::string& dbus_error_name,
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc
index 8281078..c26160c9 100644
--- a/chromeos/network/policy_applicator.cc
+++ b/chromeos/network/policy_applicator.cc
@@ -97,8 +97,7 @@
       profile_properties.FindListKey(shill::kEntriesProperty);
   if (!entries) {
     LOG(ERROR) << "Profile " << profile_.ToDebugString()
-               << " doesn't contain the property "
-               << shill::kEntriesProperty;
+               << " doesn't contain the property " << shill::kEntriesProperty;
     NotifyConfigurationHandlerAndFinish();
     return;
   }
@@ -187,9 +186,9 @@
     VLOG_IF(1, was_managed && old_guid != new_guid)
         << "Updating configuration previously managed by policy " << old_guid
         << " with new policy " << new_guid << ".";
-    VLOG_IF(1, !was_managed) << "Applying policy " << new_guid
-                             << " to previously unmanaged "
-                             << "configuration.";
+    VLOG_IF(1, !was_managed)
+        << "Applying policy " << new_guid << " to previously unmanaged "
+        << "configuration.";
 
     ApplyNewPolicy(entry, entry_properties, std::move(ui_data), old_guid,
                    new_guid, *new_policy,
@@ -249,10 +248,9 @@
 
   const base::DictionaryValue* user_settings =
       ui_data ? ui_data->GetUserSettingsDictionary() : nullptr;
-  std::unique_ptr<base::DictionaryValue> new_shill_properties =
-      policy_util::CreateShillConfiguration(profile_, new_guid,
-                                            &global_network_config_,
-                                            new_policy_as_dict, user_settings);
+  base::Value new_shill_properties = policy_util::CreateShillConfiguration(
+      profile_, new_guid, &global_network_config_, new_policy_as_dict,
+      user_settings);
   // A new policy has to be applied to this profile entry. In order to keep
   // implicit state of Shill like "connected successfully before", keep the
   // entry if a policy is reapplied (e.g. after reboot) or is updated.
@@ -264,10 +262,10 @@
   // ensure that no old configuration remains.
   if (old_guid == new_guid &&
       shill_property_util::DoIdentifyingPropertiesMatch(
-          *new_shill_properties, *entry_properties_as_dict)) {
+          new_shill_properties, *entry_properties_as_dict)) {
     VLOG(1) << "Updating previously managed configuration with the "
             << "updated policy " << new_guid << ".";
-    WriteNewShillConfiguration(new_shill_properties->Clone(),
+    WriteNewShillConfiguration(std::move(new_shill_properties),
                                new_policy.Clone(), std::move(callback));
   } else {
     VLOG(1) << "Deleting profile entry before writing new policy " << new_guid
@@ -282,11 +280,11 @@
     // At first ENTRY1 and ENTRY2 should be removed, then the new config be
     // written and the result should be:
     // { {GUID=X, SSID=Y, USER_SETTINGS=X} }
-    DeleteEntry(
-        entry, base::BindOnce(&PolicyApplicator::WriteNewShillConfiguration,
-                              weak_ptr_factory_.GetWeakPtr(),
-                              new_shill_properties->Clone(), new_policy.Clone(),
-                              std::move(callback)));
+    DeleteEntry(entry,
+                base::BindOnce(&PolicyApplicator::WriteNewShillConfiguration,
+                               weak_ptr_factory_.GetWeakPtr(),
+                               std::move(new_shill_properties),
+                               new_policy.Clone(), std::move(callback)));
   }
 }
 
@@ -346,9 +344,7 @@
     }
   }
 
-  const base::DictionaryValue* shill_dictionary_as_dict;
-  shill_dictionary.GetAsDictionary(&shill_dictionary_as_dict);
-  handler_->CreateConfigurationFromPolicy(*shill_dictionary_as_dict,
+  handler_->CreateConfigurationFromPolicy(shill_dictionary,
                                           std::move(callback));
 }
 
@@ -385,13 +381,12 @@
     VLOG(1) << "Creating new configuration managed by policy " << *it
             << " in profile " << profile_.ToDebugString() << ".";
 
-    std::unique_ptr<base::DictionaryValue> shill_dictionary =
-        policy_util::CreateShillConfiguration(
-            profile_, *it, &global_network_config_, network_policy,
-            nullptr /* no user settings */);
+    base::Value shill_dictionary = policy_util::CreateShillConfiguration(
+        profile_, *it, &global_network_config_, network_policy,
+        nullptr /* no user settings */);
 
     handler_->CreateConfigurationFromPolicy(
-        *shill_dictionary,
+        shill_dictionary,
         base::BindOnce(&PolicyApplicator::RemainingPolicyApplied,
                        weak_ptr_factory_.GetWeakPtr(), *it /* entry */));
   }
diff --git a/chromeos/network/policy_applicator.h b/chromeos/network/policy_applicator.h
index 78176ac0..92c02461 100644
--- a/chromeos/network/policy_applicator.h
+++ b/chromeos/network/policy_applicator.h
@@ -37,7 +37,7 @@
     // before. |callback| will be called after the configuration update has been
     // reflected in NetworkStateHandler, or on error.
     virtual void CreateConfigurationFromPolicy(
-        const base::DictionaryValue& shill_properties,
+        const base::Value& shill_properties,
         base::OnceClosure callback) = 0;
 
     // before. |callback| will be called after the configuration update has been
diff --git a/chromeos/network/policy_util.cc b/chromeos/network/policy_util.cc
index 75bc6a9c..e0798e8 100644
--- a/chromeos/network/policy_util.cc
+++ b/chromeos/network/policy_util.cc
@@ -76,8 +76,8 @@
 // within Chrome. Shill does such matching in several functions for network
 // identification. For compatibility, we currently should stick to Shill's
 // matching behavior.
-bool IsPolicyMatching(const base::DictionaryValue& policy,
-                      const base::DictionaryValue& actual_network) {
+bool IsPolicyMatching(const base::Value& policy,
+                      const base::Value& actual_network) {
   std::string policy_type = GetString(policy, ::onc::network_config::kType);
   std::string actual_network_type =
       GetString(actual_network, ::onc::network_config::kType);
@@ -85,12 +85,10 @@
     return false;
 
   if (actual_network_type == ::onc::network_type::kEthernet) {
-    const base::DictionaryValue* policy_ethernet = nullptr;
-    policy.GetDictionaryWithoutPathExpansion(::onc::network_config::kEthernet,
-                                             &policy_ethernet);
-    const base::DictionaryValue* actual_ethernet = nullptr;
-    actual_network.GetDictionaryWithoutPathExpansion(
-        ::onc::network_config::kEthernet, &actual_ethernet);
+    const base::Value* policy_ethernet =
+        policy.FindDictKey(::onc::network_config::kEthernet);
+    const base::Value* actual_ethernet =
+        actual_network.FindDictKey(::onc::network_config::kEthernet);
     if (!policy_ethernet || !actual_ethernet)
       return false;
 
@@ -99,13 +97,13 @@
     std::string actual_auth =
         GetString(*actual_ethernet, ::onc::ethernet::kAuthentication);
     return policy_auth == actual_auth;
-  } else if (actual_network_type == ::onc::network_type::kWiFi) {
-    const base::DictionaryValue* policy_wifi = nullptr;
-    policy.GetDictionaryWithoutPathExpansion(::onc::network_config::kWiFi,
-                                             &policy_wifi);
-    const base::DictionaryValue* actual_wifi = nullptr;
-    actual_network.GetDictionaryWithoutPathExpansion(
-        ::onc::network_config::kWiFi, &actual_wifi);
+  }
+
+  if (actual_network_type == ::onc::network_type::kWiFi) {
+    const base::Value* policy_wifi =
+        policy.FindDictKey(::onc::network_config::kWiFi);
+    const base::Value* actual_wifi =
+        actual_network.FindDictKey(::onc::network_config::kWiFi);
     if (!policy_wifi || !actual_wifi)
       return false;
 
@@ -113,12 +111,13 @@
     std::string actual_ssid = GetString(*actual_wifi, ::onc::wifi::kHexSSID);
     return (policy_ssid == actual_ssid);
   }
+
   return false;
 }
 
 // Returns true if AutoConnect is enabled by |policy| (as mandatory or
 // recommended setting). Otherwise and on error returns false.
-bool IsAutoConnectEnabledInPolicy(const base::DictionaryValue& policy) {
+bool IsAutoConnectEnabledInPolicy(const base::Value& policy) {
   std::string type = GetString(policy, ::onc::network_config::kType);
 
   std::string autoconnect_key;
@@ -134,8 +133,7 @@
     return false;
   }
 
-  const base::DictionaryValue* network_dict = nullptr;
-  policy.GetDictionaryWithoutPathExpansion(network_dict_key, &network_dict);
+  const base::Value* network_dict = policy.FindDictKey(network_dict_key);
   if (!network_dict) {
     LOG(ERROR) << "ONC doesn't contain a " << network_dict_key
                << " dictionary.";
@@ -198,16 +196,15 @@
 
 }  // namespace
 
-std::unique_ptr<base::Value> CreateManagedONC(
-    const base::DictionaryValue* global_policy,
-    const base::DictionaryValue* network_policy,
-    const base::DictionaryValue* user_settings,
-    const base::DictionaryValue* active_settings,
-    const NetworkProfile* profile) {
-  const base::DictionaryValue* user_policy = nullptr;
-  const base::DictionaryValue* device_policy = nullptr;
-  const base::DictionaryValue* nonshared_user_settings = nullptr;
-  const base::DictionaryValue* shared_user_settings = nullptr;
+base::Value CreateManagedONC(const base::Value* global_policy,
+                             const base::Value* network_policy,
+                             const base::Value* user_settings,
+                             const base::Value* active_settings,
+                             const NetworkProfile* profile) {
+  const base::Value* user_policy = nullptr;
+  const base::Value* device_policy = nullptr;
+  const base::Value* nonshared_user_settings = nullptr;
+  const base::Value* shared_user_settings = nullptr;
 
   if (profile) {
     switch (profile->type()) {
@@ -240,13 +237,13 @@
     }
   }
 
-  return base::Value::ToUniquePtrValue(std::move(augmented_onc_network));
+  return augmented_onc_network;
 }
 
 void SetShillPropertiesForGlobalPolicy(
-    const base::DictionaryValue& shill_dictionary,
-    const base::DictionaryValue& global_network_policy,
-    base::DictionaryValue* shill_properties_to_update) {
+    const base::Value& shill_dictionary,
+    const base::Value& global_network_policy,
+    base::Value* shill_properties_to_update) {
   // kAllowOnlyPolicyNetworksToAutoconnect is currently the only global config.
 
   std::string type = GetString(shill_dictionary, shill::kTypeProperty);
@@ -275,12 +272,11 @@
                                      base::Value(false));
 }
 
-std::unique_ptr<base::DictionaryValue> CreateShillConfiguration(
-    const NetworkProfile& profile,
-    const std::string& guid,
-    const base::DictionaryValue* global_policy,
-    const base::DictionaryValue* network_policy,
-    const base::DictionaryValue* user_settings) {
+base::Value CreateShillConfiguration(const NetworkProfile& profile,
+                                     const std::string& guid,
+                                     const base::Value* global_policy,
+                                     const base::Value* network_policy,
+                                     const base::Value* user_settings) {
   base::Value effective;
   ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE;
   if (network_policy) {
@@ -381,12 +377,11 @@
 
   VLOG(2) << "Created Shill properties: " << *shill_dictionary;
 
-  return shill_dictionary;
+  return std::move(*shill_dictionary);
 }
 
-const base::DictionaryValue* FindMatchingPolicy(
-    const GuidToPolicyMap& policies,
-    const base::DictionaryValue& actual_network) {
+const base::Value* FindMatchingPolicy(const GuidToPolicyMap& policies,
+                                      const base::Value& actual_network) {
   for (auto it = policies.begin(); it != policies.end(); ++it) {
     if (IsPolicyMatching(*it->second, actual_network))
       return it->second.get();
diff --git a/chromeos/network/policy_util.h b/chromeos/network/policy_util.h
index 9a96f6e3..1c47ab1 100644
--- a/chromeos/network/policy_util.h
+++ b/chromeos/network/policy_util.h
@@ -31,42 +31,38 @@
 // Creates a managed ONC dictionary from the given arguments. Depending on the
 // profile type, the policies are assumed to come from the user or device policy
 // and and |user_settings| to be the user's non-shared or shared settings.
-// Each of the arguments can be NULL.
+// Each of the arguments can be null.
 // TODO(pneubeck): Add documentation of the returned format, see
 //   https://crbug.com/408990 .
-std::unique_ptr<base::Value> CreateManagedONC(
-    const base::DictionaryValue* global_policy,
-    const base::DictionaryValue* network_policy,
-    const base::DictionaryValue* user_settings,
-    const base::DictionaryValue* active_settings,
-    const NetworkProfile* profile);
+base::Value CreateManagedONC(const base::Value* global_policy,
+                             const base::Value* network_policy,
+                             const base::Value* user_settings,
+                             const base::Value* active_settings,
+                             const NetworkProfile* profile);
 
 // Adds properties to |shill_properties_to_update|, which are enforced on an
 // unmanaged network by the global config |global_network_policy| of the policy.
 // |shill_dictionary| are the network's current properties read from Shill.
-void SetShillPropertiesForGlobalPolicy(
-    const base::DictionaryValue& shill_dictionary,
-    const base::DictionaryValue& global_network_policy,
-    base::DictionaryValue* shill_properties_to_update);
+void SetShillPropertiesForGlobalPolicy(const base::Value& shill_dictionary,
+                                       const base::Value& global_network_policy,
+                                       base::Value* shill_properties_to_update);
 
 // Creates a Shill property dictionary from the given arguments. The resulting
 // dictionary will be sent to Shill by the caller. Depending on the profile
 // type, |network_policy| is interpreted as the user or device policy and
 // |user_settings| as the user or shared settings. |network_policy| or
 // |user_settings| can be NULL, but not both.
-std::unique_ptr<base::DictionaryValue> CreateShillConfiguration(
-    const NetworkProfile& profile,
-    const std::string& guid,
-    const base::DictionaryValue* global_policy,
-    const base::DictionaryValue* network_policy,
-    const base::DictionaryValue* user_settings);
+base::Value CreateShillConfiguration(const NetworkProfile& profile,
+                                     const std::string& guid,
+                                     const base::Value* global_policy,
+                                     const base::Value* network_policy,
+                                     const base::Value* user_settings);
 
 // Returns the policy from |policies| matching |actual_network|, if any exists.
 // Returns NULL otherwise. |actual_network| must be part of a ONC
 // NetworkConfiguration.
-const base::DictionaryValue* FindMatchingPolicy(
-    const GuidToPolicyMap& policies,
-    const base::DictionaryValue& actual_network);
+const base::Value* FindMatchingPolicy(const GuidToPolicyMap& policies,
+                                      const base::Value& actual_network);
 
 }  // namespace policy_util
 
diff --git a/chromeos/network/shill_property_util.cc b/chromeos/network/shill_property_util.cc
index 41f07be..d6ff0b0 100644
--- a/chromeos/network/shill_property_util.cc
+++ b/chromeos/network/shill_property_util.cc
@@ -49,9 +49,9 @@
 
 // If existent and non-empty, copies the string at |key| from |source| to
 // |dest|. Returns true if the string was copied.
-bool CopyStringFromDictionary(const base::DictionaryValue& source,
+bool CopyStringFromDictionary(const base::Value& source,
                               const std::string& key,
-                              base::DictionaryValue* dest) {
+                              base::Value* dest) {
   const std::string* string_value = source.FindStringKey(key);
   if (!string_value || string_value->empty()) {
     return false;
@@ -241,9 +241,9 @@
   shill_dictionary->SetKey(shill::kONCSourceProperty, base::Value(source));
 }
 
-bool CopyIdentifyingProperties(const base::DictionaryValue& service_properties,
+bool CopyIdentifyingProperties(const base::Value& service_properties,
                                const bool properties_read_from_shill,
-                               base::DictionaryValue* dest) {
+                               base::Value* dest) {
   bool success = true;
 
   // GUID is optional.
@@ -277,11 +277,12 @@
     std::string vpn_provider_type;
     std::string vpn_provider_host;
     if (properties_read_from_shill) {
-      const base::DictionaryValue* provider_properties = NULL;
-      if (!service_properties.GetDictionaryWithoutPathExpansion(
-              shill::kProviderProperty, &provider_properties)) {
+      const base::Value* provider_properties =
+          service_properties.FindDictKey(shill::kProviderProperty);
+      if (!provider_properties) {
         NET_LOG(ERROR) << "Missing VPN provider dict: "
                        << GetNetworkIdFromProperties(service_properties);
+        return false;
       }
       const std::string* vpn_provider_type_str =
           provider_properties->FindStringKey(shill::kTypeProperty);
@@ -320,9 +321,9 @@
   return success;
 }
 
-bool DoIdentifyingPropertiesMatch(const base::DictionaryValue& new_properties,
-                                  const base::DictionaryValue& old_properties) {
-  base::DictionaryValue new_identifying;
+bool DoIdentifyingPropertiesMatch(const base::Value& new_properties,
+                                  const base::Value& old_properties) {
+  base::Value new_identifying(base::Value::Type::DICTIONARY);
   if (!CopyIdentifyingProperties(
           new_properties,
           false /* properties were not read from Shill */,
diff --git a/chromeos/network/shill_property_util.h b/chromeos/network/shill_property_util.h
index dfa359e..2ba4b2b 100644
--- a/chromeos/network/shill_property_util.h
+++ b/chromeos/network/shill_property_util.h
@@ -69,18 +69,17 @@
 // |service_properties| has the format that Shill exposes on reads, as opposed
 // to property dictionaries which are sent to Shill. Returns true only if all
 // required properties could be copied.
-bool CopyIdentifyingProperties(const base::DictionaryValue& service_properties,
+bool CopyIdentifyingProperties(const base::Value& service_properties,
                                const bool properties_read_from_shill,
-                               base::DictionaryValue* dest);
+                               base::Value* dest);
 
 // Compares the identifying configuration properties of |new_properties| and
 // |old_properties|, returns true if they are identical. |new_properties| must
 // have the form that Shill expects on writes. |old_properties| must have the
 // form that Shill exposes on reads. See also CopyIdentifyingProperties. Only
 // WiFi, VPN, Ethernet and EthernetEAP are supported. Cellular is not supported.
-bool DoIdentifyingPropertiesMatch(
-    const base::DictionaryValue& new_properties,
-    const base::DictionaryValue& old_properties);
+bool DoIdentifyingPropertiesMatch(const base::Value& new_properties,
+                                  const base::Value& old_properties);
 
 // Returns false if |key| is something that should not be logged either
 // because it is sensitive or noisy. Note: this is not necessarily
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
index 03eb121..5037f1e 100644
--- a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
+++ b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
@@ -327,7 +327,12 @@
               (override));
   MOCK_METHOD(void,
               RunArcHttp,
-              (NetworkDiagnosticsRoutines::RunArcHttpCallback));
+              (NetworkDiagnosticsRoutines::RunArcHttpCallback),
+              (override));
+  MOCK_METHOD(void,
+              RunArcDnsResolution,
+              (NetworkDiagnosticsRoutines::RunArcDnsResolutionCallback),
+              (override));
   MOCK_METHOD(void,
               GetResult,
               (const network_diagnostics::mojom::RoutineType type,
diff --git a/chromeos/services/network_health/public/mojom/network_diagnostics.mojom b/chromeos/services/network_health/public/mojom/network_diagnostics.mojom
index a03f335..acc9de51 100644
--- a/chromeos/services/network_health/public/mojom/network_diagnostics.mojom
+++ b/chromeos/services/network_health/public/mojom/network_diagnostics.mojom
@@ -26,6 +26,7 @@
   kHttpsLatency,
   kVideoConferencing,
   kArcHttp,
+  kArcDnsResolution,
 };
 
 // Each routine can result in one of the possible verdicts.
@@ -180,6 +181,21 @@
   kFailedHttpRequests,
 };
 
+// Problems related to the ArcDnsResolution routine.
+[Extensible]
+enum ArcDnsResolutionProblem {
+  // Failed to get the ARC Service Manager.
+  kFailedToGetArcServiceManager,
+  // Failed to get instance of the NetInstance service.
+  kFailedToGetNetInstanceForDnsResolutionTest,
+  // DNS query latency is high.
+  kHighLatency,
+  // DNS query latency is very high.
+  kVeryHighLatency,
+  // One or more DNS queries resulted in a failure.
+  kFailedDnsQueries,
+};
+
 // Union of all possible routine problems. See each problem enum definition for
 // more details.
 union RoutineProblems {
@@ -196,6 +212,7 @@
   array<HttpsLatencyProblem> https_latency_problems;
   array<VideoConferencingProblem> video_conferencing_problems;
   array<ArcHttpProblem> arc_http_problems;
+  array<ArcDnsResolutionProblem> arc_dns_resolution_problems;
 };
 
 // A single routine's result.
@@ -314,6 +331,10 @@
   // needed during the ARC Provisioning step.
   RunArcHttp() => (RoutineResult result);
 
+  // Tests whether ARC can make successful DNS queries to the hostnames
+  // needed during the ARC Provisioning step.
+  RunArcDnsResolution() => (RoutineResult result);
+
   // Returns the most recent result for the specified routine type, if it has
   // been run.
   GetResult(RoutineType routine) => (RoutineResult? result);
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index a2692144..34a67dcd 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Misluk – Kon nie drukker bereik nie</translation>
 <translation id="6574762126505704998">Vul</translation>
 <translation id="6575134580692778371">Nie opgestel nie</translation>
-<translation id="6579235177984085399">Ontdek nuwe teken- en ontwerpnutsgoed</translation>
 <translation id="6596816719288285829">IP-adres</translation>
 <translation id="6603230386432466813">Sukkel jy om te koppel?</translation>
 <translation id="6618744767048954150">Werk tans</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index 91db523..8cb1bc9 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">አልተሳካም - አታሚ የማይደረስበት ነው</translation>
 <translation id="6574762126505704998">ሙሌት</translation>
 <translation id="6575134580692778371">አልተዋቀረም</translation>
-<translation id="6579235177984085399">አዲስ የስዕል እና የንድፍ መሳሪያዎችን ያግኙ</translation>
 <translation id="6596816719288285829">IP አድራሻ</translation>
 <translation id="6603230386432466813">መገናኘት ላይ ችግር እያጋጠመዎት ነው?</translation>
 <translation id="6618744767048954150">በማሄድ ላይ</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index e94cb93..4dc467d 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">تعذَّرت الطباعة - لا يمكن الوصول إلى الطابعة</translation>
 <translation id="6574762126505704998">تعبئة</translation>
 <translation id="6575134580692778371">غير مهيأ</translation>
-<translation id="6579235177984085399">الاطّلاع على أدوات الرسم والتصميم الجديدة</translation>
 <translation id="6596816719288285829">‏عنوان IP</translation>
 <translation id="6603230386432466813">هل تواجه مشكلة أثناء الاتصال؟</translation>
 <translation id="6618744767048954150">قيد التشغيل</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 9ba05916..eb2717fb 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -297,7 +297,6 @@
 <translation id="65587193855025101">ফ্লে'টবেড</translation>
 <translation id="6564646048574748301">বিফল হৈছে - প্ৰিণ্টাৰৰ সৈতে সংযোগ কৰিব পৰা নাই</translation>
 <translation id="6574762126505704998">সম্পূৰ্ণ স্ক্ৰীনজুৰি</translation>
-<translation id="6579235177984085399">অংকন আৰু ডিজাইন কৰাৰ নতুন সঁজুলি বিচাৰক</translation>
 <translation id="6596816719288285829">আইপি ঠিকনা</translation>
 <translation id="6603230386432466813">সংযোগ কৰোঁতে সমস্যাৰ সৃষ্টি হৈছে নেকি?</translation>
 <translation id="6618744767048954150">চলি আছে</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index cceba99..cfbe8ec 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">Alınmadı - Printer əlçatan deyil</translation>
 <translation id="6574762126505704998">Doldurma</translation>
 <translation id="6575134580692778371">Konfiqurasiya edilməyib</translation>
-<translation id="6579235177984085399">Yeni rəsm və dizayn alətlərini kəşf edin</translation>
 <translation id="6596816719288285829">IP Ünvanı</translation>
 <translation id="6603230386432466813">Bağlantı problemi var?</translation>
 <translation id="6618744767048954150">İcra olunur</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb
index 982b158..0765778a 100644
--- a/chromeos/strings/chromeos_strings_be.xtb
+++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Збой: прынтар недаступны</translation>
 <translation id="6574762126505704998">Запоўніць</translation>
 <translation id="6575134580692778371">Не наладжана</translation>
-<translation id="6579235177984085399">Адкрыйце для сябе новыя інструменты для дызайну і рысавання</translation>
 <translation id="6596816719288285829">IP-адрас</translation>
 <translation id="6603230386432466813">Узнікла праблема з падключэннем?</translation>
 <translation id="6618744767048954150">Выконваецца</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb
index ee087c8..7c58027 100644
--- a/chromeos/strings/chromeos_strings_bg.xtb
+++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Неуспешно – няма връзка с принтера</translation>
 <translation id="6574762126505704998">Запълване</translation>
 <translation id="6575134580692778371">Не е конфигурирано</translation>
-<translation id="6579235177984085399">Открийте нови инструменти за рисуване и дизайн</translation>
 <translation id="6596816719288285829">IP адрес</translation>
 <translation id="6603230386432466813">Имате проблеми при свързване?</translation>
 <translation id="6618744767048954150">В ход</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index 7be1197..d7c497f 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">প্রিন্ট করা যায়নি - প্রিন্টারের সাথে কানেক্ট করা যাচ্ছে না</translation>
 <translation id="6574762126505704998">পূরণ করুন</translation>
 <translation id="6575134580692778371">কনফিগার হয়নি</translation>
-<translation id="6579235177984085399">ড্রয়িং এবং ডিজাইনের নতুন টুল খুঁজুন</translation>
 <translation id="6596816719288285829">আইপি অ্যাড্রেস</translation>
 <translation id="6603230386432466813">কানেক্ট করতে সমস্যা হচ্ছে?</translation>
 <translation id="6618744767048954150">চলছে</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb
index 86d4f89..620927b 100644
--- a/chromeos/strings/chromeos_strings_bs.xtb
+++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nije uspjelo – štampač je nedostupan</translation>
 <translation id="6574762126505704998">Popunjavanje</translation>
 <translation id="6575134580692778371">Nije konfigurirano</translation>
-<translation id="6579235177984085399">Otkrijte nove alate za crtanje i dizajniranje</translation>
 <translation id="6596816719288285829">IP adresa</translation>
 <translation id="6603230386432466813">Imate poteškoće s povezivanjem?</translation>
 <translation id="6618744767048954150">Pokrenuto</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index 7b113bd1..5a03127 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Error: no es pot accedir a la impressora</translation>
 <translation id="6574762126505704998">Emplena</translation>
 <translation id="6575134580692778371">No configurat</translation>
-<translation id="6579235177984085399">Descobreix les noves eines de dibuix i disseny</translation>
 <translation id="6596816719288285829">Adreça IP</translation>
 <translation id="6603230386432466813">Tens problemes per connectar-te?</translation>
 <translation id="6618744767048954150">Comprovació en curs</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb
index 3c2ee6a..2e0d2fe 100644
--- a/chromeos/strings/chromeos_strings_cs.xtb
+++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Tisk selhal – tiskárna není dostupná</translation>
 <translation id="6574762126505704998">Vyplnit</translation>
 <translation id="6575134580692778371">Není konfigurováno</translation>
-<translation id="6579235177984085399">Objevte nové nástroje pro kreslení a projektování</translation>
 <translation id="6596816719288285829">IP adresa</translation>
 <translation id="6603230386432466813">Máte problémy s připojením?</translation>
 <translation id="6618744767048954150">Probíhá</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index d10373c..3724f3c 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">Handlingen mislykkedes – Ingen forbindelse til printer</translation>
 <translation id="6574762126505704998">Udfyld</translation>
 <translation id="6575134580692778371">Ikke konfigureret</translation>
-<translation id="6579235177984085399">Find nye tegne- og designværktøjer</translation>
 <translation id="6596816719288285829">IP-adresse</translation>
 <translation id="6603230386432466813">Har du problemer med at oprette forbindelse?</translation>
 <translation id="6618744767048954150">Kører</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 49959aa..ca7ceb34 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">Fehlgeschlagen – Drucker nicht erreichbar</translation>
 <translation id="6574762126505704998">Ausfüllen</translation>
 <translation id="6575134580692778371">Nicht konfiguriert</translation>
-<translation id="6579235177984085399">Neue Zeichen- und Designtools entdecken</translation>
 <translation id="6596816719288285829">IP-Adresse</translation>
 <translation id="6603230386432466813">Sie haben Probleme beim Herstellen einer Verbindung?</translation>
 <translation id="6618744767048954150">Läuft</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb
index 14937d5..b50f237 100644
--- a/chromeos/strings/chromeos_strings_el.xtb
+++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Σφάλμα - Δεν είναι δυνατή η πρόσβαση στον εκτυπωτή</translation>
 <translation id="6574762126505704998">Πλήρωση</translation>
 <translation id="6575134580692778371">Δεν διαμορφώθηκε</translation>
-<translation id="6579235177984085399">Ανακαλύψτε νέα εργαλεία σχεδίασης</translation>
 <translation id="6596816719288285829">Διεύθυνση IP</translation>
 <translation id="6603230386432466813">Αντιμετωπίζετε προβλήματα κατά τη σύνδεση;</translation>
 <translation id="6618744767048954150">Σε εξέλιξη</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index e9799c4f..8a3d6d4 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Failed – Printer unreachable</translation>
 <translation id="6574762126505704998">Fill</translation>
 <translation id="6575134580692778371">Not configured</translation>
-<translation id="6579235177984085399">Discover new drawing and design tools</translation>
 <translation id="6596816719288285829">IP Address</translation>
 <translation id="6603230386432466813">Having trouble connecting?</translation>
 <translation id="6618744767048954150">Running</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index f53995a..9c5270ef 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Error: No se puede acceder a la impresora</translation>
 <translation id="6574762126505704998">Completar</translation>
 <translation id="6575134580692778371">No está configurado</translation>
-<translation id="6579235177984085399">Descubre nuevas herramientas de dibujo y diseño</translation>
 <translation id="6596816719288285829">Dirección IP</translation>
 <translation id="6603230386432466813">¿Tienes problemas para conectarte?</translation>
 <translation id="6618744767048954150">En ejecución</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index 9f6fbb0..035bdff 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">No se ha podido imprimir - Impresora inaccesible</translation>
 <translation id="6574762126505704998">Rellenar</translation>
 <translation id="6575134580692778371">Sin configurar</translation>
-<translation id="6579235177984085399">Descubre nuevas herramientas de dibujo y diseño</translation>
 <translation id="6596816719288285829">Dirección IP</translation>
 <translation id="6603230386432466813">¿No puedes conectarte?</translation>
 <translation id="6618744767048954150">En curso</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index 175f9863..46551fb 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Ebaõnnestus – printeriga ei saa ühendust</translation>
 <translation id="6574762126505704998">Täida</translation>
 <translation id="6575134580692778371">Ei ole konfigureeritud</translation>
-<translation id="6579235177984085399">Avastage uusi joonistamise ja kujundamise tööriistu</translation>
 <translation id="6596816719288285829">IP-aadress</translation>
 <translation id="6603230386432466813">Kas teil on ühenduse loomisega probleeme?</translation>
 <translation id="6618744767048954150">Pooleli</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index 01542cb..c5a8533 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Hutsegitea - Inprimagailua ez da aurkitu</translation>
 <translation id="6574762126505704998">Bete</translation>
 <translation id="6575134580692778371">Konfiguratu gabe</translation>
-<translation id="6579235177984085399">Ezagutu marrazketa- eta diseinu-tresna berriak</translation>
 <translation id="6596816719288285829">IP helbidea</translation>
 <translation id="6603230386432466813">Arazoak dituzu konektatzeko?</translation>
 <translation id="6618744767048954150">Abian</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 9b03678..526a498c 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">انجام نشد - دسترسی به چاپگر ممکن نیست</translation>
 <translation id="6574762126505704998">پر کردن</translation>
 <translation id="6575134580692778371">پیکربندی نشده</translation>
-<translation id="6579235177984085399">کاوش ابزارهای جدید طراحی و نقاشی</translation>
 <translation id="6596816719288285829">‏نشانی IP</translation>
 <translation id="6603230386432466813">هنگام متصل شدن با مشکل روبه‌رو هستید؟</translation>
 <translation id="6618744767048954150">درحال اجرا</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb
index 2ee65eb2..474f5ea 100644
--- a/chromeos/strings/chromeos_strings_fi.xtb
+++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Epäonnistui – Ei yhteyttä tulostimeen</translation>
 <translation id="6574762126505704998">Täytä</translation>
 <translation id="6575134580692778371">Ei määritetty</translation>
-<translation id="6579235177984085399">Löydä uusia piirto- ja suunnittelutyökaluja</translation>
 <translation id="6596816719288285829">IP-osoite</translation>
 <translation id="6603230386432466813">Eikö yhdistäminen onnistu?</translation>
 <translation id="6618744767048954150">Käynnissä</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index 60d1188..4751c3f1 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Hindi na-print - Hindi makakonekta sa printer</translation>
 <translation id="6574762126505704998">Fill</translation>
 <translation id="6575134580692778371">Hindi na-configure</translation>
-<translation id="6579235177984085399">Tumuklas ng mga bagong tool sa pagguhit at disenyo</translation>
 <translation id="6596816719288285829">IP Address</translation>
 <translation id="6603230386432466813">Nagkakaproblema sa pagkonekta?</translation>
 <translation id="6618744767048954150">Tumatakbo</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index 2ba2285..b576893 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Échec : imprimante inaccessible</translation>
 <translation id="6574762126505704998">Remplir</translation>
 <translation id="6575134580692778371">Non configuré</translation>
-<translation id="6579235177984085399">Découvrir de nouveaux outils de dessin et de conception</translation>
 <translation id="6596816719288285829">Adresse IP</translation>
 <translation id="6603230386432466813">Vous éprouvez des problèmes de connexion?</translation>
 <translation id="6618744767048954150">En cours…</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index 9998597..24bc206 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Échec – Imprimante inaccessible</translation>
 <translation id="6574762126505704998">Remplissage</translation>
 <translation id="6575134580692778371">Non configuré</translation>
-<translation id="6579235177984085399">Découvrez de nouveaux outils de dessin et de conception</translation>
 <translation id="6596816719288285829">Adresse IP</translation>
 <translation id="6603230386432466813">Des problèmes de connexion ?</translation>
 <translation id="6618744767048954150">En cours</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index 581be3a..3c379f4 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">Os meus ficheiros</translation>
 <translation id="3199982728237701504">Alimentador de documentos (a dúas caras)</translation>
 <translation id="3226405216343213872">Buscando escáneres</translation>
+<translation id="3228433892370472777">Conexión predeterminada</translation>
 <translation id="3246869037381808805">Quitaranse os traballos de impresión de máis de 1 día</translation>
 <translation id="3268178239013324452">Produciuse un erro: a tapa da impresora está aberta</translation>
 <translation id="3283504360622356314">{0,plural, =1{Editar ficheiro}other{Editar ficheiros}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">Estrés</translation>
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4917889632206600977">Detívose (esgotouse o papel)</translation>
+<translation id="491836528011451486">Coloca o documento no escáner e selecciona Volver escanear para substituír a páxina <ph name="CURRENT_PAGE" />.</translation>
 <translation id="4921665434385737356">Cargouse un <ph name="RATE" /> en <ph name="NUM_SECONDS" /> segundos.</translation>
 <translation id="4932733599132424254">Data</translation>
 <translation id="498186245079027698">Comproba o escáner e téntao de novo. Asegúrate de que exista espazo local suficiente para gardar os ficheiros escaneados.</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">Produciuse un erro: non se puido acceder á impresora</translation>
 <translation id="6574762126505704998">Completar</translation>
 <translation id="6575134580692778371">Non configurado</translation>
-<translation id="6579235177984085399">Descubre novas ferramentas de deseño e de debuxo</translation>
 <translation id="6596816719288285829">Enderezo IP</translation>
 <translation id="6603230386432466813">Tes problemas de conexión?</translation>
 <translation id="6618744767048954150">En execución</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881"><ph name="MANAGER" /> xestiona este dispositivo (<ph name="DEVICE_TYPE" />). Os administradores poden configuralo de forma remota.</translation>
 <translation id="7180611975245234373">Actualizar</translation>
 <translation id="7216409898977639127">Provedor de rede móbil</translation>
+<translation id="7257889006063274246">Seguro que queres quitar a páxina <ph name="CURRENT_PAGE" />?</translation>
 <translation id="7271040990581020067">Nestes momentos, o escáner está en uso. Téntao de novo máis tarde.</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">Colección de fondos de pantalla</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb
index 5371177..6de6529 100644
--- a/chromeos/strings/chromeos_strings_gu.xtb
+++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">નિષ્ફળ થયું - પ્રિન્ટરથી કનેક્ટ થઈ શકાતું નથી</translation>
 <translation id="6574762126505704998">પૂર્ણ સ્ક્રીન</translation>
 <translation id="6575134580692778371">ગોઠવેલું નથી</translation>
-<translation id="6579235177984085399">ડ્રોઇંગ અને ડિઝાઇનના નવા સાધનો શોધો</translation>
 <translation id="6596816719288285829">IP સરનામું</translation>
 <translation id="6603230386432466813">કનેક્ટ કરવામાં મુશ્કેલી આવી રહી છે?</translation>
 <translation id="6618744767048954150">હજીપણ તપાસ થઈ રહી છે</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index 0916023a..f882a0c 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">प्रिंट नहीं हो पाया - प्रिंटर से कनेक्ट नहीं हो पा रहा है</translation>
 <translation id="6574762126505704998">भरें</translation>
 <translation id="6575134580692778371">कॉन्फ़िगर नहीं है</translation>
-<translation id="6579235177984085399">ड्रॉइंग और डिज़ाइन के नए टूल खोजें</translation>
 <translation id="6596816719288285829">आईपी पता</translation>
 <translation id="6603230386432466813">क्या आपको ईथरनेट कनेक्शन से जुड़ने में समस्या हो रही है?</translation>
 <translation id="6618744767048954150">जांच चल रही है</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb
index a88d9f87..1c76bf4e 100644
--- a/chromeos/strings/chromeos_strings_hr.xtb
+++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nije uspjelo – pisač nije dostupan</translation>
 <translation id="6574762126505704998">Ispuna</translation>
 <translation id="6575134580692778371">Nije konfigurirano</translation>
-<translation id="6579235177984085399">Otkrijte nove alate za crtanje i dizajn</translation>
 <translation id="6596816719288285829">IP adresa</translation>
 <translation id="6603230386432466813">Imate li problema s povezivanjem?</translation>
 <translation id="6618744767048954150">U tijeku</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index 0a1bab3b..1b5e28d8 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Sikertelen – Nem lehet hozzáférni a nyomtatóhoz</translation>
 <translation id="6574762126505704998">Kitöltés</translation>
 <translation id="6575134580692778371">Nincs konfigurálva</translation>
-<translation id="6579235177984085399">Az új rajz- és tervezőeszközök felfedezése</translation>
 <translation id="6596816719288285829">IP-cím</translation>
 <translation id="6603230386432466813">Problémába ütközött a kapcsolódás során?</translation>
 <translation id="6618744767048954150">Ellenőrzés folyamatban</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index 028a70ec..103edaa 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">Իմ ֆայլերը</translation>
 <translation id="3199982728237701504">Փաստաթղթերի մատակարար (երկկողմանի)</translation>
 <translation id="3226405216343213872">Սկաներների որոնում</translation>
+<translation id="3228433892370472777">Կանխադրված կապ</translation>
 <translation id="3246869037381808805">Տպման առաջադրանքները, որոնք 1 օրից հին են, կհեռացվեն</translation>
 <translation id="3268178239013324452">Չհաջողվեց տպել – Կափարիչը բաց է</translation>
 <translation id="3283504360622356314">{0,plural, =1{Փոփոխել ֆայլը}one{Փոփոխել ֆայլերը}other{Փոփոխել ֆայլերը}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">Ծանրաբեռնվածություն</translation>
 <translation id="4917385247580444890">Ուժեղ</translation>
 <translation id="4917889632206600977">Դադարեցվել է – Թուղթ չկա</translation>
+<translation id="491836528011451486">Փաստաթուղթը դրեք սկաների վրա և սեղմեք «Նորից սկանավորել»՝ <ph name="CURRENT_PAGE" /> էջը սկանավորելու և փոխարինելու համար։</translation>
 <translation id="4921665434385737356">Լիցքավորվել է <ph name="RATE" />-ով՝ <ph name="NUM_SECONDS" /> վայրկյանում։</translation>
 <translation id="4932733599132424254">Ամսաթիվ</translation>
 <translation id="498186245079027698">Ստուգեք սկաները և նորից փորձեք։ Համոզվեք, որ սկանավորված ֆայլերը պահելու համար բավարար տարածք կա։</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">Չհաջողվեց տպել – Տպիչն անհասանելի է</translation>
 <translation id="6574762126505704998">Լցում</translation>
 <translation id="6575134580692778371">Կազմաձևված չէ</translation>
-<translation id="6579235177984085399">Ծանոթացեք գծագրական և դիզայնի նոր գործիքներին</translation>
 <translation id="6596816719288285829">IP հասցե</translation>
 <translation id="6603230386432466813">Չի՞ հաջողվում միանալ</translation>
 <translation id="6618744767048954150">Ստուգումն ընթացքում է</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881">Այս <ph name="DEVICE_TYPE" /> սարքը կառավարվում է <ph name="MANAGER" />-ի կողմից։ Ադմինիստրատորները կարող են հեռակա փոխել սարքի կարգավորումները։</translation>
 <translation id="7180611975245234373">Թարմացնել</translation>
 <translation id="7216409898977639127">Բջջային օպերատոր</translation>
+<translation id="7257889006063274246">Հեռացնե՞լ <ph name="CURRENT_PAGE" /> էջը։</translation>
 <translation id="7271040990581020067">Սկաներն այս պահին օգտագործվում է։ Փորձեք ավելի ուշ։</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">Պաստառների հավաքածուներ</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index e228724..af801f1b 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Gagal - Printer tidak dapat dijangkau</translation>
 <translation id="6574762126505704998">Isi</translation>
 <translation id="6575134580692778371">Tidak dikonfigurasi</translation>
-<translation id="6579235177984085399">Temukan alat desain dan gambar baru</translation>
 <translation id="6596816719288285829">Alamat IP</translation>
 <translation id="6603230386432466813">Mengalami masalah saat menghubungkan?</translation>
 <translation id="6618744767048954150">Sedang berjalan</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index 2143cd57..a1a2f219 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Mistókst – ekki næst í prentara</translation>
 <translation id="6574762126505704998">Fylling</translation>
 <translation id="6575134580692778371">Ekki stillt</translation>
-<translation id="6579235177984085399">Skoðaðu ný teikni- og hönnunarverkfæri</translation>
 <translation id="6596816719288285829">IP-tala</translation>
 <translation id="6603230386432466813">Áttu í vandræðum með að tengjast?</translation>
 <translation id="6618744767048954150">Í gangi</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index 0b0284d..07f60a2d 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Operazione non riuscita - Stampante non raggiungibile</translation>
 <translation id="6574762126505704998">Riempi</translation>
 <translation id="6575134580692778371">Non configurata</translation>
-<translation id="6579235177984085399">Scopri nuovi strumenti per il design e il disegno</translation>
 <translation id="6596816719288285829">Indirizzo IP</translation>
 <translation id="6603230386432466813">Hai problemi di connessione?</translation>
 <translation id="6618744767048954150">In corso</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index 34dfc18a..ac5bfc8 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">נכשלה – לא ניתן להתחבר אל המדפסת</translation>
 <translation id="6574762126505704998">מילוי המסך</translation>
 <translation id="6575134580692778371">לא הוגדר</translation>
-<translation id="6579235177984085399">יש כלים חדשים לשרטוט ולעיצוב</translation>
 <translation id="6596816719288285829">‏כתובת IP</translation>
 <translation id="6603230386432466813">נתקלת בקשיים בהתחברות?</translation>
 <translation id="6618744767048954150">הבדיקה מתבצעת עכשיו</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb
index 4b4a9a89..845a96d 100644
--- a/chromeos/strings/chromeos_strings_ja.xtb
+++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">失敗 - プリンタにアクセスできません</translation>
 <translation id="6574762126505704998">全画面</translation>
 <translation id="6575134580692778371">設定されていません</translation>
-<translation id="6579235177984085399">新しい描画、デザインツールを確認する</translation>
 <translation id="6596816719288285829">IP アドレス</translation>
 <translation id="6603230386432466813">接続できない場合</translation>
 <translation id="6618744767048954150">実行中</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb
index b76ad4d..1062868 100644
--- a/chromeos/strings/chromeos_strings_ka.xtb
+++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">ჩემი ფაილები</translation>
 <translation id="3199982728237701504">დოკუმენტების მიმწოდი (ორმხრივი)</translation>
 <translation id="3226405216343213872">მიმდინარეობს სკანერების ძიება</translation>
+<translation id="3228433892370472777">ნაგულისხმევი კავშირი</translation>
 <translation id="3246869037381808805">ბეჭდვის 1 დღეზე ძველი დავალებები ამოიშლება</translation>
 <translation id="3268178239013324452">ვერ მოხერხდა — პრინტერის კარი ღიაა</translation>
 <translation id="3283504360622356314">{0,plural, =1{ფაილის რედაქტირება}other{ფაილების რედაქტირება}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">სტრესი</translation>
 <translation id="4917385247580444890">ძლიერი</translation>
 <translation id="4917889632206600977">გაჩერდა — ქაღალდი გათავდა</translation>
+<translation id="491836528011451486">მოათავსეთ დოკუმენტი სკანერზე და აირჩიეთ „ხელახლა სკანირება“, რომ დაასკანიროთ და ჩაანაცვლოთ გვერდი <ph name="CURRENT_PAGE" />.</translation>
 <translation id="4921665434385737356"><ph name="RATE" /> დაიტენა <ph name="NUM_SECONDS" /> წამში.</translation>
 <translation id="4932733599132424254">თარიღი</translation>
 <translation id="498186245079027698">შეამოწმეთ სკანერი და ცადეთ ხელახლა. დარწმუნდით, რომ ადგილობრივი მეხსიერება საკმარისია სკანირებული ფაილების შესანახად.</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">ვერ მოხერხდა — პრინტერთან დაკავშირება ვერ ხერხდება</translation>
 <translation id="6574762126505704998">შევსება</translation>
 <translation id="6575134580692778371">არ არის კონფიგურირებული</translation>
-<translation id="6579235177984085399">აღმოაჩინეთ ხატვისა და დიზაინის ახალი ხელსაწყოები</translation>
 <translation id="6596816719288285829">IP მისამართი</translation>
 <translation id="6603230386432466813">პრობლემა გაქვთ დაკავშირებასთან?</translation>
 <translation id="6618744767048954150">მიმდინარეობს</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881">ეს <ph name="DEVICE_TYPE" /> იმართება <ph name="MANAGER" />-ის მიერ. ადმინისტრატორებს შეუძლიათ ამ მოწყობილობის დისტანციურად კონფიგურაცია.</translation>
 <translation id="7180611975245234373">განახლება</translation>
 <translation id="7216409898977639127">ფიჭური ქსელის პროვაიდერი</translation>
+<translation id="7257889006063274246">ნამდვილად გსურთ, ამოშალოთ გვერდი <ph name="CURRENT_PAGE" />?</translation>
 <translation id="7271040990581020067">სკანერი ამჟამად გამოიყენება. ცადეთ მოგვიანებით.</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">ფონების კოლექციები</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index 9b5b3f5..0994e51 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">Сәтсіз: принтер қолжетімді емес</translation>
 <translation id="6574762126505704998">Толтыру</translation>
 <translation id="6575134580692778371">Реттелмеген</translation>
-<translation id="6579235177984085399">Сызба мен дизайнға арналған жаңа құралдармен танысыңыз</translation>
 <translation id="6596816719288285829">IP мекенжайы</translation>
 <translation id="6603230386432466813">Байланыс орнату кезінде қиындық туындады ма?</translation>
 <translation id="6618744767048954150">Жұмыс істеп тұр</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 2d0b6a2..e1ba638f 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">មិនបានសម្រេច - ​​មិនអាចភ្ជាប់​ម៉ាស៊ីនបោះពុម្ព​បាន</translation>
 <translation id="6574762126505704998">បំពេញ</translation>
 <translation id="6575134580692778371">មិនត្រូវបានតំឡើងទេ</translation>
-<translation id="6579235177984085399">ស្វែងយល់​អំពីឧបករណ៍​រចនា និង​គូរថ្មី</translation>
 <translation id="6596816719288285829">អាសយដ្ឋាន IP</translation>
 <translation id="6603230386432466813">មានបញ្ហា​ក្នុងការភ្ជាប់​មែនទេ?</translation>
 <translation id="6618744767048954150">កំពុងដំណើរការ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb
index d6e9bce..cdfce8d 100644
--- a/chromeos/strings/chromeos_strings_kn.xtb
+++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">ವಿಫಲವಾಗಿದೆ - ಪ್ರಿಂಟರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
 <translation id="6574762126505704998">ತುಂಬುವಿಕೆ</translation>
 <translation id="6575134580692778371">ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ</translation>
-<translation id="6579235177984085399">ಹೊಸ ರೇಖಾಚಿತ್ರ ಮತ್ತು ವಿನ್ಯಾಸ ಪರಿಕರಗಳನ್ನು ಅನ್ವೇಷಿಸಿ</translation>
 <translation id="6596816719288285829">IP ವಿಳಾಸ</translation>
 <translation id="6603230386432466813">ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗುತ್ತಿದೆಯೇ?</translation>
 <translation id="6618744767048954150">ರನ್ ಆಗುತ್ತಿದೆ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index 3dbeb92..61d78508 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">실패 - 프린터에 연결할 수 없음</translation>
 <translation id="6574762126505704998">채우기</translation>
 <translation id="6575134580692778371">설정되지 않음</translation>
-<translation id="6579235177984085399">새로운 그리기 및 디자인 도구 살펴보기</translation>
 <translation id="6596816719288285829">IP 주소</translation>
 <translation id="6603230386432466813">연결하는 데 문제가 있나요?</translation>
 <translation id="6618744767048954150">실행 중</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index 83c0727..6fce293 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Басылып чыгарылган жок - Принтер жеткиликсиз</translation>
 <translation id="6574762126505704998">Толтуруу</translation>
 <translation id="6575134580692778371">Кофигурацияланган эмес</translation>
-<translation id="6579235177984085399">Сүрөт тартуу жана дизайн үчүн жаңы куралдарды көрүңүз</translation>
 <translation id="6596816719288285829">IP дарек</translation>
 <translation id="6603230386432466813">Туташа албай жатасызбы?</translation>
 <translation id="6618744767048954150">Иштеп жатат</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb
index 95ab1206..eb2c1b87 100644
--- a/chromeos/strings/chromeos_strings_lo.xtb
+++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">ບໍ່ສຳເລັດ, ບໍ່ສາມາດຕິດຕໍ່ເຄື່ອງພິມໄດ້</translation>
 <translation id="6574762126505704998">ຕື່ມສີ</translation>
 <translation id="6575134580692778371">ບໍ່ໄດ້ປັບຕັ້ງຄ່າ</translation>
-<translation id="6579235177984085399">ຄົ້ນພົບເຄື່ອງມືການແຕ້ມ ແລະ ການອອກແບບໃໝ່ໆ</translation>
 <translation id="6596816719288285829">ທີ່​ຢູ່ IP</translation>
 <translation id="6603230386432466813">ກຳລັງມີບັນຫາໃນການເຊື່ອມຕໍ່ບໍ?</translation>
 <translation id="6618744767048954150">ກຳລັງເປີດ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb
index 0b6fe48..ff4e0ce 100644
--- a/chromeos/strings/chromeos_strings_lt.xtb
+++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nepavyko – spausdintuvas nepasiekiamas</translation>
 <translation id="6574762126505704998">Užpildyti</translation>
 <translation id="6575134580692778371">Nesukonfigūruota</translation>
-<translation id="6579235177984085399">Atraskite naujų piešimo ir dizaino įrankių</translation>
 <translation id="6596816719288285829">IP adresas</translation>
 <translation id="6603230386432466813">Kyla sunkumų prisijungiant?</translation>
 <translation id="6618744767048954150">Vykdoma</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb
index 2ef7571..7632dfa3 100644
--- a/chromeos/strings/chromeos_strings_lv.xtb
+++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">Mani faili</translation>
 <translation id="3199982728237701504">Dokumentu padevējs (divpusēji)</translation>
 <translation id="3226405216343213872">Notiek skeneru meklēšana…</translation>
+<translation id="3228433892370472777">Noklusējuma savienojums</translation>
 <translation id="3246869037381808805">Drukas uzdevumi, kas ir vecāki par vienu dienu, tiks noņemti</translation>
 <translation id="3268178239013324452">Neizdevās — durtiņas ir atvērtas</translation>
 <translation id="3283504360622356314">{0,plural, =1{Rediģēt failu}zero{Rediģēt failus}one{Rediģēt failus}other{Rediģēt failus}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">Izturība</translation>
 <translation id="4917385247580444890">Spēcīgs</translation>
 <translation id="4917889632206600977">Apturēts — beidzies papīrs</translation>
+<translation id="491836528011451486">Novietojiet dokumentu uz skenera un atlasiet “Skenēt vēlreiz”, lai skenētu un aizstātu <ph name="CURRENT_PAGE" />. lapu.</translation>
 <translation id="4921665434385737356">Uzlādes apjoms: <ph name="RATE" /> <ph name="NUM_SECONDS" /> sekundēs.</translation>
 <translation id="4932733599132424254">Datums</translation>
 <translation id="498186245079027698">Pārbaudiet skeneri un mēģiniet vēlreiz. Vietējā krātuvē jābūt pietiekami daudz vietas skenēto failu saglabāšanai.</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">Neizdevās — printeris nav sasniedzams</translation>
 <translation id="6574762126505704998">Aizpildīt</translation>
 <translation id="6575134580692778371">Nav konfigurēts</translation>
-<translation id="6579235177984085399">Atklājiet jaunus zīmēšanas un dizaina rīkus</translation>
 <translation id="6596816719288285829">IP adrese</translation>
 <translation id="6603230386432466813">Vai neizdodas izveidot savienojumu?</translation>
 <translation id="6618744767048954150">Notiek pārbaude</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881">Šo <ph name="DEVICE_TYPE" /> ierīci pārvalda <ph name="MANAGER" />. Administratori var attālināti konfigurēt ierīci.</translation>
 <translation id="7180611975245234373">Atsvaidzināt</translation>
 <translation id="7216409898977639127">Mobilo sakaru operators</translation>
+<translation id="7257889006063274246">Vai tiešām vēlaties noņemt <ph name="CURRENT_PAGE" />. lapu?</translation>
 <translation id="7271040990581020067">Skeneris pašlaik tiek izmantots. Vēlāk mēģiniet vēlreiz.</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">Fona tapešu kolekcijas</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index 8a4d8b0..c7dea57 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Неуспешно - печатачот е недостапен</translation>
 <translation id="6574762126505704998">Пополни</translation>
 <translation id="6575134580692778371">Не е конфигуриран</translation>
-<translation id="6579235177984085399">Откријте нови алатки за цртање и дизајн</translation>
 <translation id="6596816719288285829">IP-адреса</translation>
 <translation id="6603230386432466813">Имате ли проблем при поврзувањето?</translation>
 <translation id="6618744767048954150">Се извршува</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index 736922c..2f0e971 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">പ്രിന്റ് ചെയ്യാനായില്ല - പ്രിന്റർ ലഭ്യമല്ല</translation>
 <translation id="6574762126505704998">ഫിൽ</translation>
 <translation id="6575134580692778371">ക്രമീകരിച്ചിട്ടില്ല</translation>
-<translation id="6579235177984085399">പുതിയ ഡ്രോയിംഗ്, ഡിസൈൻ ടൂളുകൾ കണ്ടെത്തുക</translation>
 <translation id="6596816719288285829">IP വിലാസം</translation>
 <translation id="6603230386432466813">കണക്റ്റ് ചെയ്യാൻ പ്രശ്‌നം നേരിടുന്നുണ്ടോ?</translation>
 <translation id="6618744767048954150">റൺ ചെയ്യുന്നു</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index 795ed82..76815c3 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Амжилтгүй болсон - Хэвлэгчид холбогдох боломжгүй</translation>
 <translation id="6574762126505704998">Дүүргэх</translation>
 <translation id="6575134580692778371">Тохиргоо хийгээгүй</translation>
-<translation id="6579235177984085399">Дүрс болон дизайны шинэ хэрэгсэлтэй танилцаарай</translation>
 <translation id="6596816719288285829">IP хаяг</translation>
 <translation id="6603230386432466813">Холбогдоход асуудал гарсан уу?</translation>
 <translation id="6618744767048954150">Ажиллуулж байна</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index 8322bcb..d284d1b 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">अयशस्वी झाले - प्रिंटरशी कनेक्ट करता आले नाही</translation>
 <translation id="6574762126505704998">भरा</translation>
 <translation id="6575134580692778371">कॉंफिगर केले नाही</translation>
-<translation id="6579235177984085399">ड्रॉइंग आणि डिझाइनची नवीन टूल शोधा</translation>
 <translation id="6596816719288285829">IP पत्ता</translation>
 <translation id="6603230386432466813">कनेक्ट करताना समस्या येत आहे का?</translation>
 <translation id="6618744767048954150">रन होत आहे</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index e967524..8152673 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Gagal - Pencetak tidak dapat dicapai</translation>
 <translation id="6574762126505704998">Isi</translation>
 <translation id="6575134580692778371">Tidak dikonfigurasi</translation>
-<translation id="6579235177984085399">Temukan alatan lukisan dan reka bentuk baharu</translation>
 <translation id="6596816719288285829">Alamat IP</translation>
 <translation id="6603230386432466813">Ada masalah membuat sambungan?</translation>
 <translation id="6618744767048954150">Berjalan</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 1742128..fa3fb0cc 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">မအောင်မြင်ပါ - ပရင်တာကို ဆက်သွယ်၍မရပါ</translation>
 <translation id="6574762126505704998">ဖြည့်ရန်</translation>
 <translation id="6575134580692778371">စီစဉ်မဖွဲ့စည်းရသေး</translation>
-<translation id="6579235177984085399">ပုံဆွဲနှင့် ဒီဇိုင်းတူးလ်အသစ်များ ကြည့်ရှုနိုင်သည်</translation>
 <translation id="6596816719288285829">IP လိပ်စာ</translation>
 <translation id="6603230386432466813">ချိတ်ဆက်ရာတွင် ပြဿနာရှိသလား။</translation>
 <translation id="6618744767048954150">လုပ်ဆောင်နေသည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index e41ac25..b141409b 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">प्रिन्ट गर्न सकिएन - प्रिन्टरमा कनेक्ट भइरहेको छैन</translation>
 <translation id="6574762126505704998">भर्नुहोस्</translation>
 <translation id="6575134580692778371">विन्यास गरिएको छैन</translation>
-<translation id="6579235177984085399">रेखाचित्र र डिजाइनसम्बन्धी नयाँ संयन्त्रहरू खोज्नुहोस्</translation>
 <translation id="6596816719288285829">IP ​​ठेगाना</translation>
 <translation id="6603230386432466813">कनेक्ट गर्ने क्रममा समस्या भइरहेको छ?</translation>
 <translation id="6618744767048954150">जाँच हुँदै छ</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index a667dc6..11ed67491 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Mislukt - Printer is niet bereikbaar</translation>
 <translation id="6574762126505704998">Uitvullen</translation>
 <translation id="6575134580692778371">Niet geconfigureerd</translation>
-<translation id="6579235177984085399">Ontdek nieuwe teken- en ontwerptools</translation>
 <translation id="6596816719288285829">IP-adres</translation>
 <translation id="6603230386432466813">Heb je problemen met verbinding maken?</translation>
 <translation id="6618744767048954150">Wordt uitgevoerd</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index bbbee0a..e2513346 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Mislykket – skriveren kan ikke nås</translation>
 <translation id="6574762126505704998">Fyll</translation>
 <translation id="6575134580692778371">Ikke konfigurert</translation>
-<translation id="6579235177984085399">Oppdag nye tegne- og designverktøy</translation>
 <translation id="6596816719288285829">IP-adresse</translation>
 <translation id="6603230386432466813">Har du problemer med å koble til?</translation>
 <translation id="6618744767048954150">Kjører</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 300a8c4..a5f6241 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -297,7 +297,6 @@
 <translation id="65587193855025101">ଫ୍ଲାଟବେଡ୍</translation>
 <translation id="6564646048574748301">ବିଫଳ ହୋଇଛି - ପ୍ରିଣ୍ଟର୍ ସହ ସଂଯୋଗ କରି ହେଉନାହିଁ</translation>
 <translation id="6574762126505704998">ସମ୍ପୂର୍ଣ୍ଣ ରୂପେ କ୍ରପ୍ କରନ୍ତୁ</translation>
-<translation id="6579235177984085399">ନୂଆ ଡ୍ରଇଂ ଏବଂ ଡିଜାଇନ୍ ଟୁଲଗୁଡ଼ିକୁ ଡିସ୍କଭର କରନ୍ତୁ</translation>
 <translation id="6596816719288285829">IP ଠିକଣା</translation>
 <translation id="6603230386432466813">ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି କି?</translation>
 <translation id="6618744767048954150">ଚାଲୁଛି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 4707add..baabc55 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">ਅਸਫਲ ਰਹੀ - ਪ੍ਰਿੰਟਰ ਪਹੁੰਚਯੋਗ ਨਹੀਂ ਹੈ</translation>
 <translation id="6574762126505704998">ਭਰੋ</translation>
 <translation id="6575134580692778371">ਕੌਂਫਿਗਰ ਨਹੀਂ ਕੀਤਾ</translation>
-<translation id="6579235177984085399">ਨਵੀਂ ਚਿੱਤਰਕਾਰੀ ਅਤੇ ਡਿਜ਼ਾਈਨ ਟੂਲ ਖੋਜੋ</translation>
 <translation id="6596816719288285829">IP ਪਤਾ</translation>
 <translation id="6603230386432466813">ਕੀ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆ ਰਹੀ ਹੈ?</translation>
 <translation id="6618744767048954150">ਚੱਲ ਰਿਹਾ ਹੈ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index d06200f..6d9840f 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Niepowodzenie – drukarka jest nieosiągalna</translation>
 <translation id="6574762126505704998">Wypełnienie</translation>
 <translation id="6575134580692778371">Nie skonfigurowano</translation>
-<translation id="6579235177984085399">Odkryj nowe narzędzia do rysowania i projektowania</translation>
 <translation id="6596816719288285829">Adres IP</translation>
 <translation id="6603230386432466813">Masz kłopoty z nawiązaniem połączenia?</translation>
 <translation id="6618744767048954150">W toku</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index dc1a6a3..9a5e985f 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Falha - Impressora inacessível</translation>
 <translation id="6574762126505704998">Preencher</translation>
 <translation id="6575134580692778371">Não configurado</translation>
-<translation id="6579235177984085399">Descubra novas ferramentas de desenho e design</translation>
 <translation id="6596816719288285829">Endereço IP</translation>
 <translation id="6603230386432466813">Problemas com a conexão?</translation>
 <translation id="6618744767048954150">Em execução</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb
index f9f6f89..1b1ed06 100644
--- a/chromeos/strings/chromeos_strings_pt-PT.xtb
+++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Falha – Impressora inacessível</translation>
 <translation id="6574762126505704998">Preenchimento</translation>
 <translation id="6575134580692778371">Não configurado</translation>
-<translation id="6579235177984085399">Descubra novas ferramentas de desenho e design</translation>
 <translation id="6596816719288285829">Endereço IP</translation>
 <translation id="6603230386432466813">Está a ter problemas com a ligação?</translation>
 <translation id="6618744767048954150">Em execução</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index ac9e5dcb..67d74ac 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nereușită – Imprimanta nu poate fi accesată</translation>
 <translation id="6574762126505704998">Umplere</translation>
 <translation id="6575134580692778371">Nu este configurată</translation>
-<translation id="6579235177984085399">Descoperă noi instrumente de desenare și design</translation>
 <translation id="6596816719288285829">Adresă IP</translation>
 <translation id="6603230386432466813">Ai întâmpinat probleme la conectare?</translation>
 <translation id="6618744767048954150">Rulează</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index 9334b5b..230168f 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Сбой: принтер недоступен</translation>
 <translation id="6574762126505704998">Заполнить</translation>
 <translation id="6575134580692778371">Не настроено</translation>
-<translation id="6579235177984085399">Инструменты для рисования и веб-дизайна</translation>
 <translation id="6596816719288285829">IP-адрес</translation>
 <translation id="6603230386432466813">Не удается подключиться?</translation>
 <translation id="6618744767048954150">Выполняется</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index 7fcfeac..08f4f8a 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">අසාර්ථක විය - මුද්‍රණ යන්ත්‍රය වෙත ළඟා විය නොහැකිය</translation>
 <translation id="6574762126505704998">පුරවන්න</translation>
 <translation id="6575134580692778371">වින්‍යාස නොකරන ලදි</translation>
-<translation id="6579235177984085399">නව ඇඳීම් සහ සැලසුම් මෙවලම් අනාවරණය කර ගන්න</translation>
 <translation id="6596816719288285829">IP ලිපිනය</translation>
 <translation id="6603230386432466813">සම්බන්ධ වීමේ ගැටලුවක් තිබේද?</translation>
 <translation id="6618744767048954150">ධාවන වේ</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 0e9c481..813d637cc 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nepodarilo sa – nedostupné</translation>
 <translation id="6574762126505704998">Výplň</translation>
 <translation id="6575134580692778371">Nenakonfigurované</translation>
-<translation id="6579235177984085399">Objavte nové nástroje na kreslenie a dizajn</translation>
 <translation id="6596816719288285829">Adresa IP</translation>
 <translation id="6603230386432466813">Máte problémy s pripojením?</translation>
 <translation id="6618744767048954150">Beží</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index a5a54d5..9556baa 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Napaka – tiskalnik je nedosegljiv</translation>
 <translation id="6574762126505704998">Zapolnitev</translation>
 <translation id="6575134580692778371">Naprava ni konfigurirana</translation>
-<translation id="6579235177984085399">Odkrivanje novih orodij za risanje in oblikovanje</translation>
 <translation id="6596816719288285829">Naslov IP</translation>
 <translation id="6603230386432466813">Imate težave pri povezovanju?</translation>
 <translation id="6618744767048954150">Preverjanje poteka</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb
index a294659..173455f 100644
--- a/chromeos/strings/chromeos_strings_sq.xtb
+++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">Skedarët e mi</translation>
 <translation id="3199982728237701504">Furnizuesi i dokumentit (dy anë)</translation>
 <translation id="3226405216343213872">Po kërkon për skanerë</translation>
+<translation id="3228433892370472777">Lidhja e parazgjedhur</translation>
 <translation id="3246869037381808805">Printimet më të vjetra se 1 ditë do të hiqen</translation>
 <translation id="3268178239013324452">Dështoi - Kapaku i hapur</translation>
 <translation id="3283504360622356314">{0,plural, =1{Modifiko skedarin}other{Modifiko skedarët}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">Tensioni</translation>
 <translation id="4917385247580444890">I fortë</translation>
 <translation id="4917889632206600977">Ndaloi - Nuk ka letër</translation>
+<translation id="491836528011451486">Vendose dokumentin tënd në skaner dhe zgjidh "Riskano" për të skanuar dhe rivendosur faqen <ph name="CURRENT_PAGE" />.</translation>
 <translation id="4921665434385737356">U karikua <ph name="RATE" /> në <ph name="NUM_SECONDS" /> sekonda.</translation>
 <translation id="4932733599132424254">Data</translation>
 <translation id="498186245079027698">Kontrollo skanerin dhe provo përsëri. Sigurohu që të jetë hapësirë lokale të mjaftueshme për të ruajtur skedarët e skanuar.</translation>
@@ -297,7 +299,6 @@
 <translation id="6564646048574748301">Dështoi - Printeri është i paarritshëm</translation>
 <translation id="6574762126505704998">Mbush</translation>
 <translation id="6575134580692778371">I pakonfiguruar</translation>
-<translation id="6579235177984085399">Zbulo vegla të reja vizatimi dhe dizajni</translation>
 <translation id="6596816719288285829">Adresa e IP-së</translation>
 <translation id="6603230386432466813">Ke probleme me lidhjen?</translation>
 <translation id="6618744767048954150">Në ekzekutim</translation>
@@ -330,6 +331,7 @@
 <translation id="7177485034254901881">Kjo pajisje <ph name="DEVICE_TYPE" /> menaxhohet nga <ph name="MANAGER" />. Administratorët mund ta konfigurojnë në distancë pajisjen.</translation>
 <translation id="7180611975245234373">Rifresko</translation>
 <translation id="7216409898977639127">Operatori celular</translation>
+<translation id="7257889006063274246">Je i sigurt që dëshiron ta heqësh faqen <ph name="CURRENT_PAGE" />?</translation>
 <translation id="7271040990581020067">Skaneri është aktualisht në përdorim. Provo përsëri më vonë.</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">Koleksionet e imazheve të sfondit</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb
index ed3b693..f8c2f14 100644
--- a/chromeos/strings/chromeos_strings_sr-Latn.xtb
+++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Nije uspelo – štampač nije dostupan</translation>
 <translation id="6574762126505704998">Popuni</translation>
 <translation id="6575134580692778371">Nije konfigurisan</translation>
-<translation id="6579235177984085399">Otkrijte nove alatke za crtanje i dizajn</translation>
 <translation id="6596816719288285829">IP adresa</translation>
 <translation id="6603230386432466813">Imate problema pri povezivanju?</translation>
 <translation id="6618744767048954150">U toku je</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb
index afe3717e..525ef24 100644
--- a/chromeos/strings/chromeos_strings_sr.xtb
+++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Није успело – штампач није доступан</translation>
 <translation id="6574762126505704998">Попуни</translation>
 <translation id="6575134580692778371">Није конфигурисан</translation>
-<translation id="6579235177984085399">Откријте нове алатке за цртање и дизајн</translation>
 <translation id="6596816719288285829">IP адреса</translation>
 <translation id="6603230386432466813">Имате проблема при повезивању?</translation>
 <translation id="6618744767048954150">У току је</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index 0ed88d94..0f4cc8d 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Misslyckades – skrivaren kan inte nås</translation>
 <translation id="6574762126505704998">Fyll</translation>
 <translation id="6575134580692778371">Inte konfigurerat</translation>
-<translation id="6579235177984085399">Upptäck nya rit- och designverktyg</translation>
 <translation id="6596816719288285829">IP-adress</translation>
 <translation id="6603230386432466813">Går det inte att ansluta?</translation>
 <translation id="6618744767048954150">Körs</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb
index 0b5c55b2..93f1dd6e 100644
--- a/chromeos/strings/chromeos_strings_sw.xtb
+++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -299,7 +299,6 @@
 <translation id="6564646048574748301">Haijakamilika - Printa haiwezi kufikiwa</translation>
 <translation id="6574762126505704998">Jaza</translation>
 <translation id="6575134580692778371">Haijasanidiwa</translation>
-<translation id="6579235177984085399">Gundua zana mpya za kuchora na kusanifu</translation>
 <translation id="6596816719288285829">Anwani ya IP</translation>
 <translation id="6603230386432466813">Je, unatatizika kuunganisha?</translation>
 <translation id="6618744767048954150">Inakagua</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index 53a0023..0a3a844 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">பிரிண்டரை அணுக முடியாததால் அச்சிட முடியவில்லை</translation>
 <translation id="6574762126505704998">முழுத் திரை</translation>
 <translation id="6575134580692778371">உள்ளமைக்கப்படவில்லை</translation>
-<translation id="6579235177984085399">வரைபடம் &amp; வடிவமைப்பிற்கான புதிய கருவிகளைக் கண்டறியுங்கள்</translation>
 <translation id="6596816719288285829">IP முகவரி</translation>
 <translation id="6603230386432466813">இணைப்பதில் சிக்கலா?</translation>
 <translation id="6618744767048954150">சோதனை செய்கிறது</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 891468f3..ba3d255 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">విఫలమైంది - ప్రింటర్‌ను చేరుకోవడం సాధ్యపడలేదు</translation>
 <translation id="6574762126505704998">నింపండి</translation>
 <translation id="6575134580692778371">కాన్ఫిగర్ చెయ్యలేదు</translation>
-<translation id="6579235177984085399">కొత్త డ్రాయింగ్‌ను, డిజైన్ టూల్స్‌ను డిస్కవర్ చేయండి</translation>
 <translation id="6596816719288285829">IP చిరునామా</translation>
 <translation id="6603230386432466813">కనెక్ట్ చేయడంలో సమస్య ఉందా?</translation>
 <translation id="6618744767048954150">రన్ అవుతున్నాయి</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index 1446a03..a0019c39 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">ไม่สำเร็จ - เข้าถึงเครื่องพิมพ์ไม่ได้</translation>
 <translation id="6574762126505704998">เติม</translation>
 <translation id="6575134580692778371">ไม่ได้กำหนดค่า</translation>
-<translation id="6579235177984085399">สำรวจเครื่องมือใหม่ๆ สำหรับการวาดเขียนและการออกแบบ</translation>
 <translation id="6596816719288285829">ที่อยู่ IP</translation>
 <translation id="6603230386432466813">หากพบปัญหาในการเชื่อมต่อ</translation>
 <translation id="6618744767048954150">กำลังดำเนินการ</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index 3cb5d43..06ac5e62 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">İşlem başarısız - Yazıcıya ulaşılamıyor</translation>
 <translation id="6574762126505704998">Tam kaplama</translation>
 <translation id="6575134580692778371">Yapılandırılmadı</translation>
-<translation id="6579235177984085399">Yeni çizim ve tasarım araçlarını keşfedin</translation>
 <translation id="6596816719288285829">IP Adresi</translation>
 <translation id="6603230386432466813">Bağlanmayla ilgili sorun mu yaşıyorsunuz?</translation>
 <translation id="6618744767048954150">Çalışıyor</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index d2a03be..ab8f0ec 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Не надруковано – принтер недоступний</translation>
 <translation id="6574762126505704998">Заповнення</translation>
 <translation id="6575134580692778371">Не налаштовано</translation>
-<translation id="6579235177984085399">Перегляньте нові інструменти для малювання та дизайну</translation>
 <translation id="6596816719288285829">ІР-адреса</translation>
 <translation id="6603230386432466813">Проблеми з підключенням?</translation>
 <translation id="6618744767048954150">Виконується</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index fb81fce..d03f7a1 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -297,7 +297,6 @@
 <translation id="6564646048574748301">ناکام ہو گیا - پرنٹر ناقابل رسائی ہے</translation>
 <translation id="6574762126505704998">بھریں</translation>
 <translation id="6575134580692778371">کنفیگر نہیں ہے</translation>
-<translation id="6579235177984085399">نئی ڈرائنگ اور ڈیزائن کے ٹولز دریافت کریں</translation>
 <translation id="6596816719288285829">‏IP پتہ</translation>
 <translation id="6603230386432466813">منسلک کرنے میں دشواری ہو رہی ہے؟</translation>
 <translation id="6618744767048954150">جاری ہے</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 47daf4e8..de217d5 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Bajarilmadi - Printer ulanmagan</translation>
 <translation id="6574762126505704998">Toʻldirish</translation>
 <translation id="6575134580692778371">Sozlanmagan</translation>
-<translation id="6579235177984085399">Yangi chizish va dizayn asboblarini kashf eting</translation>
 <translation id="6596816719288285829">IP manzil</translation>
 <translation id="6603230386432466813">Ulanishda muammo bormi?</translation>
 <translation id="6618744767048954150">Bajarilmoqda</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb
index 87c95a96..f65a50b 100644
--- a/chromeos/strings/chromeos_strings_vi.xtb
+++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">Tệp của tôi</translation>
 <translation id="3199982728237701504">Khay nạp tài liệu (2 mặt)</translation>
 <translation id="3226405216343213872">Đang tìm máy quét</translation>
+<translation id="3228433892370472777">Kết nối mặc định</translation>
 <translation id="3246869037381808805">Các lệnh in quá 1 ngày sẽ bị xóa</translation>
 <translation id="3268178239013324452">Không thành công – Cửa máy in đang mở</translation>
 <translation id="3283504360622356314">{0,plural, =1{Chỉnh sửa tệp}other{Chỉnh sửa các tệp}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">Độ ổn định</translation>
 <translation id="4917385247580444890">Mạnh</translation>
 <translation id="4917889632206600977">Đã dừng – Hết giấy</translation>
+<translation id="491836528011451486">Đặt tài liệu của bạn lên máy quét và chọn Quét lại để quét và thay thế trang <ph name="CURRENT_PAGE" />.</translation>
 <translation id="4921665434385737356">Đã sạc <ph name="RATE" /> trong <ph name="NUM_SECONDS" /> giây.</translation>
 <translation id="4932733599132424254">Ngày Tháng</translation>
 <translation id="498186245079027698">Hãy kiểm tra trình quét rồi thử lại. Đảm bảo máy có đủ dung lượng để lưu các tệp đã quét.</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">Không thành công – Không thể kết nối với máy in</translation>
 <translation id="6574762126505704998">Toàn bộ ảnh</translation>
 <translation id="6575134580692778371">Chưa được định cấu hình</translation>
-<translation id="6579235177984085399">Khám phá các công cụ vẽ và thiết kế mới</translation>
 <translation id="6596816719288285829">Địa chỉ IP</translation>
 <translation id="6603230386432466813">Bạn đang gặp sự cố khi kết nối?</translation>
 <translation id="6618744767048954150">Đang chạy</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881"><ph name="DEVICE_TYPE" /> này do <ph name="MANAGER" /> quản lý. Quản trị viên có thể định cấu hình từ xa thiết bị này.</translation>
 <translation id="7180611975245234373">Làm mới</translation>
 <translation id="7216409898977639127">Nhà cung cấp dịch vụ di động</translation>
+<translation id="7257889006063274246">Bạn có chắc chắn muốn xóa trang <ph name="CURRENT_PAGE" /> không?</translation>
 <translation id="7271040990581020067">Máy quét đang được sử dụng. Hãy thử lại sau.</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">Bộ sưu tập hình nền</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index da2a1f2..d757432 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -298,7 +298,6 @@
 <translation id="6564646048574748301">失败 - 无法连接到打印机</translation>
 <translation id="6574762126505704998">填充</translation>
 <translation id="6575134580692778371">未配置</translation>
-<translation id="6579235177984085399">探索新的绘图和设计工具</translation>
 <translation id="6596816719288285829">IP 地址</translation>
 <translation id="6603230386432466813">连接时遇到了问题?</translation>
 <translation id="6618744767048954150">正在运行</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index e399e93..6487a35 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">失敗 - 無法連接打印機</translation>
 <translation id="6574762126505704998">填滿</translation>
 <translation id="6575134580692778371">未設定</translation>
-<translation id="6579235177984085399">探索全新的繪圖和設計工具</translation>
 <translation id="6596816719288285829">IP 地址</translation>
 <translation id="6603230386432466813">連線時遇到問題嗎?</translation>
 <translation id="6618744767048954150">正在執行</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 3ea891c..fef91b4 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -102,6 +102,7 @@
 <translation id="3188257591659621405">我的檔案</translation>
 <translation id="3199982728237701504">文件送紙器 (雙面)</translation>
 <translation id="3226405216343213872">正在尋找掃描器</translation>
+<translation id="3228433892370472777">預設連線</translation>
 <translation id="3246869037381808805">系統會移除 1 天前的列印工作</translation>
 <translation id="3268178239013324452">失敗 - 蓋子處於開啟狀態</translation>
 <translation id="3283504360622356314">{0,plural, =1{編輯檔案}other{編輯檔案}}</translation>
@@ -200,6 +201,7 @@
 <translation id="4891842000192098784">壓力</translation>
 <translation id="4917385247580444890">強</translation>
 <translation id="4917889632206600977">已停止 - 紙張用盡</translation>
+<translation id="491836528011451486">將文件放到掃描器上並選取 [重新掃描],即可掃描及取代第 <ph name="CURRENT_PAGE" /> 頁。</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> 秒內已充電 <ph name="RATE" />。</translation>
 <translation id="4932733599132424254">日期</translation>
 <translation id="498186245079027698">請檢查掃描器,然後再試一次。另請確認本機有足夠空間可以儲存掃描的檔案。</translation>
@@ -298,7 +300,6 @@
 <translation id="6564646048574748301">失敗 - 無法連上印表機</translation>
 <translation id="6574762126505704998">填滿</translation>
 <translation id="6575134580692778371">未設定</translation>
-<translation id="6579235177984085399">探索新的繪圖和設計工具</translation>
 <translation id="6596816719288285829">IP 位址</translation>
 <translation id="6603230386432466813">連線時遇到問題嗎?</translation>
 <translation id="6618744767048954150">檢查中</translation>
@@ -331,6 +332,7 @@
 <translation id="7177485034254901881">這部 <ph name="DEVICE_TYPE" /> 是由 <ph name="MANAGER" /> 管理。系統管理員可從遠端設定這部裝置。</translation>
 <translation id="7180611975245234373">重新整理</translation>
 <translation id="7216409898977639127">行動網路提供者</translation>
+<translation id="7257889006063274246">確定要移除第 <ph name="CURRENT_PAGE" /> 頁嗎?</translation>
 <translation id="7271040990581020067">掃描器正在使用中,請稍後再試。</translation>
 <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation>
 <translation id="7287310195820267359">桌布集錦</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index 59e0d1bd..fee6044 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -300,7 +300,6 @@
 <translation id="6564646048574748301">Yehlulekile - Iphrinta ayifinyeleleki</translation>
 <translation id="6574762126505704998">Gcwalisa</translation>
 <translation id="6575134580692778371">Akulungiselelwe</translation>
-<translation id="6579235177984085399">Thola umdwebo omusha namathuluzi wokudizayina</translation>
 <translation id="6596816719288285829">Ikheli le-IP</translation>
 <translation id="6603230386432466813">Unenkinga yokuxhuma?</translation>
 <translation id="6618744767048954150">Uyagijima</translation>
diff --git a/components/accuracy_tips/accuracy_service.cc b/components/accuracy_tips/accuracy_service.cc
index cb8492c..b6ac68b 100644
--- a/components/accuracy_tips/accuracy_service.cc
+++ b/components/accuracy_tips/accuracy_service.cc
@@ -157,6 +157,13 @@
                      weak_factory_.GetWeakPtr(), base::TimeTicks::Now()));
 }
 
+void AccuracyService::MaybeShowSurvey() {
+  if (CanShowSurvey()) {
+    // TODO(olesiamarukhno): Add passing the actual survey data here.
+    delegate_->ShowSurvey({}, {});
+  }
+}
+
 void AccuracyService::OnAccuracyTipClosed(base::TimeTicks time_opened,
                                           AccuracyTipInteraction interaction) {
   DCHECK(ui_task_runner_->RunsTasksInCurrentSequence());
@@ -184,4 +191,23 @@
   }
 }
 
+bool AccuracyService::CanShowSurvey() {
+  if (!base::FeatureList::IsEnabled(
+          accuracy_tips::features::kAccuracyTipsSurveyFeature) ||
+      disable_ui_) {
+    return false;
+  }
+
+  base::Time last_shown =
+      pref_service_->GetTime(GetLastShownPrefName(disable_ui_));
+
+  base::TimeDelta last_shown_delta = clock_->Now() - last_shown;
+  const bool has_required_time_passed =
+      last_shown_delta >= features::kMinTimeToShowSurvey.Get() &&
+      last_shown_delta <= features::kMaxTimeToShowSurvey.Get();
+  // TODO(olesiamarukhno): Add checks for prompt count and add saving the shown
+  // prompt count.
+  return has_required_time_passed;
+}
+
 }  // namespace accuracy_tips
diff --git a/components/accuracy_tips/accuracy_service.h b/components/accuracy_tips/accuracy_service.h
index 32bddb9..6491d996 100644
--- a/components/accuracy_tips/accuracy_service.h
+++ b/components/accuracy_tips/accuracy_service.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_ACCURACY_TIPS_ACCURACY_SERVICE_H_
 #define COMPONENTS_ACCURACY_TIPS_ACCURACY_SERVICE_H_
 
+#include <map>
 #include <memory>
 #include "base/callback_forward.h"
 #include "base/memory/weak_ptr.h"
@@ -61,6 +62,12 @@
         bool show_opt_out,
         base::OnceCallback<void(AccuracyTipInteraction)> close_callback) = 0;
 
+    // Launches accuracy tips survey with the product specific data.
+    virtual void ShowSurvey(
+        const std::map<std::string, bool>& product_specific_bits_data,
+        const std::map<std::string, std::string>&
+            product_specific_string_data) = 0;
+
     virtual ~Delegate() = default;
   };
 
@@ -86,6 +93,10 @@
   // Virtual for testing purposes.
   virtual void MaybeShowAccuracyTip(content::WebContents* web_contents);
 
+  // Shows a HaTS survey after checking features states and pre-conditions
+  // configured by feature params in `CanShowSurvey`.
+  void MaybeShowSurvey();
+
   // KeyedService:
   void Shutdown() override;
 
@@ -99,6 +110,10 @@
   void OnAccuracyTipClosed(base::TimeTicks time_opened,
                            AccuracyTipInteraction interaction);
 
+  // Returns if a HaTS survey for accuracy tips can be shown based on feature
+  // state and feature params.
+  bool CanShowSurvey();
+
   std::unique_ptr<Delegate> delegate_;
   PrefService* pref_service_ = nullptr;
   scoped_refptr<AccuracyTipSafeBrowsingClient> sb_client_;
diff --git a/components/accuracy_tips/accuracy_service_unittest.cc b/components/accuracy_tips/accuracy_service_unittest.cc
index 7120f08..7f5d84a0 100644
--- a/components/accuracy_tips/accuracy_service_unittest.cc
+++ b/components/accuracy_tips/accuracy_service_unittest.cc
@@ -44,6 +44,12 @@
                     AccuracyTipStatus,
                     bool,
                     base::OnceCallback<void(AccuracyTipInteraction)>));
+
+  MOCK_METHOD2(
+      ShowSurvey,
+      void(const std::map<std::string, bool>& product_specific_bits_data,
+           const std::map<std::string, std::string>&
+               product_specific_string_data));
 };
 
 class MockSafeBrowsingDatabaseManager
@@ -323,4 +329,46 @@
   EXPECT_EQ(CheckAccuracyStatusSync(url), AccuracyTipStatus::kShowAccuracyTip);
 }
 
-}  // namespace accuracy_tips
\ No newline at end of file
+class AccuracyServiceSurveyTest : public AccuracyServiceTest {
+ private:
+  void SetUpFeatureList(base::test::ScopedFeatureList& feature_list) override {
+    const base::FieldTrialParams accuraty_tips_params = {
+        {features::kSampleUrl.name, "https://sampleurl.com"}};
+    feature_list.InitWithFeaturesAndParameters(
+        {{safe_browsing::kAccuracyTipsFeature, accuraty_tips_params},
+         {features::kAccuracyTipsSurveyFeature, {}}},
+        {});
+  }
+};
+
+TEST_F(AccuracyServiceSurveyTest, SurveyTimeRange) {
+  // Before a tip is shown, a survey won't be shown.
+  EXPECT_CALL(*delegate(), ShowSurvey(_, _)).Times(0);
+  service()->MaybeShowSurvey();
+  testing::Mock::VerifyAndClearExpectations(delegate());
+
+  // Show an accuracy tip.
+  EXPECT_CALL(*delegate(), ShowAccuracyTip(_, _, _, _));
+  service()->MaybeShowAccuracyTip(nullptr);
+
+  // But even after it was shown, need to wait minimal amount of time to show
+  // a survey.
+  EXPECT_CALL(*delegate(), ShowSurvey(_, _)).Times(0);
+  service()->MaybeShowSurvey();
+  testing::Mock::VerifyAndClearExpectations(delegate());
+
+  // After minimal time passed, a survey can be shown.
+  clock()->Advance(features::kMinTimeToShowSurvey.Get());
+  EXPECT_CALL(*delegate(), ShowSurvey(_, _)).Times(1);
+  service()->MaybeShowSurvey();
+  testing::Mock::VerifyAndClearExpectations(delegate());
+
+  // A survey can be shown in the time range, defined in feature params. After
+  // max time passed, a survey cannot be shown anymore.
+  clock()->Advance(features::kMaxTimeToShowSurvey.Get());
+  EXPECT_CALL(*delegate(), ShowSurvey(_, _)).Times(0);
+  service()->MaybeShowSurvey();
+  testing::Mock::VerifyAndClearExpectations(delegate());
+}
+
+}  // namespace accuracy_tips
diff --git a/components/accuracy_tips/features.cc b/components/accuracy_tips/features.cc
index f0e48f3..b43a349 100644
--- a/components/accuracy_tips/features.cc
+++ b/components/accuracy_tips/features.cc
@@ -28,5 +28,16 @@
 extern const base::FeatureParam<int> kNumIgnorePrompts{
     &safe_browsing::kAccuracyTipsFeature, "NumIgnorePrompts", 2};
 
+const base::Feature kAccuracyTipsSurveyFeature{
+    "AccuracyTipsSurvey", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::FeatureParam<base::TimeDelta> kMinTimeToShowSurvey{
+    &kAccuracyTipsSurveyFeature, "MinTimeToShowSurvey",
+    base::TimeDelta::FromMinutes(10)};
+
+const base::FeatureParam<base::TimeDelta> kMaxTimeToShowSurvey{
+    &kAccuracyTipsSurveyFeature, "MaxTimeToShowSurvey",
+    base::TimeDelta::FromMinutes(30)};
+
 }  // namespace features
 }  // namespace accuracy_tips
diff --git a/components/accuracy_tips/features.h b/components/accuracy_tips/features.h
index 6702a28c..3471e54 100644
--- a/components/accuracy_tips/features.h
+++ b/components/accuracy_tips/features.h
@@ -29,7 +29,18 @@
 // opt-out.
 extern const base::FeatureParam<int> kNumIgnorePrompts;
 
+// Controls whether accuracy tips survey should be enabled.
+extern const base::Feature kAccuracyTipsSurveyFeature;
+
+// A minimal amount of time that has to pass after showing accuracy tip before
+// trying to show a survey.
+extern const base::FeatureParam<base::TimeDelta> kMinTimeToShowSurvey;
+
+// A maximal amount of time, that passed after showing accuracy tip, during
+// which we can show a survey.
+extern const base::FeatureParam<base::TimeDelta> kMaxTimeToShowSurvey;
+
 }  // namespace features
 }  // namespace accuracy_tips
 
-#endif  // COMPONENTS_ACCURACY_TIPS_FEATURES_H_
\ No newline at end of file
+#endif  // COMPONENTS_ACCURACY_TIPS_FEATURES_H_
diff --git a/components/arc/mojom/auth.mojom b/components/arc/mojom/auth.mojom
index f03e47c7..373d1f547 100644
--- a/components/arc/mojom/auth.mojom
+++ b/components/arc/mojom/auth.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Next MinVersion: 28
+// Next MinVersion: 29
 
 module arc.mojom;
 
@@ -219,6 +219,24 @@
     // corresponding UMA callsite in Chrome arc::UpdateAuthAccountCheckStatus.
 };
 
+// These values describe AndroidId source during ARC provisioning.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+[Extensible]
+enum AndroidIdSource {
+    // AndroidId was not found.
+    [MinVersion=28] MISSING = 0,
+
+    // AndroidId was cached.
+    [MinVersion=28] CACHED = 1,
+
+    // AndroidId was found via GService flag.
+    [MinVersion=28] GSERVICE_FLAG = 2,
+
+    // AndroidId was found via GmsProxy api.
+    [MinVersion=28] GMS_PROXY = 3,
+};
+
 // These values describe the reason for reauth.
 [Extensible]
 enum ReauthReason {
@@ -381,7 +399,7 @@
   string gaia_id;
 };
 
-// Next Method ID: 21.
+// Next Method ID: 22.
 interface AuthHost {
   // Notifies Chrome that the authorization flow is completed and provides
   // |result| and |account| that was authorized.
@@ -458,6 +476,9 @@
 
   // Reports the reason for doing auth despite device being provisioned earlier.
   [MinVersion=27] ReportAccountReauthReason@20(ReauthReason reason);
+
+  // Reports AndroidId source during provisioning.
+  [MinVersion=28] ReportAndroidIdSource@21(AndroidIdSource source);
 };
 
 // Next Method ID: 6
diff --git a/components/arc/test/fake_net_instance.cc b/components/arc/test/fake_net_instance.cc
index 82b5005..636a731 100644
--- a/components/arc/test/fake_net_instance.cc
+++ b/components/arc/test/fake_net_instance.cc
@@ -29,7 +29,14 @@
 
 void FakeNetInstance::DnsResolutionTest(const std::string& transport_name,
                                         const std::string& host_name,
-                                        DnsResolutionTestCallback callback) {}
+                                        DnsResolutionTestCallback callback) {
+  mojom::ArcDnsResolutionTestResultPtr result_ptr =
+      mojom::ArcDnsResolutionTestResult::New();
+  result_ptr->is_successful = dns_resolution_test_result_.is_successful;
+  result_ptr->response_code = dns_resolution_test_result_.response_code;
+  result_ptr->duration_ms = dns_resolution_test_result_.duration_ms;
+  std::move(callback).Run(std::move(result_ptr));
+}
 
 void FakeNetInstance::HttpTest(const std::string& transport_name,
                                const ::GURL& url,
diff --git a/components/arc/test/fake_net_instance.h b/components/arc/test/fake_net_instance.h
index 0b9e8840..b4cb688 100644
--- a/components/arc/test/fake_net_instance.h
+++ b/components/arc/test/fake_net_instance.h
@@ -49,8 +49,14 @@
     http_test_result_ = http_test_result;
   }
 
+  void set_dns_resolution_test_result(
+      mojom::ArcDnsResolutionTestResult dns_resolution_test_result) {
+    dns_resolution_test_result_ = dns_resolution_test_result;
+  }
+
  private:
   mojom::ArcHttpTestResult http_test_result_;
+  mojom::ArcDnsResolutionTestResult dns_resolution_test_result_;
 };
 
 }  // namespace arc
diff --git a/components/autofill_assistant/browser/website_login_manager_impl.cc b/components/autofill_assistant/browser/website_login_manager_impl.cc
index 6cff4e69..d843484 100644
--- a/components/autofill_assistant/browser/website_login_manager_impl.cc
+++ b/components/autofill_assistant/browser/website_login_manager_impl.cc
@@ -189,7 +189,7 @@
                        std::move(notify_finished_callback)),
         login_(login),
         callback_(std::move(callback)),
-        store_(client->GetProfilePasswordStore()) {}
+        store_(client->GetProfilePasswordStoreInterface()) {}
 
  protected:
   // From PendingRequest:
@@ -229,7 +229,7 @@
         new_password_(new_password),
         callback_(std::move(callback)),
         form_saver_(std::make_unique<password_manager::FormSaverImpl>(
-            client->GetProfilePasswordStore())) {}
+            client->GetProfilePasswordStoreInterface())) {}
 
  protected:
   // From PendingRequest:
diff --git a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
index 22eb68a5..9f0f84c2 100644
--- a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
+++ b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
@@ -9,9 +9,10 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
-#include "components/password_manager/core/browser/mock_password_store.h"
+#include "components/password_manager/core/browser/mock_password_store_interface.h"
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/password_manager/core/browser/password_store_consumer.h"
+#include "components/password_manager/core/browser/password_store_interface.h"
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
 #include "components/password_manager/core/browser/stub_password_manager_driver.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -54,10 +55,10 @@
   MockPasswordManagerClient() = default;
   ~MockPasswordManagerClient() override = default;
 
-  MOCK_CONST_METHOD0(GetProfilePasswordStore,
-                     password_manager::PasswordStore*());
-  MOCK_CONST_METHOD0(GetAccountPasswordStore,
-                     password_manager::PasswordStore*());
+  MOCK_CONST_METHOD0(GetProfilePasswordStoreInterface,
+                     password_manager::PasswordStoreInterface*());
+  MOCK_CONST_METHOD0(GetAccountPasswordStoreInterface,
+                     password_manager::PasswordStoreInterface*());
   MOCK_CONST_METHOD0(GetPasswordManager, PasswordManager*());
   MOCK_METHOD(bool,
               IsSavingAndFillingEnabled,
@@ -121,18 +122,16 @@
   void SetUp() override {
     web_contents_ = content::WebContentsTester::CreateTestWebContents(
         &browser_context_, nullptr);
-    profile_store_ = new password_manager::MockPasswordStore;
-    ASSERT_TRUE(profile_store_->Init(/*prefs=*/nullptr));
+    profile_store_ = new password_manager::MockPasswordStoreInterface;
 
-    ON_CALL(client_, GetProfilePasswordStore())
+    ON_CALL(client_, GetProfilePasswordStoreInterface())
         .WillByDefault(Return(profile_store_.get()));
 
     if (base::FeatureList::IsEnabled(
             password_manager::features::kEnablePasswordsAccountStorage)) {
-      account_store_ = new password_manager::MockPasswordStore;
-      ASSERT_TRUE(account_store_->Init(/*prefs=*/nullptr));
+      account_store_ = new password_manager::MockPasswordStoreInterface;
 
-      ON_CALL(client_, GetAccountPasswordStore())
+      ON_CALL(client_, GetAccountPasswordStoreInterface())
           .WillByDefault(Return(account_store_.get()));
     }
     ON_CALL(*store(), GetLogins(_, _))
@@ -151,15 +150,10 @@
         .WillByDefault(Return(password_manager_.get()));
   }
 
-  void TearDown() override {
-    if (account_store_) {
-      account_store_->ShutdownOnUIThread();
-    }
-    profile_store_->ShutdownOnUIThread();
+  password_manager::MockPasswordStoreInterface* store() {
+    return profile_store_.get();
   }
 
-  password_manager::MockPasswordStore* store() { return profile_store_.get(); }
-
   void WaitForPasswordStore() { task_environment_.RunUntilIdle(); }
 
  protected:
@@ -171,8 +165,8 @@
   std::unique_ptr<WebsiteLoginManagerImpl> manager_;
   std::unique_ptr<PasswordManager> password_manager_;
   password_manager::StubPasswordManagerDriver driver_;
-  scoped_refptr<password_manager::MockPasswordStore> profile_store_;
-  scoped_refptr<password_manager::MockPasswordStore> account_store_;
+  scoped_refptr<password_manager::MockPasswordStoreInterface> profile_store_;
+  scoped_refptr<password_manager::MockPasswordStoreInterface> account_store_;
 };
 
 // Checks if PasswordForm matches other PasswordForm.
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
index 051836d2..9083ab0 100644
--- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
+++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
@@ -149,12 +149,6 @@
     /** The FrameLayout used to hold the bottom sheet toolbar. */
     private TouchRestrictingFrameLayout mToolbarHolder;
 
-    /**
-     * The default toolbar view. This is shown when the current bottom sheet content doesn't have
-     * its own toolbar and when the bottom sheet is closed.
-     */
-    protected View mDefaultToolbarView;
-
     /** Whether the {@link BottomSheet} and its children should react to touch events. */
     private boolean mIsTouchEnabled;
 
@@ -220,7 +214,7 @@
         }
 
         float startX = mVisibleViewportRect.left;
-        float endX = getToolbarView().getWidth() + mVisibleViewportRect.left;
+        float endX = getWidth() + mVisibleViewportRect.left;
         return currentEvent.getRawX() > startX && currentEvent.getRawX() < endX;
     }
 
@@ -316,8 +310,6 @@
         mToolbarHolder =
                 (TouchRestrictingFrameLayout) findViewById(R.id.bottom_sheet_toolbar_container);
 
-        mDefaultToolbarView = mToolbarHolder.findViewById(R.id.bottom_sheet_toolbar);
-
         mBottomSheetContentContainer =
                 (TouchRestrictingFrameLayout) findViewById(R.id.bottom_sheet_content);
         mBottomSheetContentContainer.setBottomSheet(this);
@@ -550,9 +542,6 @@
         swapViews(newToolbar, mSheetContent != null ? mSheetContent.getToolbarView() : null,
                 mToolbarHolder);
 
-        // We hide the default toolbar if the new content has its own.
-        mDefaultToolbarView.setVisibility(newToolbar != null ? GONE : VISIBLE);
-
         onSheetContentChanged(content);
     }
 
@@ -788,23 +777,29 @@
             assert ratio > 0 && ratio <= 1 : "Custom peek ratios must be in the range of (0, 1].";
             return ratio;
         }
-        assert getToolbarView() != null : "Using default peek height requires a non-null toolbar";
 
         View toolbarView = getToolbarView();
-        int toolbarHeight = toolbarView.getHeight();
-        if (toolbarHeight == 0) {
-            // If the toolbar is not laid out yet and has a fixed height layout parameter, we assume
-            // that the toolbar will have this height in the future.
-            ViewGroup.LayoutParams layoutParams = toolbarView.getLayoutParams();
-            if (layoutParams != null) {
-                if (layoutParams.height > 0) {
-                    toolbarHeight = layoutParams.height;
-                } else {
-                    toolbarView.measure(
-                            MeasureSpec.makeMeasureSpec(getMaxSheetWidth(), MeasureSpec.EXACTLY),
-                            MeasureSpec.makeMeasureSpec(
-                                    getMaxContentHeight(), MeasureSpec.AT_MOST));
-                    toolbarHeight = toolbarView.getMeasuredHeight();
+
+        int toolbarHeight;
+        if (toolbarView == null) {
+            toolbarHeight = getResources().getDimensionPixelSize(R.dimen.bottom_sheet_peek_height);
+        } else {
+            toolbarHeight = toolbarView.getHeight();
+            if (toolbarHeight == 0) {
+                // If the toolbar is not laid out yet and has a fixed height layout parameter, we
+                // assume that the toolbar will have this height in the future.
+                ViewGroup.LayoutParams layoutParams = toolbarView.getLayoutParams();
+                if (layoutParams != null) {
+                    if (layoutParams.height > 0) {
+                        toolbarHeight = layoutParams.height;
+                    } else {
+                        toolbarView.measure(
+                                MeasureSpec.makeMeasureSpec(
+                                        getMaxSheetWidth(), MeasureSpec.EXACTLY),
+                                MeasureSpec.makeMeasureSpec(
+                                        getMaxContentHeight(), MeasureSpec.AT_MOST));
+                        toolbarHeight = toolbarView.getMeasuredHeight();
+                    }
                 }
             }
         }
@@ -814,7 +809,7 @@
     private View getToolbarView() {
         return mSheetContent != null && mSheetContent.getToolbarView() != null
                 ? mSheetContent.getToolbarView()
-                : mDefaultToolbarView;
+                : null;
     }
 
     /**
diff --git a/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml b/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml
index b2d683d..69f25388 100644
--- a/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml
+++ b/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml
@@ -36,13 +36,7 @@
             class="org.chromium.components.browser_ui.bottomsheet.TouchRestrictingFrameLayout"
             android:id="@+id/bottom_sheet_toolbar_container"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content" >
-
-            <View
-                android:id="@+id/bottom_sheet_toolbar"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/bottom_sheet_peek_height" />
-        </view>
+            android:layout_height="wrap_content" />
 
     </FrameLayout>
 
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 7273c50a..3b2e9ee 100644
--- a/components/content_settings/browser/page_specific_content_settings_unittest.cc
+++ b/components/content_settings/browser/page_specific_content_settings_unittest.cc
@@ -482,12 +482,10 @@
     : public PageSpecificContentSettingsTest {
  public:
   PageSpecificContentSettingsWithPrerenderTest() {
-    // Enable prerendering with no physical memory requirement so the test can
-    // run on any bot.
-    feature_list_.InitWithFeaturesAndParameters(
-        {{blink::features::kPrerender2,
-          {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-        {});
+    std::map<std::string, std::string> parameters;
+    parameters["implementation"] = "mparch";
+    feature_list_.InitAndEnableFeatureWithParameters(
+        blink::features::kPrerender2, parameters);
   }
   ~PageSpecificContentSettingsWithPrerenderTest() override = default;
 
diff --git a/components/desks_storage/core/local_desk_data_manager.cc b/components/desks_storage/core/local_desk_data_manager.cc
index 5673ccd..30fe0e5 100644
--- a/components/desks_storage/core/local_desk_data_manager.cc
+++ b/components/desks_storage/core/local_desk_data_manager.cc
@@ -242,6 +242,10 @@
                      std::move(callback)));
 }
 
+std::size_t LocalDeskDataManager::GetTemplateCount() const {
+  return templates_.size();
+}
+
 std::size_t LocalDeskDataManager::GetMaxEntryCount() const {
   return kMaxTemplateCount;
 }
diff --git a/components/desks_storage/core/local_desk_data_manager.h b/components/desks_storage/core/local_desk_data_manager.h
index ae718ee..1556615 100644
--- a/components/desks_storage/core/local_desk_data_manager.h
+++ b/components/desks_storage/core/local_desk_data_manager.h
@@ -61,6 +61,9 @@
 
   // Other helper methods.
 
+  // Gets the number of templates currently saved.
+  std::size_t GetTemplateCount() const;
+
   // Gets the maximum number of templates this storage backend could hold.
   // Adding more templates beyond this limit will result in |kHitMaximumLimit|
   // error.
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn
index beff231..966b1fc 100644
--- a/components/history/core/browser/BUILD.gn
+++ b/components/history/core/browser/BUILD.gn
@@ -175,6 +175,7 @@
     "//components/test/data/history/history.43.sql",
     "//components/test/data/history/history.44.sql",
     "//components/test/data/history/history.45.sql",
+    "//components/test/data/history/history.46.sql",
     "//components/test/data/history/thumbnail_wild/Favicons.corrupt_meta.disable",
     "//components/test/data/history/thumbnail_wild/Favicons.v2.init.sql",
     "//components/test/data/history/thumbnail_wild/Favicons.v3.init.sql",
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc
index 2e29e1c..d835088 100644
--- a/components/history/core/browser/history_backend_db_unittest.cc
+++ b/components/history/core/browser/history_backend_db_unittest.cc
@@ -2346,6 +2346,46 @@
   }
 }
 
+TEST_F(HistoryBackendDBTest, MigrateContentAnnotationsWithoutEntitiesColumn) {
+  ASSERT_NO_FATAL_FAILURE(CreateDBVersion(46));
+
+  const VisitID visit_id1 = 1;
+
+  // Open the db for manual manipulation.
+  sql::Database db;
+  ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename)));
+
+  const char kInsertContentAnnotationsStatement[] =
+      "INSERT INTO content_annotations "
+      "(visit_id, floc_protected_score, categories, page_topics_model_version, "
+      "annotation_flags) "
+      "VALUES (?, ?, ?, ?, ?)";
+
+  // Add an entry to "content_annotations" table.
+  {
+    sql::Statement s(db.GetUniqueStatement(kInsertContentAnnotationsStatement));
+    s.BindInt64(0, visit_id1);
+    s.BindDouble(1, -1);
+    s.BindString(2, "");
+    s.BindInt64(3, -1);
+    s.BindInt64(4, 0);
+    ASSERT_TRUE(s.Run());
+  }
+
+  // Re-open the db, triggering migration.
+  CreateBackendAndDatabase();
+
+  // The version should have been updated.
+  ASSERT_GE(HistoryDatabase::GetCurrentVersion(), 46);
+
+  // After the migration, the entities should be empty.
+  {
+    VisitContentAnnotations visit_content_annotations;
+    db_->GetContentAnnotationsForVisit(visit_id1, &visit_content_annotations);
+    EXPECT_TRUE(visit_content_annotations.model_annotations.entities.empty());
+  }
+}
+
 bool FilterURL(const GURL& url) {
   return url.SchemeIsHTTPOrHTTPS();
 }
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc
index 7620cef..d0b797b 100644
--- a/components/history/core/browser/history_backend_unittest.cc
+++ b/components/history/core/browser/history_backend_unittest.cc
@@ -1583,8 +1583,11 @@
 
   // Try adding the model_annotations. It should be a no-op as there's no
   // matching entry in the visits table.
-  VisitContentModelAnnotations model_annotations(
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123);
+  VisitContentModelAnnotations model_annotations = {
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   backend_->AddContentModelAnnotationsForVisit(visit_id, model_annotations);
 
   // The content_annotations table should have no entries.
@@ -1661,8 +1664,11 @@
   ASSERT_EQ(1U, visits.size());
   VisitID visit_id = visits[0].visit_id;
 
-  VisitContentModelAnnotations model_annotations(
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123);
+  VisitContentModelAnnotations model_annotations = {
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   backend_->AddContentModelAnnotationsForVisit(visit_id, model_annotations);
 
   VisitContentAnnotations got_content_annotations;
@@ -1676,10 +1682,15 @@
   EXPECT_THAT(
       got_content_annotations.model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(
       123, got_content_annotations.model_annotations.page_topics_model_version);
+  EXPECT_THAT(got_content_annotations.model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 
   QueryOptions options;
   options.duplicate_policy = QueryOptions::KEEP_ALL_DUPLICATES;
@@ -1694,11 +1705,16 @@
   EXPECT_THAT(
       results[0].content_annotations().model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(123, results[0]
                      .content_annotations()
                      .model_annotations.page_topics_model_version);
+  EXPECT_THAT(results[0].content_annotations().model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 
   // Now, delete the URL. Content Annotations should be deleted.
   backend_->DeleteURL(url);
@@ -1727,8 +1743,11 @@
 
   backend_->SetFlocAllowed(context_id, nav_entry_id, url);
 
-  VisitContentModelAnnotations model_annotations(
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123);
+  VisitContentModelAnnotations model_annotations = {
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   backend_->AddContentModelAnnotationsForVisit(visit_id, model_annotations);
 
   VisitContentAnnotations got_content_annotations;
@@ -1742,10 +1761,15 @@
   EXPECT_THAT(
       got_content_annotations.model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(
       123, got_content_annotations.model_annotations.page_topics_model_version);
+  EXPECT_THAT(got_content_annotations.model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 
   QueryOptions options;
   options.duplicate_policy = QueryOptions::KEEP_ALL_DUPLICATES;
@@ -1760,11 +1784,16 @@
   EXPECT_THAT(
       results[0].content_annotations().model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(123, results[0]
                      .content_annotations()
                      .model_annotations.page_topics_model_version);
+  EXPECT_THAT(got_content_annotations.model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 }
 
 TEST_F(HistoryBackendTest, AddVisitsSource) {
diff --git a/components/history/core/browser/history_database.cc b/components/history/core/browser/history_database.cc
index f1a733e4..64163e35 100644
--- a/components/history/core/browser/history_database.cc
+++ b/components/history/core/browser/history_database.cc
@@ -37,7 +37,7 @@
 // Current version number. We write databases at the "current" version number,
 // but any previous version that can read the "compatible" one can make do with
 // our database without *too* many bad effects.
-const int kCurrentVersionNumber = 46;
+const int kCurrentVersionNumber = 47;
 const int kCompatibleVersionNumber = 16;
 const char kEarlyExpirationThresholdKey[] = "early_expiration_threshold";
 
@@ -649,6 +649,13 @@
     meta_table_.SetVersionNumber(cur_version);
   }
 
+  if (cur_version == 46) {
+    if (!MigrateContentAnnotationsWithoutEntitiesColumn())
+      return LogMigrationFailure(46);
+    cur_version++;
+    meta_table_.SetVersionNumber(cur_version);
+  }
+
   // =========================       ^^ new migration code goes here ^^
   // ADDING NEW MIGRATION CODE
   // =========================
diff --git a/components/history/core/browser/url_row.cc b/components/history/core/browser/url_row.cc
index ba56642..5939016 100644
--- a/components/history/core/browser/url_row.cc
+++ b/components/history/core/browser/url_row.cc
@@ -6,6 +6,8 @@
 
 #include <algorithm>
 
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/trace_event/memory_usage_estimator.h"
 
 namespace history {
@@ -45,10 +47,29 @@
 
 // Annotations
 // ----------------------------------------------------------
-VisitContentModelAnnotations::Category::Category(int id, int weight)
+VisitContentModelAnnotations::Category::Category(const std::string& id,
+                                                 int weight)
     : id(id), weight(weight) {}
 VisitContentModelAnnotations::Category::Category() = default;
 
+// static
+absl::optional<VisitContentModelAnnotations::Category>
+VisitContentModelAnnotations::Category::FromStringVector(
+    const std::vector<std::string>& vector) {
+  if (vector.size() != 2)
+    return absl::nullopt;
+
+  VisitContentModelAnnotations::Category category;
+  category.id = vector[0];
+  if (!base::StringToInt(vector[1], &category.weight))
+    return absl::nullopt;
+  return category;
+}
+
+std::string VisitContentModelAnnotations::Category::ToString() const {
+  return base::StrCat({id, ":", base::NumberToString(weight)});
+}
+
 bool VisitContentModelAnnotations::Category::operator==(
     const VisitContentModelAnnotations::Category& other) const {
   return id == other.id && weight == other.weight;
@@ -62,10 +83,12 @@
 VisitContentModelAnnotations::VisitContentModelAnnotations(
     float floc_protected_score,
     const std::vector<Category>& categories,
-    int64_t page_topics_model_version)
+    int64_t page_topics_model_version,
+    const std::vector<Category>& entities)
     : floc_protected_score(floc_protected_score),
       categories(categories),
-      page_topics_model_version(page_topics_model_version) {}
+      page_topics_model_version(page_topics_model_version),
+      entities(entities) {}
 VisitContentModelAnnotations::VisitContentModelAnnotations() = default;
 VisitContentModelAnnotations::VisitContentModelAnnotations(
     const VisitContentModelAnnotations&) = default;
diff --git a/components/history/core/browser/url_row.h b/components/history/core/browser/url_row.h
index c9fede1..cda8d92 100644
--- a/components/history/core/browser/url_row.h
+++ b/components/history/core/browser/url_row.h
@@ -12,6 +12,7 @@
 
 #include "base/time/time.h"
 #include "components/query_parser/snippet.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace history {
@@ -170,24 +171,30 @@
 
 using VisitContentAnnotationFlags = uint64_t;
 
-// A structure containing the annotations made by the ML model to page content
+// A structure containing annotations computed by ML models to page content
 // for a visit. Be cautious when changing the default values as they may already
 // have been written to the storage.
 struct VisitContentModelAnnotations {
   struct Category {
     Category();
-    Category(int id, int weight);
+    Category(const std::string& id, int weight);
+    // |vector| is expected to be of size 2 with the first entry being an ID of
+    // string or int type and the second entry indicating an integer weight.
+    static absl::optional<Category> FromStringVector(
+        const std::vector<std::string>& vector);
+    std::string ToString() const;
     bool operator==(const Category& other) const;
     bool operator!=(const Category& other) const;
 
-    int id = 0;
+    std::string id;
     int weight = 0;
   };
 
   VisitContentModelAnnotations();
   VisitContentModelAnnotations(float floc_protected_score,
                                const std::vector<Category>& categories,
-                               int64_t page_topics_model_version);
+                               int64_t page_topics_model_version,
+                               const std::vector<Category>& entities);
   VisitContentModelAnnotations(const VisitContentModelAnnotations& other);
   ~VisitContentModelAnnotations();
 
@@ -200,6 +207,10 @@
   std::vector<Category> categories;
   // The version of the page topics model that was used to annotate content.
   int64_t page_topics_model_version = -1;
+  // A vector that contains entity IDs and their weights. It is guaranteed
+  // that there will not be duplicates in the category IDs contained in this
+  // field.
+  std::vector<Category> entities;
 };
 
 // A structure containing the annotations made to page content for a visit.
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc
index cbd7cc0..b665a10 100644
--- a/components/history/core/browser/visit_annotations_database.cc
+++ b/components/history/core/browser/visit_annotations_database.cc
@@ -23,7 +23,7 @@
 
 #define HISTORY_CONTENT_ANNOTATIONS_ROW_FIELDS                           \
   " visit_id,floc_protected_score,categories,page_topics_model_version," \
-  "annotation_flags "
+  "annotation_flags,entities "
 #define HISTORY_CONTEXT_ANNOTATIONS_ROW_FIELDS                    \
   " visit_id,context_annotation_flags,duration_since_last_visit," \
   "page_end_reason "
@@ -39,15 +39,11 @@
   for (const auto& category_string : category_strings) {
     std::vector<std::string> category_parts = base::SplitString(
         category_string, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-    if (category_parts.size() != 2)
-      return {};
 
-    VisitContentModelAnnotations::Category category;
-    if (!base::StringToInt(category_parts[0], &category.id))
-      continue;
-    if (!base::StringToInt(category_parts[1], &category.weight))
-      continue;
-    categories.emplace_back(category);
+    auto category = VisitContentModelAnnotations::Category::FromStringVector(
+        category_parts);
+    if (category)
+      categories.emplace_back(*category);
   }
   return categories;
 }
@@ -57,9 +53,7 @@
     const std::vector<VisitContentModelAnnotations::Category>& categories) {
   std::vector<std::string> serialized_categories;
   for (const auto& category : categories) {
-    serialized_categories.emplace_back(
-        base::StrCat({base::NumberToString(category.id), ":",
-                      base::NumberToString(category.weight)}));
+    serialized_categories.emplace_back(category.ToString());
   }
   return base::JoinString(serialized_categories, ",");
 }
@@ -172,7 +166,8 @@
                        "floc_protected_score NUMERIC,"
                        "categories VARCHAR,"
                        "page_topics_model_version INTEGER,"
-                       "annotation_flags INTEGER NOT NULL)")) {
+                       "annotation_flags INTEGER NOT NULL,"
+                       "entities VARCHAR)")) {
     return false;
   }
 
@@ -228,7 +223,7 @@
   sql::Statement statement(GetDB().GetCachedStatement(
       SQL_FROM_HERE,
       "INSERT INTO content_annotations(" HISTORY_CONTENT_ANNOTATIONS_ROW_FIELDS
-      ")VALUES(?,?,?,?,?)"));
+      ")VALUES(?,?,?,?,?,?)"));
   statement.BindInt64(0, visit_id);
   statement.BindDouble(
       1, static_cast<double>(
@@ -239,6 +234,9 @@
   statement.BindInt64(
       3, visit_content_annotations.model_annotations.page_topics_model_version);
   statement.BindInt64(4, visit_content_annotations.annotation_flags);
+  statement.BindString(
+      5, ConvertCategoriesToStringColumn(
+             visit_content_annotations.model_annotations.entities));
 
   if (!statement.Run()) {
     DVLOG(0) << "Failed to execute 'content_annotations' insert statement:  "
@@ -276,7 +274,7 @@
                                  "UPDATE content_annotations SET "
                                  "floc_protected_score=?,categories=?,"
                                  "page_topics_model_version=?,"
-                                 "annotation_flags=? "
+                                 "annotation_flags=?,entities=? "
                                  "WHERE visit_id=?"));
   statement.BindDouble(
       0, static_cast<double>(
@@ -287,7 +285,10 @@
   statement.BindInt64(
       2, visit_content_annotations.model_annotations.page_topics_model_version);
   statement.BindInt64(3, visit_content_annotations.annotation_flags);
-  statement.BindInt64(4, visit_id);
+  statement.BindString(
+      4, ConvertCategoriesToStringColumn(
+             visit_content_annotations.model_annotations.entities));
+  statement.BindInt64(5, visit_id);
 
   if (!statement.Run()) {
     DVLOG(0)
@@ -347,6 +348,8 @@
   out_content_annotations->model_annotations.page_topics_model_version =
       statement.ColumnInt64(3);
   out_content_annotations->annotation_flags = statement.ColumnInt64(4);
+  out_content_annotations->model_annotations.entities =
+      GetCategoriesFromStringColumn(statement.ColumnString(5));
   return true;
 }
 
@@ -584,4 +587,21 @@
          GetDB().Execute("DROP TABLE cluster_visits");
 }
 
+bool VisitAnnotationsDatabase::
+    MigrateContentAnnotationsWithoutEntitiesColumn() {
+  if (!GetDB().DoesTableExist("content_annotations")) {
+    NOTREACHED() << " Content annotations table should exist before migration";
+    return false;
+  }
+
+  if (GetDB().DoesColumnExist("content_annotations", "entities"))
+    return true;
+
+  // Old versions don't have the entities column, we modify the table to add
+  // that field.
+  return GetDB().Execute(
+      "ALTER TABLE content_annotations "
+      "ADD COLUMN entities VARCHAR");
+}
+
 }  // namespace history
diff --git a/components/history/core/browser/visit_annotations_database.h b/components/history/core/browser/visit_annotations_database.h
index d2faf44..c0d8c70 100644
--- a/components/history/core/browser/visit_annotations_database.h
+++ b/components/history/core/browser/visit_annotations_database.h
@@ -120,6 +120,10 @@
   // url_id (redundant); and renames 1 column:
   // cluster_visit_context_signal_bitmask to context_annotation_flags.
   bool MigrateReplaceClusterVisitsTable();
+
+  // Called by the derived classes to migrate the older content_annotations
+  // table which don't have entities column yet.
+  bool MigrateContentAnnotationsWithoutEntitiesColumn();
 };
 
 }  // namespace history
diff --git a/components/history/core/browser/visit_annotations_database_unittest.cc b/components/history/core/browser/visit_annotations_database_unittest.cc
index 370ddb4..f3138f7 100644
--- a/components/history/core/browser/visit_annotations_database_unittest.cc
+++ b/components/history/core/browser/visit_annotations_database_unittest.cc
@@ -88,7 +88,10 @@
   // Add content annotations for 1 visit.
   VisitID visit_id = 1;
   VisitContentModelAnnotations model_annotations = {
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123};
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   VisitContentAnnotationFlags annotation_flags =
       VisitContentAnnotationFlag::kFlocEligibleRelaxed;
   VisitContentAnnotations content_annotations{annotation_flags,
@@ -107,10 +110,15 @@
   EXPECT_THAT(
       got_content_annotations.model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(
       123, got_content_annotations.model_annotations.page_topics_model_version);
+  EXPECT_THAT(got_content_annotations.model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 }
 
 TEST_F(VisitAnnotationsDatabaseTest,
@@ -156,7 +164,10 @@
   // Add content annotations for 1 visit.
   VisitID visit_id = 1;
   VisitContentModelAnnotations model_annotations = {
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123};
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   VisitContentAnnotationFlags annotation_flags =
       VisitContentAnnotationFlag::kFlocEligibleRelaxed;
   VisitContentAnnotations original{annotation_flags, model_annotations};
@@ -177,9 +188,14 @@
   EXPECT_THAT(
       final.model_annotations.categories,
       ElementsAre(
-          VisitContentModelAnnotations::Category(/*id=*/1, /*weight=*/1),
-          VisitContentModelAnnotations::Category(/*id=*/2, /*weight=*/1)));
+          VisitContentModelAnnotations::Category(/*id=*/"1", /*weight=*/1),
+          VisitContentModelAnnotations::Category(/*id=*/"2", /*weight=*/1)));
   EXPECT_EQ(123, final.model_annotations.page_topics_model_version);
+  EXPECT_THAT(final.model_annotations.entities,
+              ElementsAre(VisitContentModelAnnotations::Category(
+                              /*id=*/"entity1", /*weight=*/1),
+                          VisitContentModelAnnotations::Category(
+                              /*id=*/"entity2", /*weight=*/1)));
 }
 
 TEST_F(VisitAnnotationsDatabaseTest,
@@ -236,7 +252,10 @@
   // Add content annotations for 1 visit.
   VisitID visit_id = 1;
   VisitContentModelAnnotations model_annotations = {
-      0.5f, {{/*id=*/1, /*weight=*/1}, {/*id=*/2, /*weight=*/1}}, 123};
+      0.5f,
+      {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}},
+      123,
+      {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}};
   VisitContentAnnotationFlags annotation_flags =
       VisitContentAnnotationFlag::kNone;
   VisitContentAnnotations content_annotations{annotation_flags,
diff --git a/components/metrics/single_sample_metrics_factory_impl_unittest.cc b/components/metrics/single_sample_metrics_factory_impl_unittest.cc
index 0d03bdc..fe85c4a 100644
--- a/components/metrics/single_sample_metrics_factory_impl_unittest.cc
+++ b/components/metrics/single_sample_metrics_factory_impl_unittest.cc
@@ -142,7 +142,7 @@
 
 TEST_F(SingleSampleMetricsFactoryImplTest, MultithreadedMetrics) {
   // Allow EXPECT_DCHECK_DEATH for multiple threads.
-  // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests-and-threads
+  // https://github.com/google/googletest/blob/master/docs/advanced.md#death-tests-and-threads
   testing::FLAGS_gtest_death_test_style = "threadsafe";
 
   base::HistogramTester tester;
diff --git a/components/metrics/structured/external_metrics.cc b/components/metrics/structured/external_metrics.cc
index 6673153..b228617 100644
--- a/components/metrics/structured/external_metrics.cc
+++ b/components/metrics/structured/external_metrics.cc
@@ -6,6 +6,7 @@
 
 #include <sys/file.h>
 
+#include "base/containers/fixed_flat_set.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
@@ -28,7 +29,7 @@
     google::protobuf::RepeatedPtrField<metrics::StructuredEventProto>* events) {
   // Event name hashes of all bluetooth events listed in
   // src/platform2/metrics/structured/structured.xml.
-  static constexpr uint64_t kBluetoothEventHashes[] = {
+  static constexpr auto kBluetoothEventHashes = base::MakeFixedFlatSet<uint64_t>({
       // BluetoothAdapterStateChanged
       UINT64_C(959829856916771459),
       // BluetoothPairingStateChanged
@@ -38,26 +39,19 @@
       // BluetoothProfileConnectionStateChanged
       UINT64_C(7217682640379679663),
       // BluetoothDeviceInfoReport
-      UINT64_C(1506471670382892394),
-  };
+      UINT64_C(1506471670382892394)
+  });
 
   if (base::FeatureList::IsEnabled(kBluetoothSessionizedMetrics))
     return;
 
-  for (int i = 0; i < events->size();) {
-    bool is_bluetooth = false;
-    const uint64_t event_hash = events->Get(i).event_name_hash();
-    for (const uint64_t bt_hash : kBluetoothEventHashes) {
-      if (event_hash == bt_hash) {
-        is_bluetooth = true;
-        break;
-      }
-    }
-
-    if (is_bluetooth) {
-      events->erase(events->begin() + i);
+  // Remove all bluetooth events.
+  auto it = events->begin();
+  while (it != events->end()) {
+    if (kBluetoothEventHashes.contains(it->event_name_hash())) {
+      it = events->erase(it);
     } else {
-      ++i;
+      ++it;
     }
   }
 }
diff --git a/components/module_installer/android/BUILD.gn b/components/module_installer/android/BUILD.gn
index 6f1167f..39b6d307 100644
--- a/components/module_installer/android/BUILD.gn
+++ b/components/module_installer/android/BUILD.gn
@@ -12,7 +12,6 @@
     "java/src/org/chromium/components/module_installer/builder/ModuleEngine.java",
     "java/src/org/chromium/components/module_installer/engine/ApkEngine.java",
     "java/src/org/chromium/components/module_installer/engine/EngineFactory.java",
-    "java/src/org/chromium/components/module_installer/engine/FakeEngine.java",
     "java/src/org/chromium/components/module_installer/engine/InstallEngine.java",
     "java/src/org/chromium/components/module_installer/engine/InstallListener.java",
     "java/src/org/chromium/components/module_installer/engine/SplitCompatEngine.java",
@@ -35,8 +34,8 @@
   deps = [
     "//base:base_java",
     "//components/crash/android:java",
+    "//third_party/android_deps:com_google_android_play_core_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
-    "//third_party/google_android_play_core:com_google_android_play_core_java",
   ]
 
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
@@ -59,7 +58,7 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
-    "//third_party/google_android_play_core:com_google_android_play_core_java",
+    "//third_party/android_deps:com_google_android_play_core_java",
     "//third_party/hamcrest:hamcrest_java",
   ]
 }
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
index 6c9ea53..e16858e 100644
--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
+++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
@@ -5,7 +5,6 @@
 package org.chromium.components.module_installer.engine;
 
 import org.chromium.base.BundleUtils;
-import org.chromium.base.CommandLine;
 
 /**
  * Factory used to build concrete engines.
@@ -15,9 +14,6 @@
         if (!BundleUtils.isBundle()) {
             return new ApkEngine();
         }
-        if (CommandLine.getInstance().hasSwitch("fake-feature-module-install")) {
-            return new FakeEngine();
-        }
         return new SplitCompatEngine();
     }
 }
diff --git a/components/module_installer/readme.md b/components/module_installer/readme.md
index f24916f..461ef9fe 100644
--- a/components/module_installer/readme.md
+++ b/components/module_installer/readme.md
@@ -13,8 +13,7 @@
 [split install API](https://developer.android.com/guide/app-bundle/playcore)
 that performs extra setup such as
 [SplitCompat](https://developer.android.com/guide/app-bundle/playcore#access_downloaded_modules),
-collects metrics and provides
-[fake install](android/java/src/org/chromium/components/module_installer/engine/FakeEngine.java).
+and collects metrics.
 You can install a module by name with the following code snippet:
 
 ```java
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc
index 0aee5b9f..9245648 100644
--- a/components/omnibox/browser/autocomplete_match.cc
+++ b/components/omnibox/browser/autocomplete_match.cc
@@ -233,9 +233,6 @@
 
 AutocompleteMatch& AutocompleteMatch::operator=(
     AutocompleteMatch&& match) noexcept {
-  if (this == &match) {
-    return *this;
-  }
   provider = std::move(match.provider);
   relevance = std::move(match.relevance);
   typed_count = std::move(match.typed_count);
@@ -276,9 +273,7 @@
   from_previous = std::move(match.from_previous);
   search_terms_args = std::move(match.search_terms_args);
   post_content = std::move(match.post_content);
-  // TODO(crbug/1217575): Remove this once the bug is closed, assuming it is not
-  // directly responsible for the crash.
-  std::swap(additional_info, match.additional_info);
+  additional_info = std::move(match.additional_info);
   duplicate_matches = std::move(match.duplicate_matches);
   query_tiles = std::move(match.query_tiles);
   navsuggest_tiles = std::move(match.navsuggest_tiles);
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc
index e31791fc..31355fe1 100644
--- a/components/omnibox/browser/zero_suggest_provider_unittest.cc
+++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -238,7 +238,11 @@
                               TestSchemeClassifier());
   ExpectPlatformSpecificDefaultZeroSuggestBehavior(
       ntp_input,
+#if defined(OS_ANDROID) || defined(OS_IOS)
       /*remote_no_url_allowed=*/false);
+#else
+      /*remote_no_url_allowed=*/true);
+#endif
 
   // Verify RemoteNoUrl works when the user is signed in.
   EXPECT_CALL(*client_, IsAuthenticated())
@@ -252,7 +256,11 @@
       .WillRepeatedly(testing::Return(false));
   ExpectPlatformSpecificDefaultZeroSuggestBehavior(
       other_input,
+#if defined(OS_ANDROID) || defined(OS_IOS)
       /*remote_no_url_allowed=*/false);
+#else
+      /*remote_no_url_allowed=*/true);
+#endif
 
   // Unless we allow remote suggestions for signed-out users.
   scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>();
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index f9394578..79b66ee1 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -130,7 +130,7 @@
 // and has no direct impact on the client behavior.
 const base::Feature kOmniboxTrendingZeroPrefixSuggestionsOnNTP{
     "OmniboxTrendingZeroPrefixSuggestionsOnNTP",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+    enabled_by_default_desktop_only};
 
 // Enables on-focus suggestions on the Open Web, that are contextual to the
 // current URL. Will only work if user is signed-in and syncing, or is
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
index ef2f93775..2f80242 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
@@ -29,7 +29,12 @@
 // The ID of the NONE category in the taxonomy. This node always exists.
 // Semantically, the none category is attached to data for which we can say
 // with certainty that no single label in the taxonomy is appropriate.
-const int kNoneCategoryId = -2;
+const char kNoneCategoryId[] = "-2";
+
+// The max number of page entities that should be output.
+// TODO(crbug/1234578): Make the number of entities Finch-able once we
+// know how much the model is expected to output.
+constexpr size_t kMaxPageEntities = 5;
 
 std::unique_ptr<history::VisitContentModelAnnotations>
 GetOrCreateCurrentContentModelAnnotations(
@@ -118,6 +123,13 @@
 #endif
 }
 
+void PageContentAnnotationsModelManager::
+    OverridePageEntitiesModelExecutorForTesting(
+        std::unique_ptr<PageEntitiesModelExecutor>
+            page_entities_model_executor) {
+  page_entities_model_executor_ = std::move(page_entities_model_executor);
+}
+
 void PageContentAnnotationsModelManager::ExecutePageEntitiesModel(
     const std::string& text,
     std::unique_ptr<history::VisitContentModelAnnotations> current_annotations,
@@ -148,7 +160,33 @@
     PageContentAnnotatedCallback callback,
     size_t current_model_index,
     const absl::optional<std::vector<tflite::task::core::Category>>& output) {
-  // TODO(crbug/1228790): Convert page entities to history representation.
+  if (output) {
+    current_annotations = GetOrCreateCurrentContentModelAnnotations(
+        std::move(current_annotations));
+
+    // Determine the entities with the highest weights.
+    std::vector<tflite::task::core::Category> entity_candidates =
+        std::move(*output);
+    std::sort(entity_candidates.begin(), entity_candidates.end(),
+              [](const tflite::task::core::Category& a,
+                 const tflite::task::core::Category& b) {
+                return a.score > b.score;
+              });
+
+    // Add the top entities to the working current annotations.
+    for (const auto& entity : entity_candidates) {
+      if (current_annotations->entities.size() >= kMaxPageEntities) {
+        break;
+      }
+
+      // We expect the weight to be between 0 and 1, so that the normalization
+      // from 0 to 100 makes sense.
+      DCHECK(entity.score >= 0.0 && entity.score <= 1.0);
+      current_annotations->entities.emplace_back(
+          history::VisitContentModelAnnotations::Category(
+              entity.class_name, static_cast<int>(100 * entity.score)));
+    }
+  }
   ExecuteNextModelOrInvokeCallback(text, std::move(current_annotations),
                                    std::move(callback), current_model_index);
 }
@@ -278,7 +316,7 @@
   // -1 is a sentinel value that means the floc_protected-ness was not
   // evaluated.
   out_content_annotations->floc_protected_score = -1.0;
-  std::vector<std::pair<int, float>> category_candidates;
+  std::vector<std::pair<std::string, float>> category_candidates;
   for (const auto& category : model_output) {
     if (floc_protected_category_name &&
         category.class_name == *floc_protected_category_name) {
@@ -294,8 +332,8 @@
     // Assume everything else is for categories.
     int category_id;
     if (base::StringToInt(category.class_name, &category_id)) {
-      category_candidates.emplace_back(
-          std::make_pair(category_id, static_cast<float>(category.score)));
+      category_candidates.emplace_back(std::make_pair(
+          category.class_name, static_cast<float>(category.score)));
     }
   }
 
@@ -309,18 +347,19 @@
 
   // Determine the categories with the highest weights.
   std::sort(category_candidates.begin(), category_candidates.end(),
-            [](const std::pair<int, float>& a, const std::pair<int, float>& b) {
+            [](const std::pair<std::string, float>& a,
+               const std::pair<std::string, float>& b) {
               return a.second > b.second;
             });
   size_t max_categories = static_cast<size_t>(category_params.max_categories());
   float total_weight = 0.0;
   float sum_positive_scores = 0.0;
   absl::optional<std::pair<size_t, float>> none_idx_and_weight;
-  std::vector<std::pair<int, float>> categories;
+  std::vector<std::pair<std::string, float>> categories;
   categories.reserve(max_categories);
   for (size_t i = 0; i < category_candidates.size() && i < max_categories;
        i++) {
-    std::pair<int, float> candidate = category_candidates[i];
+    std::pair<std::string, float> candidate = category_candidates[i];
     categories.push_back(candidate);
     total_weight += candidate.second;
 
@@ -336,7 +375,7 @@
   if (category_params.min_category_weight() > 0) {
     categories.erase(
         std::remove_if(categories.begin(), categories.end(),
-                       [&](const std::pair<int, float>& category) {
+                       [&](const std::pair<std::string, float>& category) {
                          return category.second <
                                 category_params.min_category_weight();
                        }),
@@ -363,7 +402,7 @@
   categories.erase(
       std::remove_if(
           categories.begin(), categories.end(),
-          [&](const std::pair<int, float>& category) {
+          [&](const std::pair<std::string, float>& category) {
             return (category.second / normalization_factor) <
                    category_params.min_normalized_weight_within_top_n();
           }),
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager.h b/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
index a415dd03..e7554e2 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
@@ -131,6 +131,10 @@
       const std::vector<tflite::task::core::Category>& model_output,
       history::VisitContentModelAnnotations* out_content_annotations) const;
 
+  // Overrides |page_entities_model_executor_| for testing purposes.
+  void OverridePageEntitiesModelExecutorForTesting(
+      std::unique_ptr<PageEntitiesModelExecutor> page_entities_model_executor);
+
   // The model executor responsible for executing the page topics model.
   //
   // Can be nullptr if the page topics model will not be running for the
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc b/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
index 04de1384..bf616e3f 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
+#include "components/optimization_guide/core/page_entities_model_executor.h"
 #include "components/optimization_guide/core/test_model_info_builder.h"
 #include "components/optimization_guide/core/test_optimization_guide_model_provider.h"
 #include "components/optimization_guide/proto/page_topics_model_metadata.pb.h"
@@ -44,6 +45,27 @@
       registered_model_metadata_;
 };
 
+class FakePageEntitiesModelExecutor : public PageEntitiesModelExecutor {
+ public:
+  explicit FakePageEntitiesModelExecutor(
+      const base::flat_map<std::string,
+                           std::vector<tflite::task::core::Category>>& entries)
+      : entries_(entries) {}
+  ~FakePageEntitiesModelExecutor() override = default;
+
+  void ExecuteModelWithInput(
+      const std::string& text,
+      PageEntitiesModelExecutedCallback callback) override {
+    auto it = entries_.find(text);
+    std::move(callback).Run(
+        it != entries_.end() ? absl::make_optional(it->second) : absl::nullopt);
+  }
+
+ private:
+  base::flat_map<std::string, std::vector<tflite::task::core::Category>>
+      entries_;
+};
+
 class PageContentAnnotationsModelManagerTest : public testing::Test {
  public:
   PageContentAnnotationsModelManagerTest() {
@@ -86,6 +108,14 @@
     RunUntilIdle();
   }
 
+  void SetPageEntitiesModelExecutor(
+      const base::flat_map<std::string,
+                           std::vector<tflite::task::core::Category>>&
+          entries) {
+    model_manager()->OverridePageEntitiesModelExecutorForTesting(
+        std::make_unique<FakePageEntitiesModelExecutor>(entries));
+  }
+
   absl::optional<history::VisitContentModelAnnotations> Annotate(
       const std::string& text) {
     absl::optional<history::VisitContentModelAnnotations> content_annotations;
@@ -234,6 +264,7 @@
   EXPECT_TRUE(annotations.categories.empty());
   EXPECT_EQ(annotations.floc_protected_score, -1.0);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
+  EXPECT_TRUE(annotations.entities.empty());
 }
 
 TEST_F(
@@ -255,11 +286,12 @@
       GetContentModelAnnotationsFromOutput(model_metadata, model_output);
   EXPECT_THAT(annotations.categories,
               UnorderedElementsAre(
-                  history::VisitContentModelAnnotations::Category(1, 10),
-                  history::VisitContentModelAnnotations::Category(2, 20),
-                  history::VisitContentModelAnnotations::Category(3, 30)));
+                  history::VisitContentModelAnnotations::Category("1", 10),
+                  history::VisitContentModelAnnotations::Category("2", 20),
+                  history::VisitContentModelAnnotations::Category("3", 30)));
   EXPECT_EQ(annotations.floc_protected_score, -1.0);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
+  EXPECT_TRUE(annotations.entities.empty());
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
@@ -283,6 +315,7 @@
   EXPECT_TRUE(annotations.categories.empty());
   EXPECT_EQ(annotations.floc_protected_score, -1.0);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
+  EXPECT_TRUE(annotations.entities.empty());
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
@@ -303,11 +336,12 @@
       GetContentModelAnnotationsFromOutput(model_metadata, model_output);
   EXPECT_THAT(annotations.categories,
               UnorderedElementsAre(
-                  history::VisitContentModelAnnotations::Category(0, 30),
-                  history::VisitContentModelAnnotations::Category(1, 20),
-                  history::VisitContentModelAnnotations::Category(2, 40)));
+                  history::VisitContentModelAnnotations::Category("0", 30),
+                  history::VisitContentModelAnnotations::Category("1", 20),
+                  history::VisitContentModelAnnotations::Category("2", 40)));
   EXPECT_EQ(annotations.floc_protected_score, -1.0);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
+  EXPECT_TRUE(annotations.entities.empty());
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
@@ -331,11 +365,12 @@
       GetContentModelAnnotationsFromOutput(model_metadata, model_output);
   EXPECT_THAT(annotations.categories,
               UnorderedElementsAre(
-                  history::VisitContentModelAnnotations::Category(0, 30),
-                  history::VisitContentModelAnnotations::Category(1, 25),
-                  history::VisitContentModelAnnotations::Category(2, 40)));
+                  history::VisitContentModelAnnotations::Category("0", 30),
+                  history::VisitContentModelAnnotations::Category("1", 25),
+                  history::VisitContentModelAnnotations::Category("2", 40)));
   EXPECT_EQ(annotations.floc_protected_score, -1.0);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
+  EXPECT_TRUE(annotations.entities.empty());
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
@@ -359,9 +394,9 @@
       GetContentModelAnnotationsFromOutput(model_metadata, model_output);
   EXPECT_THAT(annotations.categories,
               UnorderedElementsAre(
-                  history::VisitContentModelAnnotations::Category(0, 30),
-                  history::VisitContentModelAnnotations::Category(1, 25),
-                  history::VisitContentModelAnnotations::Category(2, 40)));
+                  history::VisitContentModelAnnotations::Category("0", 30),
+                  history::VisitContentModelAnnotations::Category("1", 25),
+                  history::VisitContentModelAnnotations::Category("2", 40)));
   EXPECT_EQ(annotations.floc_protected_score, 0.5);
   EXPECT_EQ(annotations.page_topics_model_version, 123);
 }
@@ -413,7 +448,16 @@
 
 TEST_F(PageContentAnnotationsModelManagerEntitiesOnlyTest,
        AnnotateNoModelsFinishedExecuting) {
-  Annotate("sometext");
+  SetPageEntitiesModelExecutor({{"sometext",
+                                 {{"entity1", 0.1},
+                                  {"entity2", 0.2},
+                                  {"entity3", 0.3},
+                                  {"entity4", 0.4},
+                                  {"entity5", 0.5},
+                                  {"entity6", 0.6}}}});
+
+  absl::optional<history::VisitContentModelAnnotations> annotations =
+      Annotate("sometext");
 
   histogram_tester()->ExpectUniqueSample(
       "OptimizationGuide.PageContentAnnotationsModelManager."
@@ -425,6 +469,19 @@
       "OptimizationGuide.PageContentAnnotationsModelManager."
       "PageTopicsModelExecutionRequested",
       0);
+
+  // Make sure annotations object is populated correctly.
+  ASSERT_TRUE(annotations.has_value());
+  EXPECT_TRUE(annotations->categories.empty());
+  EXPECT_EQ(annotations->floc_protected_score, -1.0);
+  EXPECT_THAT(
+      annotations->entities,
+      UnorderedElementsAre(
+          history::VisitContentModelAnnotations::Category("entity6", 60),
+          history::VisitContentModelAnnotations::Category("entity5", 50),
+          history::VisitContentModelAnnotations::Category("entity4", 40),
+          history::VisitContentModelAnnotations::Category("entity3", 30),
+          history::VisitContentModelAnnotations::Category("entity2", 20)));
 }
 
 class PageContentAnnotationsModelManagerMultipleModelsTest
diff --git a/components/page_info_strings.grdp b/components/page_info_strings.grdp
index 7e82b77..0b95b51 100644
--- a/components/page_info_strings.grdp
+++ b/components/page_info_strings.grdp
@@ -77,6 +77,15 @@
   <message name="IDS_PAGE_INFO_ACCURACY_TIP_OPT_OUT_BUTTON" desc="Text of button to close the accuracy tip page info bubble and not show it again.">
     Don't show again
   </message>
+  <message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1" desc="Text shown inside an accuracy tip.">
+    Who’s behind this information?
+  </message>
+    <message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2" desc="Text shown inside an accuracy tip.">
+    What evidence supports it?
+  </message>
+    <message name="IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3" desc="Text shown inside an accuracy tip.">
+    What do other sources say?
+  </message>
 
   <!-- Viewing file strings -->
   <message name="IDS_PAGE_INFO_FILE_PAGE" desc="Message to display in the page info bubble when the page the user has navigated to is a file:// page">
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1.png.sha1
new file mode 100644
index 0000000..f6cc71b
--- /dev/null
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_1.png.sha1
@@ -0,0 +1 @@
+6c9fa66ca5169f8170a8a9fc8dd7c830862a4620
\ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2.png.sha1
new file mode 100644
index 0000000..f6cc71b
--- /dev/null
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_2.png.sha1
@@ -0,0 +1 @@
+6c9fa66ca5169f8170a8a9fc8dd7c830862a4620
\ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3.png.sha1
new file mode 100644
index 0000000..f6cc71b
--- /dev/null
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_ACCURACY_TIP_BODY_LINE_3.png.sha1
@@ -0,0 +1 @@
+6c9fa66ca5169f8170a8a9fc8dd7c830862a4620
\ No newline at end of file
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
index 5f11bf02..610bf9c 100644
--- a/components/password_manager/core/browser/login_database.cc
+++ b/components/password_manager/core/browser/login_database.cc
@@ -1164,16 +1164,22 @@
     }
     return list;
   }
-  std::string encrypted_password;
-  if (EncryptedString(form.password_value, &encrypted_password) !=
-      ENCRYPTION_RESULT_SUCCESS) {
-    if (error) {
-      *error = AddLoginError::kEncrytionServiceFailure;
-    }
-    return list;
-  }
+  // [iOS] Passwords created in Credential Provider Extension (CPE) are already
+  // encrypted in the keychain and there is no need to do the process again.
+  bool has_encrypted_password =
+      !form.encrypted_password.empty() && form.password_value.empty();
   PasswordForm form_with_encrypted_password = form;
-  form_with_encrypted_password.encrypted_password = encrypted_password;
+  if (!has_encrypted_password) {
+    std::string encrypted_password;
+    if (EncryptedString(form.password_value, &encrypted_password) !=
+        ENCRYPTION_RESULT_SUCCESS) {
+      if (error) {
+        *error = AddLoginError::kEncrytionServiceFailure;
+      }
+      return list;
+    }
+    form_with_encrypted_password.encrypted_password = encrypted_password;
+  }
 
   DCHECK(!add_statement_.empty());
   sql::Statement s(
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h
index 4a13d1dc..f14c9b5 100644
--- a/components/password_manager/core/browser/login_database.h
+++ b/components/password_manager/core/browser/login_database.h
@@ -205,6 +205,10 @@
 
  private:
   struct PrimaryKeyAndPassword;
+  FRIEND_TEST_ALL_PREFIXES(LoginDatabaseTest, AddLoginWithEncryptedPassword);
+  FRIEND_TEST_ALL_PREFIXES(LoginDatabaseTest,
+                           AddLoginWithEncryptedPasswordAndValue);
+
 #if defined(OS_IOS)
   friend class LoginDatabaseIOSTest;
   FRIEND_TEST_ALL_PREFIXES(LoginDatabaseIOSTest, KeychainStorage);
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index 5ef8f25..2a9357bf 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -1246,6 +1246,63 @@
   EXPECT_EQ(PasswordStoreChangeList(), db().AddLogin(form));
 }
 
+// Test that when adding a login with no password_value but with
+// encrypted_password, the encrypted_password is kept.
+TEST_F(LoginDatabaseTest, AddLoginWithEncryptedPassword) {
+  PasswordForm form;
+  form.url = GURL("http://accounts.google.com/LoginAuth");
+  form.signon_realm = "http://accounts.google.com/";
+  form.username_value = u"my_username";
+  std::string encrypted;
+  EXPECT_EQ(LoginDatabase::ENCRYPTION_RESULT_SUCCESS,
+            db().EncryptedString(u"my_encrypted_password", &encrypted));
+  form.encrypted_password = encrypted;
+  form.blocked_by_user = false;
+  form.scheme = PasswordForm::Scheme::kHtml;
+  EXPECT_EQ(AddChangeForForm(form), db().AddLogin(form));
+
+  std::vector<std::unique_ptr<PasswordForm>> result;
+  ASSERT_TRUE(db().GetLogins(PasswordFormDigest(form),
+                             /*should_PSL_matching_apply=*/true, &result));
+  ASSERT_EQ(1U, result.size());
+  EXPECT_EQ(form.encrypted_password, result[0].get()->encrypted_password);
+
+  std::u16string decrypted;
+  EXPECT_EQ(
+      LoginDatabase::ENCRYPTION_RESULT_SUCCESS,
+      db().DecryptedString(result[0].get()->encrypted_password, &decrypted));
+  EXPECT_EQ(u"my_encrypted_password", decrypted);
+}
+
+// Test that when adding a login with password_value but with
+// encrypted_password, the encrypted_password is discarded.
+TEST_F(LoginDatabaseTest, AddLoginWithEncryptedPasswordAndValue) {
+  PasswordForm form;
+  form.url = GURL("http://accounts.google.com/LoginAuth");
+  form.signon_realm = "http://accounts.google.com/";
+  form.username_value = u"my_username";
+  form.password_value = u"my_password_value";
+  std::string encrypted;
+  EXPECT_EQ(LoginDatabase::ENCRYPTION_RESULT_SUCCESS,
+            db().EncryptedString(u"my_encrypted_password", &encrypted));
+  form.encrypted_password = encrypted;
+  form.blocked_by_user = false;
+  form.scheme = PasswordForm::Scheme::kHtml;
+  EXPECT_EQ(AddChangeForForm(form), db().AddLogin(form));
+
+  std::vector<std::unique_ptr<PasswordForm>> result;
+  ASSERT_TRUE(db().GetLogins(PasswordFormDigest(form),
+                             /*should_PSL_matching_apply=*/true, &result));
+  ASSERT_EQ(1U, result.size());
+  EXPECT_NE(form.encrypted_password, result[0].get()->encrypted_password);
+
+  std::u16string decrypted;
+  EXPECT_EQ(
+      LoginDatabase::ENCRYPTION_RESULT_SUCCESS,
+      db().DecryptedString(result[0].get()->encrypted_password, &decrypted));
+  EXPECT_EQ(u"my_password_value", decrypted);
+}
+
 TEST_F(LoginDatabaseTest, UpdateLogin) {
   PasswordForm form;
   form.url = GURL("http://accounts.google.com/LoginAuth");
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
index 8afc6a4..8c647a62 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -850,8 +850,9 @@
                     SecurePaymentConfirmationNoMatchingCredController.create(mWebContents);
             mNoMatchingController.show(() -> {
                 mJourneyLogger.setAborted(AbortReason.NO_MATCHING_PAYMENT_METHOD);
-                disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_PAYMENT_METHODS_OR_DATA,
-                        PaymentErrorReason.NOT_SUPPORTED);
+                disconnectFromClientWithDebugMessage(
+                        ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED,
+                        PaymentErrorReason.NOT_ALLOWED_ERROR);
             });
             return null;
         }
@@ -902,7 +903,8 @@
                         } else {
                             mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER);
                             disconnectFromClientWithDebugMessage(
-                                    ErrorStrings.USER_CANCELLED, PaymentErrorReason.USER_CANCEL);
+                                    ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED,
+                                    PaymentErrorReason.NOT_ALLOWED_ERROR);
                         }
 
                         mSpcAuthnUiController = null;
diff --git a/components/payments/content/payment_method_manifest_table_unittest.cc b/components/payments/content/payment_method_manifest_table_unittest.cc
index 11232c8..541955c 100644
--- a/components/payments/content/payment_method_manifest_table_unittest.cc
+++ b/components/payments/content/payment_method_manifest_table_unittest.cc
@@ -15,9 +15,11 @@
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "components/payments/core/secure_payment_confirmation_instrument.h"
 #include "components/webdata/common/web_database.h"
+#include "content/public/common/content_features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace payments {
@@ -94,7 +96,52 @@
   std::unique_ptr<WebDatabase> db_;
 };
 
-TEST_F(PaymentMethodManifestTableTest, GetNonExistManifest) {
+enum class APIVersion {
+  kApiV2,
+  kApiV3,
+};
+
+std::string APIVersionToString(const testing::TestParamInfo<APIVersion>& info) {
+  return APIVersion::kApiV2 == info.param ? "APIV2" : "APIV3";
+}
+
+class PaymentMethodManifestTableTestWithParam
+    : public PaymentMethodManifestTableTest,
+      public testing::WithParamInterface<APIVersion> {
+ public:
+  PaymentMethodManifestTableTestWithParam() {
+    std::vector<base::Feature> enabled_features = {
+        features::kSecurePaymentConfirmation};
+    std::vector<base::Feature> disabled_features;
+    switch (GetParam()) {
+      case APIVersion::kApiV2:
+        disabled_features.push_back(features::kSecurePaymentConfirmationAPIV3);
+        break;
+      case APIVersion::kApiV3:
+        enabled_features.push_back(features::kSecurePaymentConfirmationAPIV3);
+        break;
+    }
+    feature_list_.InitWithFeatures(enabled_features, disabled_features);
+  }
+
+  ~PaymentMethodManifestTableTestWithParam() override = default;
+
+  PaymentMethodManifestTableTestWithParam(
+      const PaymentMethodManifestTableTestWithParam& other) = delete;
+  PaymentMethodManifestTableTestWithParam& operator=(
+      const PaymentMethodManifestTableTestWithParam& other) = delete;
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(APIVersion,
+                         PaymentMethodManifestTableTestWithParam,
+                         testing::Values(APIVersion::kApiV2,
+                                         APIVersion::kApiV3),
+                         APIVersionToString);
+
+TEST_P(PaymentMethodManifestTableTestWithParam, GetNonExistManifest) {
   PaymentMethodManifestTable* payment_method_manifest_table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
   std::vector<std::string> web_app_ids =
@@ -102,7 +149,7 @@
   ASSERT_TRUE(web_app_ids.empty());
 }
 
-TEST_F(PaymentMethodManifestTableTest, AddAndGetSingleManifest) {
+TEST_P(PaymentMethodManifestTableTestWithParam, AddAndGetSingleManifest) {
   PaymentMethodManifestTable* payment_method_manifest_table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
 
@@ -127,7 +174,7 @@
   ASSERT_TRUE(base::Contains(retrieved_web_app_ids, web_app_ids[1]));
 }
 
-TEST_F(PaymentMethodManifestTableTest, AddAndGetMultipleManifest) {
+TEST_P(PaymentMethodManifestTableTestWithParam, AddAndGetMultipleManifest) {
   PaymentMethodManifestTable* payment_method_manifest_table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
 
@@ -168,7 +215,7 @@
   ASSERT_TRUE(base::Contains(alicepay_web_app_ids, web_app_ids[1]));
 }
 
-TEST_F(PaymentMethodManifestTableTest, GetNonExistingInstrument) {
+TEST_P(PaymentMethodManifestTableTestWithParam, GetNonExistingInstrument) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
   EXPECT_TRUE(
@@ -182,7 +229,7 @@
           .empty());
 }
 
-TEST_F(PaymentMethodManifestTableTest, AddAndGetOneValidInstrument) {
+TEST_P(PaymentMethodManifestTableTestWithParam, AddAndGetOneValidInstrument) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
 
@@ -204,7 +251,8 @@
           .empty());
 }
 
-TEST_F(PaymentMethodManifestTableTest, AddingInvalidInstrumentReturnsFalse) {
+TEST_P(PaymentMethodManifestTableTestWithParam,
+       AddingInvalidInstrumentReturnsFalse) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
 
@@ -221,19 +269,31 @@
                                           u"Instrument label", CreateIcon())));
 
   // Empty label.
-  EXPECT_FALSE(table->AddSecurePaymentConfirmationInstrument(
-      SecurePaymentConfirmationInstrument(
-          CreateCredentialId(), "relying-party.example",
-          /*label=*/std::u16string(), CreateIcon())));
+  bool add_empty_label_successful =
+      table->AddSecurePaymentConfirmationInstrument(
+          SecurePaymentConfirmationInstrument(
+              CreateCredentialId(), "relying-party.example",
+              /*label=*/std::u16string(), CreateIcon()));
+  if (GetParam() == APIVersion::kApiV3) {
+    EXPECT_TRUE(add_empty_label_successful);
+  } else {
+    EXPECT_FALSE(add_empty_label_successful);
+  }
 
   // Empty icon.
-  EXPECT_FALSE(table->AddSecurePaymentConfirmationInstrument(
-      SecurePaymentConfirmationInstrument(CreateCredentialId(),
-                                          "relying-party.example",
-                                          u"Instrument label", {})));
+  bool add_empty_icon_successful =
+      table->AddSecurePaymentConfirmationInstrument(
+          SecurePaymentConfirmationInstrument(CreateCredentialId(),
+                                              "relying-party.example",
+                                              u"Instrument label", {}));
+  if (GetParam() == APIVersion::kApiV3) {
+    EXPECT_TRUE(add_empty_icon_successful);
+  } else {
+    EXPECT_FALSE(add_empty_icon_successful);
+  }
 }
 
-TEST_F(PaymentMethodManifestTableTest, UpdatingInstrumentReturnsTrue) {
+TEST_P(PaymentMethodManifestTableTestWithParam, UpdatingInstrumentReturnsTrue) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
   EXPECT_TRUE(table->AddSecurePaymentConfirmationInstrument(
@@ -253,7 +313,7 @@
                            std::move(instruments));
 }
 
-TEST_F(PaymentMethodManifestTableTest,
+TEST_P(PaymentMethodManifestTableTestWithParam,
        DifferentRelyingPartiesCannotUseSameCredentialIdentifier) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
@@ -274,7 +334,8 @@
                            std::move(instruments));
 }
 
-TEST_F(PaymentMethodManifestTableTest, RelyingPartyCanHaveMultipleCredentials) {
+TEST_P(PaymentMethodManifestTableTestWithParam,
+       RelyingPartyCanHaveMultipleCredentials) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
 
@@ -330,7 +391,7 @@
   EXPECT_EQ(expected_icon, instruments.back()->icon);
 }
 
-TEST_F(PaymentMethodManifestTableTest, ClearInstruments) {
+TEST_P(PaymentMethodManifestTableTestWithParam, ClearInstruments) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
   EXPECT_TRUE(table->AddSecurePaymentConfirmationInstrument(
@@ -355,7 +416,7 @@
           .empty());
 }
 
-TEST_F(PaymentMethodManifestTableTest,
+TEST_P(PaymentMethodManifestTableTestWithParam,
        ClearInstruments_NotDeleteOutOfTimeRange) {
   PaymentMethodManifestTable* table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
@@ -381,7 +442,8 @@
           .size());
 }
 
-TEST_F(PaymentMethodManifestTableTest, InstrumentTableAddDateCreatedColumn) {
+TEST_P(PaymentMethodManifestTableTestWithParam,
+       InstrumentTableAddDateCreatedColumn) {
   PaymentMethodManifestTable* payment_method_manifest_table =
       PaymentMethodManifestTable::FromWebDatabase(db_.get());
   EXPECT_TRUE(payment_method_manifest_table->RazeForTest());
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index cde6081..6cafad6 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -801,10 +801,15 @@
   RecordFirstAbortReason(JourneyLogger::ABORT_REASON_ABORTED_BY_USER);
 
   // This sends an error to the renderer, which informs the API user.
-  client_->OnError(mojom::PaymentErrorReason::USER_CANCEL,
-                   !reject_show_error_message_.empty()
-                       ? reject_show_error_message_
-                       : errors::kUserCancelled);
+  // If SPC flag is enabled, use NotAllowedError instead.
+  bool is_spc_enabled = spec_->IsSecurePaymentConfirmationRequested();
+  client_->OnError(
+      is_spc_enabled ? mojom::PaymentErrorReason::NOT_ALLOWED_ERROR
+                     : mojom::PaymentErrorReason::USER_CANCEL,
+      is_spc_enabled
+          ? errors::kWebAuthnOperationTimedOutOrNotAllowed
+          : (!reject_show_error_message_.empty() ? reject_show_error_message_
+                                                 : errors::kUserCancelled));
 
   // We close all bindings and ask to be destroyed.
   client_.reset();
diff --git a/components/payments/core/error_strings.cc b/components/payments/core/error_strings.cc
index c1a54fd..8b531b2 100644
--- a/components/payments/core/error_strings.cc
+++ b/components/payments/core/error_strings.cc
@@ -37,6 +37,7 @@
 const char kStrictBasicCardShowReject[] = "User does not have valid information on file.";
 const char kTotalRequired[] = "Total required.";
 const char kUserCancelled[] = "User closed the Payment Request UI.";
+const char kWebAuthnOperationTimedOutOrNotAllowed[] = "The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.";
 const char kInvalidPaymentDetails[] = "Invalid payment details.";
 const char kInvalidPaymentOptions[] = "Invalid payment options.";
 // clang-format on
diff --git a/components/payments/core/error_strings.h b/components/payments/core/error_strings.h
index 3b2b426e..12ddd29b 100644
--- a/components/payments/core/error_strings.h
+++ b/components/payments/core/error_strings.h
@@ -101,6 +101,10 @@
 // Used when user dismissed the Payment Request dialog.
 extern const char kUserCancelled[];
 
+// Used when user cancels authentication or when there are no matching
+// credentials
+extern const char kWebAuthnOperationTimedOutOrNotAllowed[];
+
 // Used when the renderer does not provide valid payment details, such as a null
 // struct or missing ID or total.
 extern const char kInvalidPaymentDetails[];
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 4a713a8a..c9cedc1 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -197,17 +197,19 @@
   // Identification of the device that is not already available.
   optional DeviceRegisterIdentification device_register_identification = 18;
 
-  // Indicates all possible PSM protocol final results without specifying the
-  // root cause in case of an error.
+  // Indicates all possible PSM (Private Set Membership) protocol final results
+  // without specifying the root cause in case of an error.
   enum PsmExecutionResult {
-    // PSM protocol started and it hasn't finished successfully or terminated
-    // due to a protocol's error.
+    // PSM protocol started and it neither finished successfully nor
+    // terminated due to a protocol's error.
     PSM_RESULT_UNKNOWN = 0;
 
-    // PSM finished successfully and there was a state for the device.
+    // PSM finished successfully and there was server-backed state for the
+    // device.
     PSM_RESULT_SUCCESSFUL_WITH_STATE = 1;
 
-    // PSM finished successfully and there was no state for the device.
+    // PSM finished successfully and there was no server-backed state for the
+    // device.
     PSM_RESULT_SUCCESSFUL_WITHOUT_STATE = 2;
 
     // PSM terminated due to an error.
@@ -216,7 +218,7 @@
   optional PsmExecutionResult psm_execution_result = 19;
 
   // Timestamp of PSM retrieving the device's determination successfully in
-  // milliseconds since epoch.
+  // milliseconds since Epoch in UTC timezone (Java time).
   optional int64 psm_determination_timestamp_ms = 20;
 
   // Next id: 21.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 6353e44..0e921c3 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -106,6 +106,11 @@
       Als je het beleid niet toepast, staat de geanonimiseerde gegevensverzameling met URL-sleutel niet aan.
 
       Als je het beleid instelt, kunnen gebruikers het niet aanpassen. Als je het beleid niet instelt, is de geanonimiseerde gegevensverzameling met URL-sleutel aanvankelijk actief, maar kunnen gebruikers dit aanpassen.</translation>
+<translation id="1137096407176363892">Stemmen voor verbeterde tekst-naar-spraak via netwerk toestaan voor de toegankelijkheidsfunctie Selecteer om uitgesproken te worden. Deze stemmen sturen tekst naar de servers van Google om natuurlijk klinkende spraak te synthetiseren.
+
+          Als je dit beleid instelt op False, staat de functie voor stemmen voor verbeterde tekst-naar-spraak via netwerk altijd uit in Selecteer om uitgesproken te worden.
+
+          Als je dit beleid instelt op True of niet instelt, kunnen gebruikers de functie voor stemmen voor verbeterde tekst-naar-spraak via netwerk aan- of uitzetten in Selecteer om uitgesproken te worden.</translation>
 <translation id="1138294736309071213">Dit beleid wordt alleen toegepast in de winkelmodus.
 
       Bepaalt de periode waarna de schermbeveiliging zichtbaar is in het inlogvenster voor apparaten in de winkelmodus.
@@ -1769,6 +1774,7 @@
 <translation id="3128072319047570212">Instellingen voor sleutelgenerator</translation>
 <translation id="3142410959002029864">Als je dit beleid instelt, wordt de standaardinstelling voor dubbelzijdig afdrukken overschreven. Als deze instelling niet beschikbaar is, wordt dit beleid genegeerd.</translation>
 <translation id="3144173889708944482">Als <ph name="PRINTERS_BLOCKLIST" /> wordt gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers niet kunnen gebruiken. Alle printers zijn beschikbaar voor gebruikers, behalve de ID's in dit beleid. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
+<translation id="3146711617256415776">Stemmen voor verbeterde tekst-naar-spraak via netwerk niet toestaan bij gebruik van Selecteer om uitgesproken te worden</translation>
 <translation id="3152425128389603870">Maak Samengestelde desktop beschikbaar en zet deze standaard aan</translation>
 <translation id="3159375329008977062">Gebruiker kan Crostini-containers exporteren/importeren via de gebruikersinterface</translation>
 <translation id="3165808775394012744">Deze beleidsregels zijn hier opgenomen zodat je ze makkelijk kunt verwijderen.</translation>
@@ -3916,6 +3922,7 @@
       Dit beleid geldt alleen als de machine is ingeschreven met <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> voor <ph name="PRODUCT_NAME" />.
       Dit beleid geldt altijd voor <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="6022948604095165524">Actie bij starten</translation>
+<translation id="602318745029752898">Stemmen voor verbeterde tekst-naar-spraak via netwerk toestaan in Selecteer om uitgesproken te worden.</translation>
 <translation id="6025267044008029374">Schadelijke downloads blokkeren (aanbevolen)</translation>
 <translation id="6026722971789064331">Gebruik van de File System API voor schrijven beheren</translation>
 <translation id="602728333950205286">Instant-URL voor standaardzoekprovider</translation>
@@ -5581,6 +5588,7 @@
 <translation id="8118665053362250806">Grootte voor mediaschijfcache instellen</translation>
 <translation id="8124468781472887384">Toegangsbeleid voor configuratie van apparaatprinters.</translation>
 <translation id="8128192446158421884">URL's waarbij AutoOpenFileTypes van toepassing kan zijn</translation>
+<translation id="8131046602440880289">Stemmen voor verbeterde tekst-naar-spraak via netwerk toestaan bij gebruik van Selecteer om uitgesproken te worden</translation>
 <translation id="8133152694354699657">Als je het beleid instelt op True of niet instelt, wordt 'Tikken om te zoeken' beschikbaar voor gebruikers. Ze kunnen de functie aan- of uitzetten.
 
       Als je het beleid instelt op False, wordt 'Tikken om te zoeken' volledig uitgezet.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index f102c58..3cb0f52 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -93,6 +93,7 @@
 <translation id="1096105751829466145">Nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
 <translation id="1099282607296956954">Bật chính sách Cô lập trang web cho mọi trang web</translation>
 <translation id="1105572260329131950">Sử dụng biểu tượng mặc định cho các kết nối an toàn</translation>
+<translation id="1110426799149444997">Tắt tính năng tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation>
 <translation id="1117535567637097036">Trình xử lý giao thức được đặt qua chính sách này không được sử dụng khi xử lý các cơ chế của Android.</translation>
 <translation id="1118093128235245168">Cho phép các trang web yêu cầu người dùng cấp quyền truy cập vào một thiết bị USB đã kết nối</translation>
 <translation id="111910763555783249">Cài đặt thông báo</translation>
@@ -352,6 +353,7 @@
       Nếu bạn không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ tìm cách phát hiện xem một máy chủ có thuộc mạng nội bộ hay không. Chỉ khi đó, ứng dụng này mới phản hồi yêu cầu IWA. Nếu phát hiện một máy chủ là từ Internet, thì <ph name="PRODUCT_NAME" /> sẽ bỏ qua yêu cầu IWA từ máy chủ đó.
 
       Lưu ý: Hãy phân tách tên của các máy chủ bằng dấu phẩy. Cho phép sử dụng ký tự đại diện <ph name="WILDCARD_VALUE" />.</translation>
+<translation id="1488724823347505879">Bật tính năng chia sẻ dữ liệu của ứng dụng Android sang ứng dụng web</translation>
 <translation id="1495817006535797003">Nếu bạn đặt chính sách này thì mỗi nguồn gốc có tên trong một danh sách phân tách bằng dấu phẩy sẽ chạy theo quy trình riêng và các nguồn có tên theo miền con sẽ bị tách biệt. Ví dụ: việc chỉ định https://example.com/ sẽ khiến https://foo.example.com/ bị tách biệt vì là một phần của trang web https://example.com/.  Lưu ý rằng bắt đầu từ phiên bản 77 của <ph name="PRODUCT_NAME" />, Android sẽ tách biệt một số trang web nhạy cảm theo mặc định, đồng thời chính sách này cũng mở rộng chế độ tách biệt trang web theo mặc định để áp dụng cho tất cả các trang web.
 
       Nếu bạn đặt chính sách này thành Tắt thì hệ thống sẽ tắt mọi hình thức tách biệt trang web, bao gồm cả việc tách biệt các trang web nhạy cảm, các hoạt động thử nghiệm của IsolateOriginsAndroid, SitePerProcessAndroid và các chế độ tách biệt trang web khác. Người dùng vẫn có thể bật IsolateOrigins theo cách thủ công, thông qua cờ hiệu dòng lệnh.
@@ -731,6 +733,7 @@
       Chính sách doanh nghiệp này sẽ không có hiệu lực khi chưa phát hành. Sau khi chính sách doanh nghiệp được ra mắt, khi bạn bật chính sách doanh nghiệp này, thì chính sách trường giới thiệu mặc định của Chrome sẽ được đặt về giá trị trước đó là no-referrer-when-downgrade.
 
       Chính sách doanh nghiệp này bị tắt theo mặc định.</translation>
+<translation id="1960416154405676350">Bật tính năng tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation>
 <translation id="1962273523772270623">Cho phép thu thập nhật ký sự kiện WebRTC từ các dịch vụ của Google</translation>
 <translation id="1962864958436828230">Đặt giới hạn kích thước tối thiểu để ngăn chặn rò rỉ dữ liệu theo quy tắc hạn chế khay nhớ tạm</translation>
 <translation id="1964634611280150550">Đã tắt chế độ ẩn danh</translation>
@@ -1541,6 +1544,7 @@
 <translation id="288448261660192095">Nếu bạn đặt chính sách này thành Bật, các thiết bị vật lý đầu vào và thiết bị đầu ra của máy chủ truy cập từ xa sẽ bị tắt khi kết nối từ xa.
 
       Nếu bạn đặt thành Tắt hoặc không đặt chính sách này, thì cả người dùng trên máy và người dùng từ xa đều có thể tương tác với máy chủ khi máy chủ được chia sẻ.</translation>
+<translation id="2884765974461416016">Tắt tính năng chia sẻ dữ liệu của Ứng dụng Android sang Web.</translation>
 <translation id="2886215882246310669">Kiểm soát việc <ph name="PRODUCT_OS_NAME" /> có cho phép thêm tài khoản người dùng mới trên Family Link vào thiết bị hay không.
       Chính sách này chỉ hữu ích khi kết hợp với <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />. Chính sách này cho phép các tài khoản Family Link bổ sung vào các tài khoản được xác định trong danh sách cho phép.
       Chính sách này không ảnh hưởng đến hoạt động của các chính sách đăng nhập khác. Đặc biệt, chính sách này sẽ không có bất kỳ ảnh hưởng nào khi:
@@ -3752,6 +3756,7 @@
       Nếu bạn đặt chính sách này, người dùng sẽ không thay đổi được trong <ph name="PRODUCT_NAME" />. Nếu bạn không đặt chính sách này, người dùng có thể chọn mở tệp PDF bằng trình xem bên ngoài hoặc không.</translation>
 <translation id="570062449808736508">Khi chính sách này được đặt thành chuỗi không trống, WebView sẽ đọc hạn chế URL từ nhà cung cấp nội dung có tên tổ chức cho trước.</translation>
 <translation id="5708969689202733975">Định cấu hình chế độ mở khóa nhanh được phép</translation>
+<translation id="5714563837055244378">Bật tính năng chia sẻ dữ liệu của Ứng dụng Android sang Web.</translation>
 <translation id="5715617256528927547">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định thời gian tồn tại (tính theo giờ) của bộ nhớ đệm Đối tượng chính sách nhóm (GPO) – thời lượng tối đa có thể sử dụng lại các GPO trước khi các GPO này được tải xuống lần nữa. Thay vì tải các GPO xuống lần nữa trong mỗi lần tìm nạp chính sách, hệ thống có thể sử dụng lại các GPO đã lưu vào bộ nhớ đệm, miễn là phiên bản của các GPO này không thay đổi.
 
       Nếu bạn đặt chính sách này thành 0, tính năng lưu GPO vào bộ nhớ đệm sẽ bị tắt. Hậu quả là lượng tải trên máy chủ sẽ tăng lên vì các GPO được tải xuống lần nữa mỗi khi tìm nạp chính sách, ngay cả khi các GPO này không thay đổi.
@@ -4921,6 +4926,9 @@
 <translation id="710003290625031750">Mô tả lược đồ mở rộng:</translation>
 <translation id="7101550508196914704">Không hiển thị lối tắt ứng dụng trên thanh dấu trang</translation>
 <translation id="7109384070286741861">Vô hiệu hóa thuật toán CECPQ2</translation>
+<translation id="7122626777103192518">Nếu bạn bật chính sách, thì hệ thống sẽ cho phép chia sẻ văn bản/tệp từ các ứng dụng Android sang Ứng dụng web được hỗ trợ bằng cách sử dụng hệ thống chia sẻ được tích hợp sẵn trong Android.
+      Khi bạn bật chính sách, hệ thống sẽ gửi siêu dữ liệu của các Ứng dụng web đã cài đặt tới Google để tạo và cài đặt ứng dụng Android đệm.
+      Nếu bạn tắt chính sách, thì hệ thống sẽ vô hiệu hóa chức năng này.</translation>
 <translation id="7126716959063786004">Cho phép kết thúc các quá trình trong Trình quản lý tác vụ</translation>
 <translation id="7126928806195745404">Cài đặt JavaScript</translation>
 <translation id="7127892035367404455">Khôi phục về phiên bản đích</translation>
@@ -5471,6 +5479,7 @@
       Bạn chỉ có thể đặt chính sách này trên <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation>
 <translation id="7816326058023670173">Dữ liệu mật được chia sẻ giữa thiết bị của con và cha mẹ.</translation>
 <translation id="7818131573217430250">Đặt trạng thái chế độ tương phản cao mặc định trên màn hình đăng nhập</translation>
+<translation id="7821864705813933283">Cho phép mục trong trình đơn tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" /> hiển thị trong trình đơn theo bối cảnh nếu được hỗ trợ.</translation>
 <translation id="7823902813460802031">Khi bạn đặt chính sách này thành Bật, <ph name="PRODUCT_OS_NAME" /> sẽ ngăn thiết bị chuyển sang Chế độ nhà phát triển.
 
        Khi bạn đặt thành Tắt hoặc không đặt chính sách này, thiết bị có thể chuyển sang Chế độ nhà phát triển.</translation>
@@ -5754,6 +5763,7 @@
 <translation id="8238421250255592181">Một cờ boolean cho biết liệu bàn phím ảo có thể cung cấp tính năng tự động hoàn thành hay không.</translation>
 <translation id="8244171102276095471">Bật bộ mật mã RC4 trong TLS</translation>
 <translation id="8244525275280476362">Độ trễ tìm nạp tối đa sau khi hủy hiệu lực chính sách</translation>
+<translation id="8245574649143980200">Nếu bạn không đặt hoặc đặt chính sách thành Bật, thì hệ thống sẽ cho phép người dùng xem và dùng mục trong trình đơn tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" /> trong trình đơn theo bối cảnh. Nếu bạn đặt chính sách thành Tắt, thì người dùng sẽ không nhìn thấy mục trong trình đơn tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" /> trong trình đơn theo bối cảnh khi tính năng tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" /> được hỗ trợ.</translation>
 <translation id="82530263956734297">Các mã nhận dạng tiện ích sẽ được miễn trừ khỏi danh sách chặn</translation>
 <translation id="8256688113167012935">Kiểm soát tên tài khoản <ph name="PRODUCT_OS_NAME" /> hiển thị trên màn hình đăng nhập cho tài khoản trong thiết bị tương ứng.
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 8064e11..bd540d31 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -93,6 +93,7 @@
 <translation id="1096105751829466145">預設搜尋引擎</translation>
 <translation id="1099282607296956954">為所有網站啟用網站隔離</translation>
 <translation id="1105572260329131950">使用預設圖示代表安全連線</translation>
+<translation id="1110426799149444997">停用 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋功能。</translation>
 <translation id="1117535567637097036">處理 Android 意圖時,系統不會使用透過這項政策設定的通訊協定處理常式。</translation>
 <translation id="1118093128235245168">允許網站要求使用者授權存取已連線的 USB 裝置</translation>
 <translation id="111910763555783249">通知設定</translation>
@@ -350,6 +351,7 @@
           如果未設定這項政策,<ph name="PRODUCT_NAME" /> 會嘗試偵測伺服器是否位於內部網路,且只會回應內部網路伺服器傳來的 IWA 要求。如果偵測結果顯示伺服器位於網際網路,<ph name="PRODUCT_NAME" /> 就會忽略該伺服器傳來的 IWA 要求。
 
       注意:請以半形逗號分隔伺服器名稱,可使用萬用字元 (<ph name="WILDCARD_VALUE" />)。</translation>
+<translation id="1488724823347505879">允許從 Android 應用程式分享內容到網頁應用程式</translation>
 <translation id="1495817006535797003">如果設定這項政策,系統會以獨立程序分別執行逗號分隔清單中指定的每個來源,並隔離以子網域命名的來源。例如指定 https://example.com/ 將會導致 https://foo.example.com/ 遭到隔離,因為後者屬於 https://example.com/ 網站的一部分。請注意,自 <ph name="PRODUCT_NAME" /> 第 77 版起,Android 會預設隔離某些敏感網站,此政策會將這個隔離模式擴及其他特定的來源。
 
       如果將這項政策設為停用,則會關閉所有形式的網站隔離功能,包括隔離敏感網站、IsolateOriginsAndroid 和 SitePerProcessAndroid 的實測,以及其他網站隔離模式。使用者仍可透過指令列旗標來手動啟用 IsolateOrigins。
@@ -727,6 +729,7 @@
       在推出之前,這項企業政策不會生效。如果你在推出之後啟用這項企業政策,Chrome 的預設參照政策將設為先前的值 no-referrer-when-downgrade。
 
       在預設狀態下,系統會停用這項企業政策。</translation>
+<translation id="1960416154405676350">啟用 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋功能。</translation>
 <translation id="1962273523772270623">允許從 Google 服務收集 WebRTC 事件記錄</translation>
 <translation id="1962864958436828230">設定防止資料外洩的剪貼簿資料大小最低限制</translation>
 <translation id="1964634611280150550">無痕模式已停用</translation>
@@ -1512,6 +1515,7 @@
 <translation id="288448261660192095">如果將這項政策設為啟用,在遠端連線期間,系統會停用遠端存取主機的實體輸入和輸出裝置。
 
       如果將這項政策設為停用或不設定,則在共用主機期間,本機和遠端使用者都可與主機互動。</translation>
+<translation id="2884765974461416016">禁止從 Android 分享內容到網頁應用程式。</translation>
 <translation id="2886215882246310669">這項政策可控管 <ph name="PRODUCT_OS_NAME" />是否允許將新的 Family Link 使用者帳戶加入裝置。
       這項政策只有在搭配 <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" /> 時才會有作用。除了許可清單中定義的帳戶以外,這項政策也會允許 Family Link 帳戶加入裝置。
       這項政策不會影響其他登入政策的行為。特別是在以下情況中,這項政策不會有任何作用:
@@ -3684,6 +3688,7 @@
       如果設定這項政策,使用者將無法在 <ph name="PRODUCT_NAME" /> 中進行變更。如果不設定這項政策,使用者可以選擇是否要從外部開啟 PDF。</translation>
 <translation id="570062449808736508">如果將這項政策設為非空白字串,WebView 就會讀取內容提供者 (擁有指定授權單位名稱) 的網址限制設定。</translation>
 <translation id="5708969689202733975">設定允許的快速解鎖模式</translation>
+<translation id="5714563837055244378">允許從 Android 分享內容到網頁應用程式。</translation>
 <translation id="5715617256528927547">你可以透過這項政策,指定群組政策物件 (GPO) 快取的效期 (以小時為單位),也就是 GPO 在重新下載前可供重複使用的時間長度上限。只要快取 GPO 的版本沒有改變,系統就能重複使用這些快取 GPO,不必在每次擷取政策時重新下載 GPO。如果將這項政策設為 0,將會關閉 GPO 快取功能。在這種情況下,系統於每次擷取政策時都必須重新下載 GPO,即使 GPO 沒有更動也一樣,因此伺服器負載會增加。
 
       如果不設定這項政策,快取的 GPO 將可供重複使用,效期最長可達 25 小時。
@@ -4810,6 +4815,9 @@
 <translation id="710003290625031750">展開的架構說明:</translation>
 <translation id="7101550508196914704">不在書籤列中顯示應用程式捷徑</translation>
 <translation id="7109384070286741861">停用 CECPQ2</translation>
+<translation id="7122626777103192518">如果將這項政策設為 True,就可以透過內建的 Android 分享系統,將 Android 應用程式中的文字/檔案分享到支援的網頁應用程式。
+      本功能啟用時,系統會針對已安裝的網頁應用程式將中繼資料傳送給 Google,藉此產生並安裝這些應用程式與 Android 相容的版本。
+      如果將這項政策設為 False,則可停用此功能。</translation>
 <translation id="7126716959063786004">允許在工作管理員中結束處理程序</translation>
 <translation id="7126928806195745404">JavaScript 設定</translation>
 <translation id="7127892035367404455">復原至目標版本</translation>
@@ -5352,6 +5360,7 @@
       這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation>
 <translation id="7816326058023670173">兒童和家長的裝置所共用的密鑰。</translation>
 <translation id="7818131573217430250">設定高反差模式在登入畫面的預設狀態</translation>
+<translation id="7821864705813933283">允許在內容選單中顯示 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋選單項目 (如果支援的話)。</translation>
 <translation id="7823902813460802031">如果將這項政策設為啟用,<ph name="PRODUCT_OS_NAME" />會阻止裝置進入開發人員模式。
 
        如果將這項設為停用或不設定,裝置便可以使用開發人員模式。</translation>
@@ -5630,6 +5639,7 @@
 <translation id="8238421250255592181">布林值標記,表示螢幕小鍵盤是否能提供自動完成功能。</translation>
 <translation id="8244171102276095471">在傳輸層安全標準 (TLS) 中啟用 RC4 加密套件</translation>
 <translation id="8244525275280476362">政策失效後的最大擷取延遲</translation>
+<translation id="8245574649143980200">如果將這項政策設為啟用或不設定,使用者即可在內容選單中查看及使用 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋選單項目。如果將這項政策設為停用,即使系統支援 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋功能,使用者也不會在內容選單中看到 <ph name="GOOGLE_LENS_PRODUCT_NAME" />的區域搜尋選單項目。</translation>
 <translation id="82530263956734297">要從封鎖清單中排除的擴充功能 ID</translation>
 <translation id="8256688113167012935">控制 <ph name="PRODUCT_OS_NAME" /> 在登入畫面上顯示的帳戶名稱,以表示相對應的裝置本機帳戶。
 
diff --git a/components/printing/browser/print_manager.cc b/components/printing/browser/print_manager.cc
index 19a6b012..8635852 100644
--- a/components/printing/browser/print_manager.cc
+++ b/components/printing/browser/print_manager.cc
@@ -13,13 +13,16 @@
 
 PrintManager::PrintManager(content::WebContents* contents)
     : content::WebContentsObserver(contents),
-      print_manager_host_receivers_(
-          contents,
-          this,
-          content::WebContentsFrameReceiverSetPassKey()) {}
+      print_manager_host_receivers_(contents, this) {}
 
 PrintManager::~PrintManager() = default;
 
+void PrintManager::BindReceiver(
+    mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+    content::RenderFrameHost* rfh) {
+  print_manager_host_receivers_.Bind(rfh, std::move(receiver));
+}
+
 void PrintManager::RenderFrameDeleted(
     content::RenderFrameHost* render_frame_host) {
   print_render_frames_.erase(render_frame_host);
diff --git a/components/printing/browser/print_manager.h b/components/printing/browser/print_manager.h
index 7e2881e..732ffc4 100644
--- a/components/printing/browser/print_manager.h
+++ b/components/printing/browser/print_manager.h
@@ -10,8 +10,8 @@
 
 #include "build/build_config.h"
 #include "components/printing/common/print.mojom.h"
+#include "content/public/browser/render_frame_host_receiver_set.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_contents_receiver_set.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "printing/buildflags/buildflags.h"
 
@@ -30,6 +30,10 @@
   PrintManager& operator=(const PrintManager&) = delete;
   ~PrintManager() override;
 
+  void BindReceiver(
+      mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
+      content::RenderFrameHost* rfh);
+
 #if defined(OS_ANDROID)
   // TODO(timvolodine): consider introducing PrintManagerAndroid (crbug/500960)
   using PdfWritingDoneCallback =
@@ -86,8 +90,8 @@
   uint32_t number_pages_ = 0;  // Number of pages to print in the print job.
   int cookie_ = 0;        // The current document cookie.
 
-  // Holds WebContents associated mojo receivers.
-  content::WebContentsFrameReceiverSet<printing::mojom::PrintManagerHost>
+  // Holds RenderFrameHost-associated mojo receivers.
+  content::RenderFrameHostReceiverSet<printing::mojom::PrintManagerHost>
       print_manager_host_receivers_;
 
 #if defined(OS_ANDROID)
diff --git a/components/remote_cocoa/app_shim/select_file_dialog_bridge.mm b/components/remote_cocoa/app_shim/select_file_dialog_bridge.mm
index 215ef86..a9befe6 100644
--- a/components/remote_cocoa/app_shim/select_file_dialog_bridge.mm
+++ b/components/remote_cocoa/app_shim/select_file_dialog_bridge.mm
@@ -14,6 +14,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/hang_watcher.h"
 #include "base/threading/thread_restrictions.h"
 #import "ui/base/cocoa/controls/textfield_utils.h"
 #include "ui/base/l10n/l10n_util_mac.h"
@@ -253,6 +254,14 @@
     int file_type_index,
     const base::FilePath::StringType& default_extension,
     PanelEndedCallback initialize_callback) {
+  // Never consider the current WatchHangsInScope as hung. There was most likely
+  // one created in ThreadControllerWithMessagePumpImpl::DoWork(). The current
+  // hang watching deadline is not valid since the user can take unbounded time
+  // to select a file. HangWatching will resume when the next task
+  // or event is pumped in MessagePumpCFRunLoop so there is no need to
+  // reactivate it. You can see the function comments for more details.
+  base::HangWatcher::InvalidateActiveExpectations();
+
   show_callback_ = std::move(initialize_callback);
   type_ = type;
   // Note: we need to retain the dialog as |owning_window_| can be null.
diff --git a/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h b/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h
index 7faaf2a..20e2ed7fa 100644
--- a/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h
+++ b/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h
@@ -37,12 +37,11 @@
   MOCK_CONST_METHOD0(GetAccountInfo, AccountInfo());
   MOCK_CONST_METHOD0(IsPrimaryAccountSyncing, bool());
   MOCK_CONST_METHOD0(IsPrimaryAccountSignedIn, bool());
-  MOCK_CONST_METHOD0(IsPrimaryAccountGmail, bool());
   MOCK_CONST_METHOD1(GetPasswordProtectionWarningTriggerPref,
                      PasswordProtectionTrigger(ReusedPasswordAccountType));
-  MOCK_CONST_METHOD1(GetSignedInNonSyncAccount,
+  MOCK_CONST_METHOD1(GetAccountInfoForUsername,
                      AccountInfo(const std::string&));
-  MOCK_CONST_METHOD1(IsOtherGaiaAccountGmail, bool(const std::string&));
+  MOCK_CONST_METHOD1(IsAccountGmail, bool(const std::string&));
   MOCK_CONST_METHOD1(IsURLAllowlistedForPasswordEntry, bool(const GURL&));
 
   MOCK_METHOD1(FillUserPopulation, void(LoginReputationClientRequest*));
diff --git a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc
index 669e5f8..3f56adf 100644
--- a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc
@@ -1135,7 +1135,7 @@
   account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
-  EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
+  EXPECT_CALL(*password_protection_service_, GetAccountInfoForUsername(_))
       .WillRepeatedly(Return(account_info));
 
   InitializeAndStartPasswordEntryRequest(
@@ -1362,7 +1362,7 @@
   account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
-  EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
+  EXPECT_CALL(*password_protection_service_, GetAccountInfoForUsername(_))
       .WillRepeatedly(Return(account_info));
 
   // Don't show modal warning if it is not a password reuse ping.
@@ -1553,7 +1553,7 @@
   account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
-  EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
+  EXPECT_CALL(*password_protection_service_, GetAccountInfoForUsername(_))
       .WillRepeatedly(Return(account_info));
 
   EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
diff --git a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
index 5816c3b..3caafbc 100644
--- a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
@@ -671,6 +671,9 @@
                 .navigation_time_msec();
   auto it = navigation_event_list_.navigation_events().rbegin();
   ReferrerChain navigation_chain;
+  UMA_HISTOGRAM_COUNTS_1000(
+      "SafeBrowsing.NavigationObserver.NavigationEventsRecordedLength",
+      navigation_event_list_.navigation_events().size());
   while (it != navigation_event_list_.navigation_events().rend()) {
     // Skip navigations that happened after |last_navigation_time_msec|.
     if (it->get()->last_updated.ToJavaTime() < last_navigation_time_msec) {
diff --git a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager_util.cc b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager_util.cc
index bcab825..24e6e7e5 100644
--- a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager_util.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager_util.cc
@@ -4,8 +4,6 @@
 
 #include "components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager_util.h"
 
-#include "base/metrics/histogram_macros.h"
-
 namespace safe_browsing {
 
 void MaybeRemoveNonUserGestureReferrerEntries(ReferrerChain* referrer_chain,
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc
index fca0c02..ae2c871 100644
--- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc
+++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc
@@ -308,21 +308,20 @@
         return reused_password_account_type;
       }
       reused_password_account_type.set_account_type(
-          IsPrimaryAccountGmail() ? ReusedPasswordAccountType::GMAIL
-                                  : ReusedPasswordAccountType::GSUITE);
+          IsAccountGmail(username) ? ReusedPasswordAccountType::GMAIL
+                                   : ReusedPasswordAccountType::GSUITE);
       return reused_password_account_type;
     }
     case PasswordType::OTHER_GAIA_PASSWORD: {
-      AccountInfo account_info = GetSignedInNonSyncAccount(username);
+      AccountInfo account_info = GetAccountInfoForUsername(username);
       if (account_info.account_id.empty()) {
         reused_password_account_type.set_account_type(
             ReusedPasswordAccountType::UNKNOWN);
         return reused_password_account_type;
       }
       reused_password_account_type.set_account_type(
-          IsOtherGaiaAccountGmail(username)
-              ? ReusedPasswordAccountType::GMAIL
-              : ReusedPasswordAccountType::GSUITE);
+          IsAccountGmail(username) ? ReusedPasswordAccountType::GMAIL
+                                   : ReusedPasswordAccountType::GSUITE);
       return reused_password_account_type;
     }
     case PasswordType::PASSWORD_TYPE_UNKNOWN:
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h
index de33159..8238fe4 100644
--- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h
+++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h
@@ -309,17 +309,13 @@
   // If primary account is signed in.
   virtual bool IsPrimaryAccountSignedIn() const = 0;
 
-  // If a domain is not defined for the primary account. This means the primary
-  // account is a Gmail account.
-  virtual bool IsPrimaryAccountGmail() const = 0;
-
-  // If the domain for the non sync account is equal to |kNoHostedDomainFound|,
+  // If the domain for the account is equal to |kNoHostedDomainFound|,
   // this means that the account is a Gmail account.
-  virtual bool IsOtherGaiaAccountGmail(const std::string& username) const = 0;
+  virtual bool IsAccountGmail(const std::string& username) const = 0;
 
   // Gets the account based off of the username from a list of signed in
   // accounts.
-  virtual AccountInfo GetSignedInNonSyncAccount(
+  virtual AccountInfo GetAccountInfoForUsername(
       const std::string& username) const = 0;
 
   // If Safe browsing endpoint is not enabled in the country.
diff --git a/components/search_engines/default_search_manager.cc b/components/search_engines/default_search_manager.cc
index 88a5694..8fa9c57b 100644
--- a/components/search_engines/default_search_manager.cc
+++ b/components/search_engines/default_search_manager.cc
@@ -79,6 +79,7 @@
     "created_from_play_api";
 const char DefaultSearchManager::kPreconnectToSearchUrl[] =
     "preconnect_to_search_url";
+const char DefaultSearchManager::kIsActive[] = "is_active";
 
 DefaultSearchManager::DefaultSearchManager(
     PrefService* pref_service,
diff --git a/components/search_engines/default_search_manager.h b/components/search_engines/default_search_manager.h
index 9c56805..86996ac 100644
--- a/components/search_engines/default_search_manager.h
+++ b/components/search_engines/default_search_manager.h
@@ -62,6 +62,7 @@
   static const char kDisabledByPolicy[];
   static const char kCreatedFromPlayAPI[];
   static const char kPreconnectToSearchUrl[];
+  static const char kIsActive[];
 
   enum Source {
     // Default search engine chosen either from prepopulated engines set for
diff --git a/components/search_engines/keyword_table.cc b/components/search_engines/keyword_table.cc
index 35f4a1e..cb82ffd 100644
--- a/components/search_engines/keyword_table.cc
+++ b/components/search_engines/keyword_table.cc
@@ -104,6 +104,10 @@
     // Column added in version 82.
     columns.push_back("created_from_play_api");
   }
+  if (version >= 97) {
+    // Column added in version 97
+    columns.push_back("is_active");
+  }
 
   return base::JoinString(columns, std::string(concatenated ? " || " : ", "));
 }
@@ -159,6 +163,7 @@
   s->BindInt64(starting_column + 20,
                data.last_visited.since_origin().InMicroseconds());
   s->BindBool(starting_column + 21, data.created_from_play_api);
+  s->BindInt(starting_column + 22, static_cast<int>(data.is_active));
 }
 
 WebDatabaseTable::TypeKey GetKey() {
@@ -209,7 +214,8 @@
              "image_url_post_params VARCHAR,"
              "new_tab_url VARCHAR,"
              "last_visited INTEGER DEFAULT 0, "
-             "created_from_play_api INTEGER DEFAULT 0)");
+             "created_from_play_api INTEGER DEFAULT 0, "
+             "is_active INTEGER DEFAULT 0)");
 }
 
 bool KeywordTable::IsSyncable() {
@@ -239,6 +245,8 @@
       return MigrateToVersion77IncreaseTimePrecision();
     case 82:
       return MigrateToVersion82AddCreatedFromPlayApiColumn();
+    case 97:
+      return MigrateToVersion97AddIsActiveColumn();
   }
 
   return true;
@@ -453,6 +461,11 @@
       "0");
 }
 
+bool KeywordTable::MigrateToVersion97AddIsActiveColumn() {
+  return db_->Execute(
+      "ALTER TABLE keywords ADD COLUMN is_active INTEGER DEFAULT 0");
+}
+
 // static
 bool KeywordTable::GetKeywordDataFromStatement(sql::Statement& s,
                                                TemplateURLData* data) {
@@ -488,6 +501,7 @@
   data->usage_count = s.ColumnInt(8);
   data->prepopulate_id = s.ColumnInt(11);
   data->sync_guid = s.ColumnString(14);
+  data->is_active = static_cast<TemplateURLData::ActiveStatus>(s.ColumnInt(23));
 
   data->alternate_urls.clear();
   absl::optional<base::Value> value(base::JSONReader::Read(s.ColumnString(15)));
@@ -510,7 +524,7 @@
   DCHECK(data.id);
   std::string query("INSERT INTO keywords (" + GetKeywordColumns() +
                     ") "
-                    "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+                    "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
   sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query.c_str()));
   BindURLToStatement(data, &s, 0, 1);
 
@@ -536,8 +550,8 @@
       "created_by_policy=?, last_modified=?, sync_guid=?, alternate_urls=?, "
       "image_url=?, search_url_post_params=?, suggest_url_post_params=?, "
       "image_url_post_params=?, new_tab_url=?, last_visited=?, "
-      "created_from_play_api=? WHERE id=?"));
-  BindURLToStatement(data, &s, 22, 0);  // "22" binds id() as the last item.
+      "created_from_play_api=?, is_active=? WHERE id=?"));
+  BindURLToStatement(data, &s, 23, 0);  // "23" binds id() as the last item.
 
   return s.Run();
 }
diff --git a/components/search_engines/keyword_table.h b/components/search_engines/keyword_table.h
index 94855eb..d564fcb 100644
--- a/components/search_engines/keyword_table.h
+++ b/components/search_engines/keyword_table.h
@@ -69,6 +69,8 @@
 //                          version 69.
 //   created_from_play_api  See TemplateURLData::created_from_play_api. This was
 //                          added in version 82.
+//   is_active              See TemplateURLData::is_active. This was added
+//                          in version 97.
 //
 // This class also manages some fields in the |meta| table:
 //
@@ -133,6 +135,7 @@
   bool MigrateToVersion76RemoveInstantColumns();
   bool MigrateToVersion77IncreaseTimePrecision();
   bool MigrateToVersion82AddCreatedFromPlayApiColumn();
+  bool MigrateToVersion97AddIsActiveColumn();
 
  private:
   friend class KeywordTableTest;
diff --git a/components/search_engines/keyword_table_unittest.cc b/components/search_engines/keyword_table_unittest.cc
index ef3f1dc..b2357062 100644
--- a/components/search_engines/keyword_table_unittest.cc
+++ b/components/search_engines/keyword_table_unittest.cc
@@ -138,6 +138,7 @@
             restored_keyword.created_from_play_api);
   EXPECT_EQ(keyword.usage_count, restored_keyword.usage_count);
   EXPECT_EQ(keyword.prepopulate_id, restored_keyword.prepopulate_id);
+  EXPECT_EQ(keyword.is_active, restored_keyword.is_active);
 
   RemoveKeyword(restored_keyword.id);
 
@@ -174,6 +175,7 @@
   EXPECT_EQ(keyword.prepopulate_id, restored_keyword.prepopulate_id);
   EXPECT_EQ(keyword.created_from_play_api,
             restored_keyword.created_from_play_api);
+  EXPECT_EQ(keyword.is_active, restored_keyword.is_active);
 }
 
 TEST_F(KeywordTableTest, KeywordWithNoFavicon) {
diff --git a/components/search_engines/template_url.h b/components/search_engines/template_url.h
index 6e03b40..9c681d8 100644
--- a/components/search_engines/template_url.h
+++ b/components/search_engines/template_url.h
@@ -723,6 +723,8 @@
 
   const std::string& sync_guid() const { return data_.sync_guid; }
 
+  TemplateURLData::ActiveStatus is_active() const { return data_.is_active; }
+
   const std::vector<TemplateURLRef>& url_refs() const { return url_refs_; }
   const TemplateURLRef& url_ref() const {
     // Sanity check for https://crbug.com/781703.
diff --git a/components/search_engines/template_url_data.h b/components/search_engines/template_url_data.h
index d9b842c..cb7a536 100644
--- a/components/search_engines/template_url_data.h
+++ b/components/search_engines/template_url_data.h
@@ -158,6 +158,17 @@
   // set as the "default search engine".
   bool preconnect_to_search_url = false;
 
+  enum class ActiveStatus {
+    kUnspecified = 0,  // The default value when a search engine is auto-added.
+    kTrue,             // Search engine is active.
+    kFalse,            // SE has been manually deactivated by a user.
+  };
+
+  // Whether this entry is "active". Active entries can be invoked by keyword
+  // via the omnibox.  Inactive search engines do nothing until they have been
+  // activated.  A search engine is inactive if it's unspecified or false.
+  ActiveStatus is_active{ActiveStatus::kUnspecified};
+
  private:
   // Private so we can enforce using the setters and thus enforce that these
   // fields are never empty.
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc
index 94d431d..36a5216d 100644
--- a/components/search_engines/template_url_service.cc
+++ b/components/search_engines/template_url_service.cc
@@ -646,6 +646,7 @@
   }
   data.safe_for_autoreplace = false;
   data.last_modified = clock_->Now();
+  data.is_active = TemplateURLData::ActiveStatus::kUnspecified;
   Update(url, TemplateURL(data));
 }
 
diff --git a/components/services/storage/public/cpp/filesystem/BUILD.gn b/components/services/storage/public/cpp/filesystem/BUILD.gn
index c40b88e..385bd88 100644
--- a/components/services/storage/public/cpp/filesystem/BUILD.gn
+++ b/components/services/storage/public/cpp/filesystem/BUILD.gn
@@ -6,7 +6,6 @@
   output_name = "storage_service_filesystem_support"
 
   public = [
-    "file_error_or.h",
     "filesystem_impl.h",
     "filesystem_proxy.h",
   ]
diff --git a/components/services/storage/public/cpp/filesystem/file_error_or.h b/components/services/storage/public/cpp/filesystem/file_error_or.h
deleted file mode 100644
index 4840f08..0000000
--- a/components/services/storage/public/cpp/filesystem/file_error_or.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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.
-
-#ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
-#define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
-
-#include <utility>
-
-#include "base/files/file.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-
-namespace storage {
-
-// Helper for methods which perform file system operations and which may fail.
-// Objects of this type can take on EITHER a base::File::Error value OR a result
-// value of arbitrary type.
-template <typename ValueType>
-class FileErrorOr {
- public:
-  explicit FileErrorOr() = default;
-  FileErrorOr(base::File::Error error) : error_(error) {}
-  FileErrorOr(ValueType&& value)
-      : maybe_value_(absl::in_place, std::move(value)) {}
-  FileErrorOr(const FileErrorOr&) = delete;
-  FileErrorOr(FileErrorOr&&) = default;
-  FileErrorOr& operator=(const FileErrorOr&) = delete;
-  FileErrorOr& operator=(FileErrorOr&&) = default;
-  ~FileErrorOr() = default;
-
-  bool is_error() const { return !maybe_value_.has_value(); }
-  base::File::Error error() const { return error_; }
-
-  ValueType& value() { return maybe_value_.value(); }
-  const ValueType& value() const { return maybe_value_.value(); }
-
-  ValueType* operator->() { return &maybe_value_.value(); }
-  const ValueType* operator->() const { return &maybe_value_.value(); }
-
- private:
-  base::File::Error error_ = base::File::FILE_ERROR_FAILED;
-  absl::optional<ValueType> maybe_value_;
-};
-
-}  // namespace storage
-
-#endif  // COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
index dbb0950..15a897b 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
@@ -115,7 +115,7 @@
                                 mojom::GetEntriesMode mode,
                                 GetEntriesCallback callback) {
   const base::FilePath full_path = MakeAbsolute(path);
-  FileErrorOr<std::vector<base::FilePath>> result =
+  base::FileErrorOr<std::vector<base::FilePath>> result =
       GetDirectoryEntries(full_path, mode);
   if (result.is_error()) {
     std::move(callback).Run(result.error(), std::vector<base::FilePath>());
@@ -255,7 +255,7 @@
 
 void FilesystemImpl::LockFile(const base::FilePath& path,
                               LockFileCallback callback) {
-  FileErrorOr<base::File> result = LockFileLocal(MakeAbsolute(path));
+  base::FileErrorOr<base::File> result = LockFileLocal(MakeAbsolute(path));
   if (result.is_error()) {
     std::move(callback).Run(result.error(), mojo::NullRemote());
     return;
@@ -277,7 +277,7 @@
 }
 
 // static
-FileErrorOr<base::File> FilesystemImpl::LockFileLocal(
+base::FileErrorOr<base::File> FilesystemImpl::LockFileLocal(
     const base::FilePath& path) {
   DCHECK(path.IsAbsolute());
   base::File file(path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
@@ -326,9 +326,9 @@
 }
 
 // static
-FileErrorOr<std::vector<base::FilePath>> FilesystemImpl::GetDirectoryEntries(
-    const base::FilePath& path,
-    mojom::GetEntriesMode mode) {
+base::FileErrorOr<std::vector<base::FilePath>>
+FilesystemImpl::GetDirectoryEntries(const base::FilePath& path,
+                                    mojom::GetEntriesMode mode) {
   DCHECK(path.IsAbsolute());
   int file_types = base::FileEnumerator::FILES;
   if (mode == mojom::GetEntriesMode::kFilesAndDirectories)
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.h b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
index 6e1d02e..37394d6 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_impl.h
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
@@ -8,9 +8,9 @@
 #include <vector>
 
 #include "base/component_export.h"
+#include "base/files/file_error_or.h"
 #include "base/files/file_path.h"
 #include "base/types/pass_key.h"
-#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
 #include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
 
 namespace storage {
@@ -76,7 +76,8 @@
 
   // Helper used by LockFile() and FilesystemProxy::LockFile() for in
   // unrestricted mode.
-  static FileErrorOr<base::File> LockFileLocal(const base::FilePath& path);
+  static base::FileErrorOr<base::File> LockFileLocal(
+      const base::FilePath& path);
   static void UnlockFileLocal(const base::FilePath& path);
 
   // Helper used by GetPathAccess() and FilesystemProxy::GetPathAccess.
@@ -84,7 +85,7 @@
       const base::FilePath& path);
 
   // Helper used by GetEntries() and FilesystemProxy::GetDirectoryEntries.
-  static FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
+  static base::FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
       const base::FilePath& path,
       mojom::GetEntriesMode mode);
 
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
index a259a057..53298373 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
@@ -105,9 +105,9 @@
   return exists;
 }
 
-FileErrorOr<std::vector<base::FilePath>> FilesystemProxy::GetDirectoryEntries(
-    const base::FilePath& path,
-    DirectoryEntryType type) {
+base::FileErrorOr<std::vector<base::FilePath>>
+FilesystemProxy::GetDirectoryEntries(const base::FilePath& path,
+                                     DirectoryEntryType type) {
   const mojom::GetEntriesMode mode =
       type == DirectoryEntryType::kFilesOnly
           ? mojom::GetEntriesMode::kFilesOnly
@@ -128,8 +128,9 @@
   return entries;
 }
 
-FileErrorOr<base::File> FilesystemProxy::OpenFile(const base::FilePath& path,
-                                                  int flags) {
+base::FileErrorOr<base::File> FilesystemProxy::OpenFile(
+    const base::FilePath& path,
+    int flags) {
   if (!remote_directory_) {
     base::File file(MaybeMakeAbsolute(path), flags);
     if (!file.IsValid())
@@ -306,11 +307,12 @@
   return error;
 }
 
-FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>>
+base::FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>>
 FilesystemProxy::LockFile(const base::FilePath& path) {
   if (!remote_directory_) {
     base::FilePath full_path = MaybeMakeAbsolute(path);
-    FileErrorOr<base::File> result = FilesystemImpl::LockFileLocal(full_path);
+    base::FileErrorOr<base::File> result =
+        FilesystemImpl::LockFileLocal(full_path);
     if (result.is_error())
       return result.error();
     std::unique_ptr<FileLock> lock = std::make_unique<LocalFileLockImpl>(
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.h b/components/services/storage/public/cpp/filesystem/filesystem_proxy.h
index fa86462f..7cf3f9f 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_proxy.h
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.h
@@ -9,11 +9,11 @@
 #include <vector>
 
 #include "base/component_export.h"
+#include "base/files/file_error_or.h"
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/types/pass_key.h"
-#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
 #include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/shared_remote.h"
@@ -80,14 +80,14 @@
     kFilesOnly,
     kFilesAndDirectories,
   };
-  FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
+  base::FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
       const base::FilePath& path,
       DirectoryEntryType type);
 
   // Opens a file at |path| with the given |flags|. If successful, the newly
   // opened file is returned. |flags| may be any bitwise union of
   // base::File::Flags values.
-  FileErrorOr<base::File> OpenFile(const base::FilePath& path, int flags);
+  base::FileErrorOr<base::File> OpenFile(const base::FilePath& path, int flags);
 
   // Writes a file atomically using the ImportantFileWriter.
   bool WriteFileAtomically(const base::FilePath& path,
@@ -139,7 +139,8 @@
     // no-op.
     virtual base::File::Error Release() = 0;
   };
-  FileErrorOr<std::unique_ptr<FileLock>> LockFile(const base::FilePath& path);
+  base::FileErrorOr<std::unique_ptr<FileLock>> LockFile(
+      const base::FilePath& path);
 
   // Sets the length of the given file to |length| bytes.
   bool SetOpenedFileLength(base::File* file, uint64_t length);
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
index 4a5010e..be7a234 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
@@ -8,13 +8,13 @@
 
 #include "base/check.h"
 #include "base/cxx17_backports.h"
+#include "base/files/file_error_or.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
 #include "base/test/task_environment.h"
-#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
 #include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
 #include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -23,6 +23,9 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+template <typename ValueType>
+using FileErrorOr = base::FileErrorOr<ValueType>;
+
 namespace storage {
 
 namespace {
diff --git a/components/services/storage/sandboxed_vfs_delegate.cc b/components/services/storage/sandboxed_vfs_delegate.cc
index c4f433a3..da2db79 100644
--- a/components/services/storage/sandboxed_vfs_delegate.cc
+++ b/components/services/storage/sandboxed_vfs_delegate.cc
@@ -8,8 +8,8 @@
 #include <utility>
 
 #include "base/files/file.h"
+#include "base/files/file_error_or.h"
 #include "base/files/file_path.h"
-#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
 #include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -23,7 +23,7 @@
 
 base::File SandboxedVfsDelegate::OpenFile(const base::FilePath& file_path,
                                           int sqlite_requested_flags) {
-  FileErrorOr<base::File> result = filesystem_->OpenFile(
+  base::FileErrorOr<base::File> result = filesystem_->OpenFile(
       file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
                      base::File::FLAG_WRITE);
   if (result.is_error())
diff --git a/components/soda/soda_installer.cc b/components/soda/soda_installer.cc
index 080773f..de28cd8 100644
--- a/components/soda/soda_installer.cc
+++ b/components/soda/soda_installer.cc
@@ -163,6 +163,23 @@
   NotifyOnSodaProgress(progress);
 }
 
+void SodaInstaller::NotifyOnSodaLanguagePackInstalledForTesting(
+    LanguageCode language_code) {
+  installed_languages_.insert(language_code);
+  auto it = language_pack_progress_.find(language_code);
+  if (it != language_pack_progress_.end())
+    language_pack_progress_.erase(language_code);
+  NotifyOnSodaLanguagePackInstalled(language_code);
+}
+
+void SodaInstaller::NotifyOnSodaLanguagePackErrorForTesting(
+    LanguageCode language_code) {
+  auto it = language_pack_progress_.find(language_code);
+  if (it != language_pack_progress_.end())
+    language_pack_progress_.erase(language_code);
+  NotifyOnSodaLanguagePackError(language_code);
+}
+
 void SodaInstaller::RegisterRegisteredLanguagePackPref(
     PrefRegistrySimple* registry) {
   // TODO: Default to one of the user's languages.
@@ -179,10 +196,8 @@
 
 void SodaInstaller::NotifyOnSodaLanguagePackInstalled(
     speech::LanguageCode language_code) {
-  if (base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
-    for (Observer& observer : observers_)
-      observer.OnSodaLanguagePackInstalled(language_code);
-  }
+  for (Observer& observer : observers_)
+    observer.OnSodaLanguagePackInstalled(language_code);
 }
 
 void SodaInstaller::NotifyOnSodaError() {
@@ -192,10 +207,8 @@
 
 void SodaInstaller::NotifyOnSodaLanguagePackError(
     speech::LanguageCode language_code) {
-  if (base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
-    for (Observer& observer : observers_)
-      observer.OnSodaLanguagePackError(language_code);
-  }
+  for (Observer& observer : observers_)
+    observer.OnSodaLanguagePackError(language_code);
 }
 
 void SodaInstaller::NotifyOnSodaProgress(int combined_progress) {
@@ -206,10 +219,8 @@
 void SodaInstaller::NotifyOnSodaLanguagePackProgress(
     int language_progress,
     LanguageCode language_code) {
-  if (base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) {
-    for (Observer& observer : observers_)
-      observer.OnSodaLanguagePackProgress(language_progress, language_code);
-  }
+  for (Observer& observer : observers_)
+    observer.OnSodaLanguagePackProgress(language_progress, language_code);
 }
 
 void SodaInstaller::RegisterLanguage(const std::string& language,
diff --git a/components/soda/soda_installer.h b/components/soda/soda_installer.h
index 08d106db..de9b72f 100644
--- a/components/soda/soda_installer.h
+++ b/components/soda/soda_installer.h
@@ -114,10 +114,14 @@
   // Method for checking in-progress downloads.
   bool IsSodaDownloading(speech::LanguageCode language_code) const;
 
+  // TODO(crbug.com/1237462): Consider creating a MockSodaInstaller class that
+  // implements these test-specific methods.
   void NotifySodaInstalledForTesting();
   void NotifySodaErrorForTesting();
   void UninstallSodaForTesting();
   void NotifySodaDownloadProgressForTesting(int percentage);
+  void NotifyOnSodaLanguagePackInstalledForTesting(LanguageCode language_code);
+  void NotifyOnSodaLanguagePackErrorForTesting(LanguageCode language_code);
 
  protected:
   // Registers the preference tracking the installed SODA language packs.
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index c7d42f2..8b84b8b 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -472,6 +472,7 @@
 <translation id="2596415276201385844">За установяване на сигурна връзка е необходимо часовникът ви да е верен. Това е така, защото сертификатите, с които уебсайтовете се идентифицират, са валидни само за конкретни периоди от време. Тъй като часовникът на устройството ви не е верен, Chrome не може да потвърди тези сертификати.</translation>
 <translation id="2597378329261239068">Този документ е защитен с парола.  Моля, въведете я.</translation>
 <translation id="2609632851001447353">Вариации</translation>
+<translation id="2610561535971892504">Кликнете, за да копирате</translation>
 <translation id="2618023639789766142">C10 (плик)</translation>
 <translation id="2625385379895617796">Часовникът ви е напред</translation>
 <translation id="262745152991669301">Може да поиска разрешение да се свързва с USB устройства</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb
index 0318ebc5..82ca9e2 100644
--- a/components/strings/components_strings_bs.xtb
+++ b/components/strings/components_strings_bs.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Za uspostavu sigurne veze sat mora biti točno postavljen. Razlog je tome što certifikati pomoću kojih se web-lokacije međusobno identificiraju vrijede samo određeno vrijeme. Budući da vaš sat nije točan, Chrome ne može potvrditi te certifikate.</translation>
 <translation id="2597378329261239068">Ovaj dokument je zaštićen lozinkom.  Unesite lozinku.</translation>
 <translation id="2609632851001447353">Varijacije</translation>
+<translation id="2610561535971892504">Klik za kopiranje</translation>
 <translation id="2618023639789766142">C10 (koverta)</translation>
 <translation id="2625385379895617796">Sat ide unaprijed</translation>
 <translation id="262745152991669301">Može tražiti da se poveže na USB uređaje</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index eeb0ae9..07182842 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -470,6 +470,7 @@
 <translation id="2596415276201385844">Per establir una connexió segura, el rellotge ha d'estar ben ajustat, perquè els certificats que els llocs web fan servir per identificar-se només són vàlids per a períodes de temps concrets. Com que el rellotge del dispositiu no està ben ajustat, Chrome no pot verificar aquests certificats.</translation>
 <translation id="2597378329261239068">Aquest document està protegit mitjançant contrasenya. Introduïu una contrasenya.</translation>
 <translation id="2609632851001447353">Variacions</translation>
+<translation id="2610561535971892504">Fes clic per copiar</translation>
 <translation id="2618023639789766142">C10 (sobre)</translation>
 <translation id="2625385379895617796">El rellotge està avançat</translation>
 <translation id="262745152991669301">Pot demanar permís per connectar-se a dispositius USB</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index e1c9964..8f54874 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -473,6 +473,7 @@
 <translation id="2596415276201385844">To establish a secure connection, your clock needs to be set correctly. This is because the certificates that websites use to identify themselves are only valid for specific periods of time. Since your device's clock is incorrect, Chrome cannot verify these certificates.</translation>
 <translation id="2597378329261239068">This document is password-protected.  Please enter a password.</translation>
 <translation id="2609632851001447353">Variations</translation>
+<translation id="2610561535971892504">Click to copy</translation>
 <translation id="2618023639789766142">C10 (Envelope)</translation>
 <translation id="2625385379895617796">Your clock is ahead</translation>
 <translation id="262745152991669301">Can ask to connect to USB devices</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 7e343ae..9e5c502 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -473,6 +473,7 @@
 <translation id="2596415276201385844">Turvalise ühenduse loomiseks peab kell olema õigesti seadistatud. See on nii, kuna sertifikaadid, mida veebisaidid kasutavad enda tuvastamiseks, kehtivad ainult teatud perioodi jooksul. Kuna teie seadme kell on vale, ei saa Chrome neid sertifikaate kinnitada.</translation>
 <translation id="2597378329261239068">Dokument on parooliga kaitstud. Sisestage parool.</translation>
 <translation id="2609632851001447353">Variatsioonid</translation>
+<translation id="2610561535971892504">Klõpsake kopeerimiseks</translation>
 <translation id="2618023639789766142">C10 (ümbrik)</translation>
 <translation id="2625385379895617796">Teie kell on ees</translation>
 <translation id="262745152991669301">Saab küsida luba USB-seadmetega ühenduse loomiseks</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb
index c21c6128..c435dd0 100644
--- a/components/strings/components_strings_gl.xtb
+++ b/components/strings/components_strings_gl.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">Pode pedirche permiso para detectar dispositivos Bluetooth próximos</translation>
 <translation id="1426410128494586442">Si</translation>
 <translation id="1428146450423315676">Amontoador 7</translation>
+<translation id="1428729058023778569">Estás a ver esta advertencia porque o sitio non é compatible con HTTPS. <ph name="BEGIN_LEARN_MORE_LINK" />Máis información<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">Imprimir</translation>
 <translation id="1436185428532214179">Pode pedirche permiso para editar ficheiros e cartafoles do teu dispositivo</translation>
 <translation id="1442386063175183758">Dobrez en ventá na parte dereita</translation>
@@ -648,6 +649,7 @@
 <translation id="3282497668470633863">Engadir o nome que aparece na tarxeta</translation>
 <translation id="3286372614333682499">vertical</translation>
 <translation id="3287510313208355388">Descargar a páxina cando estea en liña</translation>
+<translation id="3288238092761586174">Pode que <ph name="URL" /> teña que tomar outras medidas para verificar o pago</translation>
 <translation id="3293642807462928945">Máis información acerca da política de <ph name="POLICY_NAME" /></translation>
 <translation id="3295444047715739395">Consulta e xestiona os teus contrasinais na configuración de Chrome</translation>
 <translation id="3303855915957856445">Non se encontraron resultados da busca</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 13dd2346..c6185de 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Za uspostavu sigurne veze sat mora biti točno postavljen. Razlog je tome što certifikati pomoću kojih se web-lokacije međusobno identificiraju vrijede samo određeno vrijeme. Budući da vaš sat nije točan, Chrome ne može potvrditi te certifikate.</translation>
 <translation id="2597378329261239068">Ovaj je dokument zaštićen zaporkom. Unesite zaporku.</translation>
 <translation id="2609632851001447353">Varijacije</translation>
+<translation id="2610561535971892504">Klik za kopiranje</translation>
 <translation id="2618023639789766142">C10 (omotnica)</translation>
 <translation id="2625385379895617796">Sat ide unaprijed</translation>
 <translation id="262745152991669301">Može tražiti dopuštenje za povezivanje s USB uređajima</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index 93d43aa..857b10a 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">Կարող է հայցել մոտակա Bluetooth սարքերը հայտնաբերելու թույլտվություն</translation>
 <translation id="1426410128494586442">Այո</translation>
 <translation id="1428146450423315676">Շեղջիչ 7</translation>
+<translation id="1428729058023778569">Դուք տեսնում եք այս նախազգուշացումը, քանի որ կայքը չի աջակցում HTTPS-ը։ <ph name="BEGIN_LEARN_MORE_LINK" />Իմանալ ավելին<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">Տպում</translation>
 <translation id="1436185428532214179">Կարող է հայցել ձեր սարքի ֆայլերն ու պանակները փոփոխելու թույլտվություն</translation>
 <translation id="1442386063175183758">Աջ քառորդի ծալում</translation>
@@ -649,6 +650,7 @@
 <translation id="3282497668470633863">Ավելացրեք քարտապանի անունը</translation>
 <translation id="3286372614333682499">ուղղաձիգ</translation>
 <translation id="3287510313208355388">Ներբեռնել, երբ կապը վերականգնվի</translation>
+<translation id="3288238092761586174"><ph name="URL" /> կայքը կարող է լրացուցիչ քայլեր կատարել՝ ձեր վճարումը հաստատելու համար</translation>
 <translation id="3293642807462928945">Իմանալ ավելին <ph name="POLICY_NAME" /> կանոնի մասին</translation>
 <translation id="3295444047715739395">Դիտեք և կառավարեք ձեր գաղտնաբառերը Chrome-ի կարգավորումներում</translation>
 <translation id="3303855915957856445">Որոնման արդյունքներ չկան</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb
index fc56758f..53eed2d 100644
--- a/components/strings/components_strings_ka.xtb
+++ b/components/strings/components_strings_ka.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">შეუძლია ახლომდებარე Bluetooth-მოწყობილობების აღმოჩენის თხოვნა</translation>
 <translation id="1426410128494586442">დიახ</translation>
 <translation id="1428146450423315676">სტეკერი 7</translation>
+<translation id="1428729058023778569">ამ გაფრთხილებას ხედავთ იმიტომ, რომ ამ საიტის მიერ HTTPS მხარდაუჭერელია. <ph name="BEGIN_LEARN_MORE_LINK" />შეიტყვეთ მეტი<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">ბეჭდვა</translation>
 <translation id="1436185428532214179">შეუძლია თქვენს მოწყობილობაზე არსებული ფაილებისა და საქაღალდეების რედაქტირების თხოვნა</translation>
 <translation id="1442386063175183758">მარჯვნივ დაკეცვა ჭიშკრის ფორმით</translation>
@@ -645,6 +646,7 @@
 <translation id="3282497668470633863">ბარათზე სახელის დამატება</translation>
 <translation id="3286372614333682499">პორტრეტი</translation>
 <translation id="3287510313208355388">ჩამოტვირთვა ინტერნეტ-კავშირის აღდგენის შემდეგ</translation>
+<translation id="3288238092761586174"><ph name="URL" />, შესაძლოა, საჭიროებდეს დამატებითი ნაბიჯების გავლას გადახდის დასადასტურებლად</translation>
 <translation id="3293642807462928945">შეიტყვეთ მეტი „<ph name="POLICY_NAME" />“ წესების შესახებ</translation>
 <translation id="3295444047715739395">იხილეთ თქვენი პაროლები და მართეთ ისინი Chrome-ის პარამეტრებიდან</translation>
 <translation id="3303855915957856445">ძიების შედეგები ვერ მოიძებნა</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 1589a68..5dad787 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">Var pieprasīt atļauju noteikt tuvumā esošas Bluetooth ierīces</translation>
 <translation id="1426410128494586442">Jā</translation>
 <translation id="1428146450423315676">7. izvades vieta</translation>
+<translation id="1428729058023778569">Šis brīdinājums tiek rādīts, jo šajā vietnē netiek atbalstīts HTTPS. <ph name="BEGIN_LEARN_MORE_LINK" />Uzziniet vairāk<ph name="END_LEARN_MORE_LINK" />.</translation>
 <translation id="1430915738399379752">Drukāt</translation>
 <translation id="1436185428532214179">Var pieprasīt atļauju rediģēt failus un mapes jūsu ierīcē</translation>
 <translation id="1442386063175183758">Abpusējs locījums pa labi</translation>
@@ -649,6 +650,7 @@
 <translation id="3282497668470633863">Pievienot vārdu un uzvārdu uz kartes</translation>
 <translation id="3286372614333682499">portrets</translation>
 <translation id="3287510313208355388">Lejupielādēt, kad pieejama tiešsaiste</translation>
+<translation id="3288238092761586174">Iespējams, vietnē <ph name="URL" /> būs jāveic papildu darbības, lai apstiprinātu maksājumu.</translation>
 <translation id="3293642807462928945">Uzzināt vairāk par politiku <ph name="POLICY_NAME" /></translation>
 <translation id="3295444047715739395">Skatiet un pārvaldiet savas paroles Chrome iestatījumos.</translation>
 <translation id="3303855915957856445">Netika atrasts neviens meklēšanas rezultāts.</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index b6b516f..cfa8371a4 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -471,6 +471,7 @@
 <translation id="2596415276201385844">Als je een beveiligde verbinding tot stand wilt brengen, moet je klok juist zijn ingesteld. Dit moet omdat de certificaten die deze websites gebruiken om zichzelf te identificeren, slechts gedurende bepaalde perioden geldig zijn. Aangezien de klok van je apparaat niet goed is ingesteld, kan Chrome deze certificaten niet verifiëren.</translation>
 <translation id="2597378329261239068">Dit document is beveiligd met een wachtwoord. Geef een wachtwoord op.</translation>
 <translation id="2609632851001447353">Varianten</translation>
+<translation id="2610561535971892504">Klik om te kopiëren</translation>
 <translation id="2618023639789766142">C10 (envelop)</translation>
 <translation id="2625385379895617796">Je klok loopt voor</translation>
 <translation id="262745152991669301">Kan vragen of deze site verbinding mag maken met USB-apparaten</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 24f2cdf..119aa3a 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Pentru a stabili o conexiune securizată, ceasul trebuie să fie setat corect. Aceasta deoarece certificatele pe care site-urile le folosesc pentru a se identifica sunt valabile numai pentru anumite intervale de timp. Din moment ce ora de pe dispozitiv este incorectă, Chrome nu poate verifica aceste certificate.</translation>
 <translation id="2597378329261239068">Acest document este protejat cu parolă. Introdu o parolă.</translation>
 <translation id="2609632851001447353">Modificări</translation>
+<translation id="2610561535971892504">Dă clic pentru a copia</translation>
 <translation id="2618023639789766142">C10 (Plic)</translation>
 <translation id="2625385379895617796">Ora este setată în viitor</translation>
 <translation id="262745152991669301">Poate solicita permisiunea de a se conecta la dispozitive USB</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 4124f0a..2ed001e 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Če želite vzpostaviti varno povezavo, mora biti ura pravilno nastavljena. Potrdila, ki jih uporabljajo spletna mesta za prepoznavanje, namreč veljajo samo določen čas. Ker je ura sistema nepravilna, Chrome teh potrdil ne more preveriti.</translation>
 <translation id="2597378329261239068">Dokument je zaščiten z geslom. Vnesite geslo.</translation>
 <translation id="2609632851001447353">Različice</translation>
+<translation id="2610561535971892504">Kliknite za kopiranje</translation>
 <translation id="2618023639789766142">C10 (Envelope)</translation>
 <translation id="2625385379895617796">Ura prehiteva</translation>
 <translation id="262745152991669301">Lahko zahteva vzpostavitev povezave z napravami USB.</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb
index 259b772..03451a7 100644
--- a/components/strings/components_strings_sq.xtb
+++ b/components/strings/components_strings_sq.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">Mund të kërkojë të zbulojë pajisjet me Bluetooth në afërsi</translation>
 <translation id="1426410128494586442">Po</translation>
 <translation id="1428146450423315676">Stivuesi 7</translation>
+<translation id="1428729058023778569">Je duke e parë këtë paralajmërim pasi kjo faqe nuk mbështet HTTPS. <ph name="BEGIN_LEARN_MORE_LINK" />Mëso më shumë<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">Printo</translation>
 <translation id="1436185428532214179">Mund të kërkojë të modifikojë skedarët ose dosjet në pajisjen tënde</translation>
 <translation id="1442386063175183758">Palosje me dritare djathtas</translation>
@@ -648,6 +649,7 @@
 <translation id="3282497668470633863">Shto emrin në kartë</translation>
 <translation id="3286372614333682499">portret</translation>
 <translation id="3287510313208355388">Shkarko kur të jetë në linjë</translation>
+<translation id="3288238092761586174"><ph name="URL" /> mund të duhet të marrë hapa të mëtejshëm për të verifikuar pagesën tënde</translation>
 <translation id="3293642807462928945">Mëso më shumë për politikën <ph name="POLICY_NAME" /></translation>
 <translation id="3295444047715739395">Shiko dhe menaxho fjalëkalimet e tua te cilësimet e Chrome</translation>
 <translation id="3303855915957856445">Nuk u gjetën rezultate kërkimi</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb
index 49b4c822..d0ce959 100644
--- a/components/strings/components_strings_sr-Latn.xtb
+++ b/components/strings/components_strings_sr-Latn.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Da biste uspostavili bezbednu vezu, sat na uređaju mora da bude tačan. To je zato što sertifikati koje veb-sajtovi koriste za identifikaciju važe samo određeni vremenski period. Pošto sat na vašem uređaju nije tačan, Chrome ne može da verifikuje ove sertifikate.</translation>
 <translation id="2597378329261239068">Ovaj dokument je zaštićen lozinkom. Unesite lozinku.</translation>
 <translation id="2609632851001447353">Varijacije</translation>
+<translation id="2610561535971892504">Kliknite da biste kopirali</translation>
 <translation id="2618023639789766142">C10 (koverat)</translation>
 <translation id="2625385379895617796">Sat vam žuri</translation>
 <translation id="262745152991669301">Može da traži da se povezuje sa USB uređajima</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index 6fb892b..081f89d 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -474,6 +474,7 @@
 <translation id="2596415276201385844">Да бисте успоставили безбедну везу, сат на уређају мора да буде тачан. То је зато што сертификати које веб-сајтови користе за идентификацију важе само одређени временски период. Пошто сат на вашем уређају није тачан, Chrome не може да верификује ове сертификате.</translation>
 <translation id="2597378329261239068">Овај документ је заштићен лозинком. Унесите лозинку.</translation>
 <translation id="2609632851001447353">Варијације</translation>
+<translation id="2610561535971892504">Кликните да бисте копирали</translation>
 <translation id="2618023639789766142">C10 (коверат)</translation>
 <translation id="2625385379895617796">Сат вам жури</translation>
 <translation id="262745152991669301">Може да тражи да се повезује са USB уређајима</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index c5b84e1..fde4d40 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">Trang web có thể yêu cầu khám phá các thiết bị Bluetooth ở gần</translation>
 <translation id="1426410128494586442">Có</translation>
 <translation id="1428146450423315676">Khay xếp chồng 7</translation>
+<translation id="1428729058023778569">Cảnh báo này xuất hiện vì trang web mà bạn đang truy cập không hỗ trợ giao thức HTTPS. <ph name="BEGIN_LEARN_MORE_LINK" />Tìm hiểu thêm<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">In</translation>
 <translation id="1436185428532214179">Trang web có thể yêu cầu chỉnh sửa các tệp và thư mục trên thiết bị của bạn</translation>
 <translation id="1442386063175183758">Gấp dạng cửa bên phải</translation>
@@ -649,6 +650,7 @@
 <translation id="3282497668470633863">Thêm tên trên thẻ</translation>
 <translation id="3286372614333682499">dọc</translation>
 <translation id="3287510313208355388">Tải xuống khi trực tuyến</translation>
+<translation id="3288238092761586174"><ph name="URL" /> có thể cần thực hiện các bước bổ sung để xác minh khoản thanh toán của bạn</translation>
 <translation id="3293642807462928945">Hãy tìm hiểu thêm về chính sách <ph name="POLICY_NAME" /></translation>
 <translation id="3295444047715739395">Xem và quản lý mật khẩu của bạn trong phần cài đặt của Chrome</translation>
 <translation id="3303855915957856445">Không tìm thấy kết quả tìm kiếm nào</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index a58ac6a..b47b1efb 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -139,6 +139,7 @@
 <translation id="1422930527989633628">可以要求搜尋附近的藍牙裝置</translation>
 <translation id="1426410128494586442">是</translation>
 <translation id="1428146450423315676">堆疊出紙器 7</translation>
+<translation id="1428729058023778569">這個網站不支援 HTTPS,因此瀏覽器顯示這則警告訊息。<ph name="BEGIN_LEARN_MORE_LINK" />瞭解詳情<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="1430915738399379752">列印</translation>
 <translation id="1436185428532214179">可以要求編輯裝置上的檔案和資料夾</translation>
 <translation id="1442386063175183758">右半邊對折</translation>
@@ -645,6 +646,7 @@
 <translation id="3282497668470633863">新增持卡人姓名</translation>
 <translation id="3286372614333682499">肖像</translation>
 <translation id="3287510313208355388">等到可連線時再下載網頁內容</translation>
+<translation id="3288238092761586174"><ph name="URL" /> 可能需要採取其他步驟,才能驗證付款方式</translation>
 <translation id="3293642807462928945">進一步瞭解 <ph name="POLICY_NAME" /> 政策</translation>
 <translation id="3295444047715739395">在 Chrome 設定中查看和管理密碼</translation>
 <translation id="3303855915957856445">找不到相符的搜尋結果</translation>
diff --git a/components/test/components_test_suite.cc b/components/test/components_test_suite.cc
index e87fbd5..b7c5595 100644
--- a/components/test/components_test_suite.cc
+++ b/components/test/components_test_suite.cc
@@ -35,10 +35,6 @@
 #include "ui/gl/test/gl_surface_test_support.h"
 #endif
 
-#if defined(OS_WIN)
-#include "base/win/scoped_com_initializer.h"
-#endif
-
 namespace {
 
 // Not using kExtensionScheme and kChromeSearchScheme to avoid the dependency
@@ -110,10 +106,6 @@
     ui::ResourceBundle::CleanupSharedInstance();
     base::TestSuite::Shutdown();
   }
-
-#if defined(OS_WIN)
-  base::win::ScopedCOMInitializer com_initializer_;
-#endif
 };
 
 class ComponentsUnitTestEventListener : public testing::EmptyTestEventListener {
diff --git a/components/test/data/history/history.46.sql b/components/test/data/history/history.46.sql
new file mode 100644
index 0000000..59f39bf
--- /dev/null
+++ b/components/test/data/history/history.46.sql
@@ -0,0 +1,35 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
+INSERT INTO meta VALUES('mmap_status','-1');
+INSERT INTO meta VALUES('version','47');
+INSERT INTO meta VALUES('last_compatible_version','16');
+CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL);
+CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration INTEGER DEFAULT 0 NOT NULL,incremented_omnibox_typed_score BOOLEAN DEFAULT FALSE NOT NULL,publicly_routable BOOLEAN DEFAULT FALSE NOT NULL);
+CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL);
+CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,term LONGVARCHAR NOT NULL,normalized_term LONGVARCHAR NOT NULL);
+CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER NOT NULL,last_access_time INTEGER NOT NULL,transient INTEGER NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type VARCHAR(255) NOT NULL);
+CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, chain_index) );
+CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset INTEGER NOT NULL,received_bytes INTEGER NOT NULL,finished INTEGER NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) );
+CREATE TABLE downloads_reroute_info (download_id INTEGER NOT NULL,reroute_info_serialized  VARCHAR NOT NULL,PRIMARY KEY (download_id) );
+CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL);
+CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL);
+CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY KEY NOT NULL,value BLOB);
+CREATE TABLE content_annotations(visit_id INTEGER PRIMARY KEY,floc_protected_score NUMERIC,categories VARCHAR,page_topics_model_version INTEGER,annotation_flags INTEGER NOT NULL,entities VARCHAR);
+CREATE TABLE context_annotations(visit_id INTEGER PRIMARY KEY,context_annotation_flags INTEGER NOT NULL,duration_since_last_visit INTEGER,page_end_reason INTEGER);
+CREATE TABLE clusters(cluster_id INTEGER PRIMARY KEY,score NUMERIC NOT NULL);
+CREATE TABLE clusters_and_visits(cluster_id INTEGER NOT NULL,visit_id INTEGER NOT NULL,score NUMERIC NOT NULL,PRIMARY KEY(cluster_id,visit_id))WITHOUT ROWID;
+DELETE FROM sqlite_sequence;
+CREATE INDEX visits_url_index ON visits (url);
+CREATE INDEX visits_from_index ON visits (from_visit);
+CREATE INDEX visits_time_index ON visits (visit_time);
+CREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, normalized_term);
+CREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id);
+CREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term);
+CREATE INDEX segments_name ON segments(name);
+CREATE INDEX segments_url_id ON segments(url_id);
+CREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id);
+CREATE INDEX segments_usage_seg_id ON segment_usage(segment_id);
+CREATE INDEX clusters_for_visit ON clusters_and_visits(visit_id);
+CREATE INDEX urls_url_index ON urls (url);
+COMMIT;
diff --git a/components/test/data/web_database/version_96.sql b/components/test/data/web_database/version_96.sql
new file mode 100644
index 0000000..73c8bcc
--- /dev/null
+++ b/components/test/data/web_database/version_96.sql
@@ -0,0 +1,32 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
+INSERT INTO meta VALUES('mmap_status','-1');
+INSERT INTO meta VALUES('version','93');
+INSERT INTO meta VALUES('last_compatible_version','83');
+INSERT INTO meta VALUES('Builtin Keyword Version','117');
+CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB);
+CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0,last_modified INTEGER DEFAULT 0,sync_guid VARCHAR,alternate_urls VARCHAR,image_url VARCHAR,search_url_post_params VARCHAR,suggest_url_post_params VARCHAR,image_url_post_params VARCHAR,new_tab_url VARCHAR,last_visited INTEGER DEFAULT 0, created_from_play_api INTEGER DEFAULT 0);
+CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, date_created INTEGER DEFAULT 0, date_last_used INTEGER DEFAULT 0, count INTEGER DEFAULT 1, PRIMARY KEY (name, value));
+CREATE TABLE credit_cards ( guid VARCHAR PRIMARY KEY, name_on_card VARCHAR, expiration_month INTEGER, expiration_year INTEGER, card_number_encrypted BLOB, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR, nickname VARCHAR);
+CREATE TABLE autofill_profiles ( guid VARCHAR PRIMARY KEY, company_name VARCHAR, street_address VARCHAR, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zipcode VARCHAR, sorting_code VARCHAR, country_code VARCHAR, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', language_code VARCHAR, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, validity_bitfield UNSIGNED NOT NULL DEFAULT 0, is_client_validity_states_updated BOOL NOT NULL DEFAULT FALSE, label VARCHAR);
+CREATE TABLE autofill_profile_names ( guid VARCHAR, first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR, full_name VARCHAR, honorific_prefix VARCHAR, first_last_name VARCHAR, conjunction_last_name VARCHAR, second_last_name VARCHAR, honorific_prefix_status INTEGER DEFAULT 0, first_name_status INTEGER DEFAULT 0, middle_name_status INTEGER DEFAULT 0, last_name_status INTEGER DEFAULT 0, first_last_name_status INTEGER DEFAULT 0, conjunction_last_name_status INTEGER DEFAULT 0, second_last_name_status INTEGER DEFAULT 0, full_name_status INTEGER DEFAULT 0, full_name_with_honorific_prefix VARCHAR, full_name_with_honorific_prefix_status INTEGER DEFAULT 0);
+INSERT INTO "autofill_profile_names" VALUES('B41FE6E0-B13E-2A2A-BF0B-29FCE2C3ADBD','Jon','','Smith', 'Jon Smith', 'Sir', 'Smith', 'Notsmith', 'Moresmith', 0, 0, 0, 0, 0, 0, 0, 0, 'Sir Jon Smith', 0);
+CREATE TABLE autofill_profile_addresses ( guid VARCHAR, street_address VARCHAR, street_name VARCHAR, dependent_street_name VARCHAR, house_number VARCHAR, subpremise VARCHAR, premise_name VARCHAR, street_address_status INTEGER DEFAULT 0, street_name_status INTEGER DEFAULT 0, dependent_street_name_status INTEGER DEFAULT 0, house_number_status INTEGER DEFAULT 0, subpremise_status INTEGER DEFAULT 0, premise_name_status INTEGER DEFAULT 0, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zip_code VARCHAR, sorting_code VARCHAR, country_code VARCHAR, dependent_locality_status INTEGER DEFAULT 0, city_status INTEGER DEFAULT 0, state_status INTEGER DEFAULT 0, zip_code_status INTEGER DEFAULT 0, sorting_code_status INTEGER DEFAULT 0, country_code_status INTEGER DEFAULT 0, apartment_number VARCHAR, floor VARCHAR, apartment_number_status INTEGER DEFAULT 0, floor_status INTEGER DEFAULT 0);
+CREATE TABLE autofill_profile_emails ( guid VARCHAR, email VARCHAR);
+CREATE TABLE autofill_profile_phones ( guid VARCHAR, number VARCHAR);
+CREATE TABLE autofill_profiles_trash ( guid VARCHAR);
+CREATE TABLE masked_credit_cards (id VARCHAR,status VARCHAR,name_on_card VARCHAR,network VARCHAR,last_four VARCHAR,exp_month INTEGER DEFAULT 0,exp_year INTEGER DEFAULT 0, bank_name VARCHAR, nickname VARCHAR, card_issuer INTEGER DEFAULT 0, instrument_id INTEGER DEFAULT 0);
+CREATE TABLE unmasked_credit_cards (id VARCHAR,card_number_encrypted VARCHAR,unmask_date INTEGER NOT NULL DEFAULT 0);
+CREATE TABLE server_card_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR);
+CREATE TABLE server_addresses (id VARCHAR,company_name VARCHAR,street_address VARCHAR,address_1 VARCHAR,address_2 VARCHAR,address_3 VARCHAR,address_4 VARCHAR,postal_code VARCHAR,sorting_code VARCHAR,country_code VARCHAR,language_code VARCHAR, recipient_name VARCHAR, phone_number VARCHAR);
+CREATE TABLE server_address_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, has_converted BOOL NOT NULL DEFAULT FALSE);
+CREATE TABLE autofill_sync_metadata (model_type INTEGER NOT NULL, storage_key VARCHAR NOT NULL, value BLOB, PRIMARY KEY (model_type, storage_key));
+CREATE TABLE autofill_model_type_state (model_type INTEGER NOT NULL PRIMARY KEY, value BLOB);
+CREATE TABLE payments_customer_data (customer_id VARCHAR);
+CREATE TABLE payments_upi_vpa (vpa VARCHAR);
+CREATE TABLE server_card_cloud_token_data ( id VARCHAR, suffix VARCHAR, exp_month INTEGER DEFAULT 0, exp_year INTEGER DEFAULT 0, card_art_url VARCHAR, instrument_token VARCHAR);
+CREATE INDEX autofill_name ON autofill (name);
+CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);
+CREATE TABLE offer_data ( offer_id UNSIGNED LONG, offer_reward_amount VARCHAR, expiry UNSIGNED LONG, offer_details_url VARCHAR, merchant_domain VARCHAR, promo_code VARCHAR, value_prop_text VARCHAR, see_details_text VARCHAR, usage_instructions_text VARCHAR);
+COMMIT;
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
index 58b7cd4..db9e8cb 100644
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
@@ -595,6 +595,10 @@
   DoFetchFromURL(variations_server_url_, false);
 }
 
+const std::string& VariationsService::GetLatestSerialNumber() {
+  return field_trial_creator_.seed_store()->GetLatestSerialNumber();
+}
+
 bool VariationsService::DoFetchFromURL(const GURL& url, bool is_http_retry) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsFetchingEnabled());
@@ -635,12 +639,8 @@
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->url = url;
   resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
-  bool enable_deltas = false;
-  std::string serial_number =
-      field_trial_creator_.seed_store()->GetLatestSerialNumber();
-  if (!serial_number.empty() && !delta_error_since_last_success_) {
-    // Tell the server that delta-compressed seeds are supported.
-    enable_deltas = true;
+  std::string serial_number = GetLatestSerialNumber();
+  if (!serial_number.empty()) {
     // Get the seed only if its serial number doesn't match what we have.
     // If the fetch is an HTTP retry, encrypt the If-None-Match header.
     if (is_http_retry) {
@@ -651,6 +651,8 @@
     }
     resource_request->headers.SetHeader("If-None-Match", serial_number);
   }
+  const bool enable_deltas =
+      !serial_number.empty() && !delta_error_since_last_success_;
   // Tell the server that delta-compressed and gzipped seeds are supported.
   const char* supported_im = enable_deltas ? "x-bm,gzip" : "gzip";
   resource_request->headers.SetHeader("A-IM", supported_im);
diff --git a/components/variations/service/variations_service.h b/components/variations/service/variations_service.h
index 03de660eb..687018f 100644
--- a/components/variations/service/variations_service.h
+++ b/components/variations/service/variations_service.h
@@ -216,6 +216,9 @@
                         const std::string& osname_server_param_override);
 
  protected:
+  // Gets the serial number of the most recent Finch seed. Virtual for testing.
+  virtual const std::string& GetLatestSerialNumber();
+
   // Starts the fetching process once, where |OnURLFetchComplete| is called with
   // the response. This calls DoFetchToURL with the set url.
   virtual void DoActualFetch();
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc
index 3def6a6..4df303b3 100644
--- a/components/variations/service/variations_service_unittest.cc
+++ b/components/variations/service/variations_service_unittest.cc
@@ -138,6 +138,8 @@
                           UIStringOverrider()),
         intercepts_fetch_(true),
         fetch_attempted_(false),
+        latest_serial_number_(""),
+        seed_stores_succeed_(true),
         seed_stored_(false),
         delta_compressed_seed_(false),
         gzip_compressed_seed_(false) {
@@ -158,6 +160,10 @@
   void set_last_request_was_retry(bool was_retry) {
     set_last_request_was_http_retry(was_retry);
   }
+  void set_latest_serial_number(const std::string& serial_number) {
+    latest_serial_number_ = serial_number;
+  }
+  void set_seed_stores_succeed(bool value) { seed_stores_succeed_ = value; }
   bool fetch_attempted() const { return fetch_attempted_; }
   bool seed_stored() const { return seed_stored_; }
   const std::string& stored_country() const { return stored_country_; }
@@ -166,6 +172,10 @@
 
   bool CallMaybeRetryOverHTTP() { return CallMaybeRetryOverHTTPForTesting(); }
 
+  const std::string& GetLatestSerialNumber() override {
+    return latest_serial_number_;
+  }
+
   void DoActualFetch() override {
     if (intercepts_fetch_) {
       fetch_attempted_ = true;
@@ -197,7 +207,7 @@
     delta_compressed_seed_ = is_delta_compressed;
     gzip_compressed_seed_ = is_gzip_compressed;
     RecordSuccessfulFetch();
-    return true;
+    return seed_stores_succeed_;
   }
 
   std::unique_ptr<const base::FieldTrial::EntropyProvider>
@@ -218,6 +228,8 @@
   GURL interception_url_;
   bool intercepts_fetch_;
   bool fetch_attempted_;
+  std::string latest_serial_number_;
+  bool seed_stores_succeed_;
   bool seed_stored_;
   std::string stored_seed_data_;
   std::string stored_country_;
@@ -300,6 +312,24 @@
   return json;
 }
 
+// Adds an OK response to the test_url_loader_factory with IM headers.
+void AddOKResponseWithIM(
+    const GURL& interception_url,
+    const std::string& body,
+    const std::string& im,
+    network::TestURLLoaderFactory* test_url_loader_factory) {
+  std::string headers("HTTP/1.1 200 OK\n\n");
+  auto head = network::mojom::URLResponseHead::New();
+  head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
+      net::HttpUtil::AssembleRawHeaders(headers));
+  if (!im.empty())
+    head->headers->SetHeader("IM", im);
+  network::URLLoaderCompletionStatus status;
+  status.decoded_body_length = body.size();
+  test_url_loader_factory->AddResponse(interception_url, std::move(head), body,
+                                       status);
+}
+
 }  // namespace
 
 class VariationsServiceTest : public ::testing::Test {
@@ -529,6 +559,52 @@
   EXPECT_EQ("gzip", field);
 }
 
+TEST_F(VariationsServiceTest, RequestDeltaCompressedSeed) {
+  VariationsService::EnableFetchForTesting();
+
+  std::string serialized_seed = SerializeSeed(CreateTestSeed());
+
+  TestVariationsService service(
+      std::make_unique<web_resource::TestRequestAllowedNotifier>(
+          &prefs_, network_tracker_),
+      &prefs_, GetMetricsStateManager(), true);
+  service.set_intercepts_fetch(false);
+  net::HttpRequestHeaders intercepted_headers;
+  service.test_url_loader_factory()->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        intercepted_headers = request.headers;
+      }));
+
+  // Set a serial number to allow delta compression.
+  service.set_latest_serial_number("abc");
+
+  // Prepare a delta response that fails to store.
+  service.set_seed_stores_succeed(false);
+  AddOKResponseWithIM(service.interception_url(), serialized_seed, "x-bm",
+                      service.test_url_loader_factory());
+  service.DoActualFetch();
+
+  // Make sure the initial request was generated with correct delta headers.
+  std::string field;
+  ASSERT_TRUE(intercepted_headers.GetHeader("A-IM", &field));
+  EXPECT_EQ("x-bm,gzip", field);
+  ASSERT_TRUE(intercepted_headers.GetHeader("If-None-Match", &field));
+  EXPECT_EQ("abc", field);
+
+  // Do a retry.
+  service.set_seed_stores_succeed(true);
+  AddOKResponseWithIM(service.interception_url(), serialized_seed, "",
+                      service.test_url_loader_factory());
+  service.DoActualFetch();
+
+  // The retry request should not request delta compression.
+  ASSERT_TRUE(intercepted_headers.GetHeader("A-IM", &field));
+  EXPECT_EQ("gzip", field);
+  // It should still provide the serial number.
+  ASSERT_TRUE(intercepted_headers.GetHeader("If-None-Match", &field));
+  EXPECT_EQ("abc", field);
+}
+
 TEST_F(VariationsServiceTest, InstanceManipulations) {
   struct  {
     std::string im;
@@ -554,16 +630,8 @@
         &prefs_, GetMetricsStateManager(), true);
     service.set_intercepts_fetch(false);
 
-    std::string headers("HTTP/1.1 200 OK\n\n");
-    auto head = network::mojom::URLResponseHead::New();
-    head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
-        net::HttpUtil::AssembleRawHeaders(headers));
-    if (!cases[i].im.empty())
-      head->headers->SetHeader("IM", cases[i].im);
-    network::URLLoaderCompletionStatus status;
-    status.decoded_body_length = serialized_seed.size();
-    service.test_url_loader_factory()->AddResponse(
-        service.interception_url(), std::move(head), serialized_seed, status);
+    AddOKResponseWithIM(service.interception_url(), serialized_seed,
+                        cases[i].im, service.test_url_loader_factory());
 
     service.DoActualFetch();
 
diff --git a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
index 748a91b..e0b8450 100644
--- a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
+++ b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
@@ -149,6 +149,8 @@
   void RegisterDCOMPSurfaceHandle(
       mojo::PlatformHandle surface_handle,
       RegisterDCOMPSurfaceHandleCallback callback) override {}
+  void UnregisterDCOMPSurfaceHandle(
+      const base::UnguessableToken& token) override {}
 #endif
 
   void CreateVideoEncodeAcceleratorProvider(
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 7c3502f3..b66d34cd 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -7,6 +7,7 @@
 
 #include "base/atomic_sequence_num.h"
 #include "base/bind.h"
+#include "base/bind_post_task.h"
 #include "base/callback_helpers.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
@@ -580,6 +581,9 @@
     }
   }
 
+  for (auto& callback : release_on_gpu_callbacks_)
+    std::move(*callback).Run(gpu::SyncToken(), /*is_lost=*/true);
+
   // |output_device_| may still need |shared_image_factory_|, so release it
   // first.
   output_device_.reset();
@@ -832,15 +836,6 @@
   }
 }
 
-static void PostTaskFromMainToImplThread(
-    scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
-    ReleaseCallback callback,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  impl_task_runner->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), sync_token, is_lost));
-}
-
 void SkiaOutputSurfaceImplOnGpu::CopyOutput(
     AggregatedRenderPassId id,
     copy_output::RenderPassGeometry geometry,
@@ -1052,16 +1047,20 @@
       DLOG(ERROR) << "dest_surface->flush() failed.";
       return;
     }
-    auto release_callback = base::BindOnce(
-        &SkiaOutputSurfaceImplOnGpu::DestroySharedImageOnImplThread,
+
+    auto gpu_callback = std::make_unique<ReleaseCallback>(base::BindOnce(
+        &SkiaOutputSurfaceImplOnGpu::DestroyCopyOutputResourcesOnGpuThread,
         weak_ptr_factory_.GetWeakPtr(), std::move(representation),
-        context_state_);
-    auto main_callback = base::BindOnce(&PostTaskFromMainToImplThread,
-                                        base::ThreadTaskRunnerHandle::Get(),
-                                        std::move(release_callback));
+        context_state_));
+    release_on_gpu_callbacks_.push_back(std::move(gpu_callback));
+    auto run_gpu_callback = base::BindOnce(
+        &SkiaOutputSurfaceImplOnGpu::RunDestroyCopyOutputResourcesOnGpuThread,
+        weak_ptr_factory_.GetWeakPtr(), release_on_gpu_callbacks_.back().get());
+    auto viz_callback = base::BindPostTask(base::ThreadTaskRunnerHandle::Get(),
+                                           std::move(run_gpu_callback));
 
     CopyOutputResult::ReleaseCallbacks release_callbacks;
-    release_callbacks.push_back(std::move(main_callback));
+    release_callbacks.push_back(std::move(viz_callback));
 
     request->SendResult(std::make_unique<CopyOutputTextureResult>(
         geometry.result_bounds,
@@ -1090,7 +1089,22 @@
   ScheduleCheckReadbackCompletion();
 }
 
-void SkiaOutputSurfaceImplOnGpu::DestroySharedImageOnImplThread(
+void SkiaOutputSurfaceImplOnGpu::RunDestroyCopyOutputResourcesOnGpuThread(
+    ReleaseCallback* callback,
+    const gpu::SyncToken& sync_token,
+    bool is_lost) {
+  for (size_t i = 0; i < release_on_gpu_callbacks_.size(); ++i) {
+    if (release_on_gpu_callbacks_[i].get() == callback) {
+      std::move(*release_on_gpu_callbacks_[i]).Run(sync_token, is_lost);
+      release_on_gpu_callbacks_.erase(release_on_gpu_callbacks_.begin() + i);
+      return;
+    }
+  }
+  NOTREACHED() << "The Callback returned by GetDeleteCallback() was called "
+               << "more than once.";
+}
+
+void SkiaOutputSurfaceImplOnGpu::DestroyCopyOutputResourcesOnGpuThread(
     std::unique_ptr<gpu::SharedImageRepresentationSkia> representation,
     scoped_refptr<gpu::SharedContextState> context_state,
     const gpu::SyncToken& sync_token,
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
index 2eea042..43fec75 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -16,6 +16,7 @@
 #include "components/viz/common/display/renderer_settings.h"
 #include "components/viz/common/gpu/context_lost_reason.h"
 #include "components/viz/common/quads/compositor_render_pass.h"
+#include "components/viz/common/resources/release_callback.h"
 #include "components/viz/service/display/external_use_client.h"
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display/output_surface_frame.h"
@@ -245,7 +246,12 @@
 
   void MarkContextLost(ContextLostReason reason);
 
-  void DestroySharedImageOnImplThread(
+  void RunDestroyCopyOutputResourcesOnGpuThread(
+      ReleaseCallback* callback,
+      const gpu::SyncToken& sync_token,
+      bool is_lost);
+
+  void DestroyCopyOutputResourcesOnGpuThread(
       std::unique_ptr<gpu::SharedImageRepresentationSkia> representation,
       scoped_refptr<gpu::SharedContextState> context_state,
       const gpu::SyncToken& sync_token,
@@ -315,6 +321,14 @@
   ContextLostCallback context_lost_callback_;
   GpuVSyncCallback gpu_vsync_callback_;
 
+  // ImplOnGpu::CopyOutput can create SharedImages via ImplOnGpu's
+  // SharedImageFactory. Clients can use these images via CopyOutputResult and
+  // when done, release the resources by invoking the provided callback. If
+  // ImplOnGpu is already destroyed, however, there is no way of running the
+  // release callback from the client, so this vector holds all pending release
+  // callbacks so resources can still be cleaned up in the dtor.
+  std::vector<std::unique_ptr<ReleaseCallback>> release_on_gpu_callbacks_;
+
 #if defined(USE_OZONE)
   // This should outlive gl_surface_ and vulkan_surface_.
   std::unique_ptr<ui::PlatformWindowSurface> window_surface_;
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc
index c2a92df..f4c4eaf 100644
--- a/components/viz/service/gl/gpu_service_impl.cc
+++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -766,6 +766,11 @@
           surface_handle.TakeHandle());
   std::move(callback).Run(token);
 }
+
+void GpuServiceImpl::UnregisterDCOMPSurfaceHandle(
+    const base::UnguessableToken& token) {
+  gl::DCOMPSurfaceRegistry::GetInstance()->UnregisterDCOMPSurfaceHandle(token);
+}
 #endif  // defined(OS_WIN)
 
 void GpuServiceImpl::CreateVideoEncodeAcceleratorProvider(
diff --git a/components/viz/service/gl/gpu_service_impl.h b/components/viz/service/gl/gpu_service_impl.h
index 953de08..e075735 100644
--- a/components/viz/service/gl/gpu_service_impl.h
+++ b/components/viz/service/gl/gpu_service_impl.h
@@ -156,6 +156,8 @@
   void RegisterDCOMPSurfaceHandle(
       mojo::PlatformHandle surface_handle,
       RegisterDCOMPSurfaceHandleCallback callback) override;
+  void UnregisterDCOMPSurfaceHandle(
+      const base::UnguessableToken& token) override;
 #endif  // defined(OS_WIN)
 
   void CreateVideoEncodeAcceleratorProvider(
diff --git a/components/webdata/common/BUILD.gn b/components/webdata/common/BUILD.gn
index f0cbb93..67af92e 100644
--- a/components/webdata/common/BUILD.gn
+++ b/components/webdata/common/BUILD.gn
@@ -84,6 +84,7 @@
     "//components/test/data/web_database/version_93.sql",
     "//components/test/data/web_database/version_94.sql",
     "//components/test/data/web_database/version_95.sql",
+    "//components/test/data/web_database/version_96.sql",
   ]
   outputs = [ "{{bundle_resources_dir}}/" +
               "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/components/webdata/common/web_database.cc b/components/webdata/common/web_database.cc
index 09fd36d..8b1f190 100644
--- a/components/webdata/common/web_database.cc
+++ b/components/webdata/common/web_database.cc
@@ -13,7 +13,7 @@
 // corresponding changes must happen in the unit tests, and new migration test
 // added.  See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|.
 // static
-const int WebDatabase::kCurrentVersionNumber = 96;
+const int WebDatabase::kCurrentVersionNumber = 97;
 
 const int WebDatabase::kDeprecatedVersionNumber = 51;
 
diff --git a/components/webdata/common/web_database_migration_unittest.cc b/components/webdata/common/web_database_migration_unittest.cc
index 7d27357..49ac5cf 100644
--- a/components/webdata/common/web_database_migration_unittest.cc
+++ b/components/webdata/common/web_database_migration_unittest.cc
@@ -124,7 +124,7 @@
   DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
 };
 
-const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 96;
+const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 97;
 
 void WebDatabaseMigrationTest::LoadDatabase(
     const base::FilePath::StringType& file) {
@@ -2159,3 +2159,34 @@
         "autofill_profile", "disallow_settings_visible_updates"));
   }
 }
+
+// Tests addition of is_active column in keywords table.
+TEST_F(WebDatabaseMigrationTest, MigrateVersion96ToCurrent) {
+  ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_96.sql")));
+
+  // Verify pre-conditions.
+  {
+    sql::Database connection;
+    ASSERT_TRUE(connection.Open(GetDatabasePath()));
+    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
+
+    sql::MetaTable meta_table;
+    ASSERT_TRUE(meta_table.Init(&connection, 96, 83));
+
+    EXPECT_FALSE(connection.DoesColumnExist("keywords", "is_active"));
+  }
+
+  DoMigration();
+
+  // Verify post-conditions.
+  {
+    sql::Database connection;
+    ASSERT_TRUE(connection.Open(GetDatabasePath()));
+    ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
+
+    // Check version.
+    EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
+
+    EXPECT_TRUE(connection.DoesColumnExist("keywords", "is_active"));
+  }
+}
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 7c5fe6d..6b5ecc1 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -701,6 +701,7 @@
     "conversions/conversion_storage_sql_migrations.h",
     "conversions/rate_limit_table.cc",
     "conversions/rate_limit_table.h",
+    "conversions/sent_report_info.cc",
     "conversions/sent_report_info.h",
     "conversions/sql_utils.cc",
     "conversions/sql_utils.h",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
index cc78b48..6d3ddaf4 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm
+++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -191,14 +191,15 @@
     const LineIndexer* line_indexer,
     base::Value* dict) const {
   BrowserAccessibility* platform_node =
-      [static_cast<BrowserAccessibilityCocoa*>(node) owner];
-  DCHECK(platform_node);
+      IsBrowserAccessibilityCocoa(node)
+          ? [static_cast<BrowserAccessibilityCocoa*>(node) owner]
+          : nullptr;
 
-  if (!ShouldDumpNode(*platform_node))
+  if (platform_node && !ShouldDumpNode(*platform_node))
     return;
 
   AddProperties(node, root_rect, line_indexer, dict);
-  if (!ShouldDumpChildren(*platform_node))
+  if (platform_node && !ShouldDumpChildren(*platform_node))
     return;
 
   NSArray* children = ChildrenOf(node);
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index f44c85d8..e775690 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -19,7 +19,9 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/common/render_accessibility.mojom.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "ui/accessibility/ax_language_detection.h"
 #include "ui/accessibility/ax_tree_data.h"
@@ -164,8 +166,10 @@
 
 BrowserAccessibilityManager::BrowserAccessibilityManager(
     BrowserAccessibilityDelegate* delegate)
-    : WebContentsObserver(delegate ? delegate->AccessibilityWebContents()
-                                   : nullptr),
+    : WebContentsObserver(delegate
+                              ? WebContents::FromRenderFrameHost(
+                                    delegate->AccessibilityRenderFrameHost())
+                              : nullptr),
       delegate_(delegate),
       user_is_navigating_away_(false),
       connected_to_parent_tree_node_(false),
@@ -180,8 +184,10 @@
 BrowserAccessibilityManager::BrowserAccessibilityManager(
     const ui::AXTreeUpdate& initial_tree,
     BrowserAccessibilityDelegate* delegate)
-    : WebContentsObserver(delegate ? delegate->AccessibilityWebContents()
-                                   : nullptr),
+    : WebContentsObserver(delegate
+                              ? WebContents::FromRenderFrameHost(
+                                    delegate->AccessibilityRenderFrameHost())
+                              : nullptr),
       delegate_(delegate),
       user_is_navigating_away_(false),
       ax_tree_id_(ui::AXTreeIDUnknown()),
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 570ccbf..41b6eae 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -52,6 +52,7 @@
 #elif defined(OS_MAC)
 class BrowserAccessibilityManagerMac;
 #endif
+class RenderFrameHostImpl;
 class WebContentsAccessibility;
 
 // To be called when a BrowserAccessibilityManager fires a generated event.
@@ -98,7 +99,7 @@
   virtual gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() = 0;
   virtual gfx::NativeViewAccessible
   AccessibilityGetNativeViewAccessibleForWindow() = 0;
-  virtual WebContents* AccessibilityWebContents() = 0;
+  virtual RenderFrameHostImpl* AccessibilityRenderFrameHost() = 0;
   virtual void AccessibilityHitTest(
       const gfx::Point& point_in_frame_pixels,
       ax::mojom::Event opt_event_to_fire,
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index a6b5a26a..91e7c04 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -14,6 +14,7 @@
 #include "base/time/time.h"
 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
 #import "content/browser/accessibility/browser_accessibility_mac.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
@@ -574,7 +575,10 @@
 bool BrowserAccessibilityManagerMac::IsChromeNewTabPage() {
   if (!delegate() || !IsRootTree())
     return false;
-  content::WebContents* web_contents = delegate()->AccessibilityWebContents();
+  content::WebContents* web_contents = WebContents::FromRenderFrameHost(
+      delegate()->AccessibilityRenderFrameHost());
+  if (!web_contents)
+    return false;
   const GURL& url = web_contents->GetVisibleURL();
   return url == GURL("chrome://newtab/") ||
          url == GURL("chrome://new-tab-page") ||
diff --git a/content/browser/accessibility/test_browser_accessibility_delegate.cc b/content/browser/accessibility/test_browser_accessibility_delegate.cc
index 402f1577..6c8b894 100644
--- a/content/browser/accessibility/test_browser_accessibility_delegate.cc
+++ b/content/browser/accessibility/test_browser_accessibility_delegate.cc
@@ -47,7 +47,8 @@
   return nullptr;
 }
 
-WebContents* TestBrowserAccessibilityDelegate::AccessibilityWebContents() {
+RenderFrameHostImpl*
+TestBrowserAccessibilityDelegate::AccessibilityRenderFrameHost() {
   return nullptr;
 }
 
diff --git a/content/browser/accessibility/test_browser_accessibility_delegate.h b/content/browser/accessibility/test_browser_accessibility_delegate.h
index 51b6911..a63cc452 100644
--- a/content/browser/accessibility/test_browser_accessibility_delegate.h
+++ b/content/browser/accessibility/test_browser_accessibility_delegate.h
@@ -23,7 +23,7 @@
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
       override;
-  WebContents* AccessibilityWebContents() override;
+  RenderFrameHostImpl* AccessibilityRenderFrameHost() override;
   bool AccessibilityIsMainFrame() override;
   void AccessibilityHitTest(
       const gfx::Point& point_in_frame_pixels,
diff --git a/content/browser/conversions/conversion_internals_browsertest.cc b/content/browser/conversions/conversion_internals_browsertest.cc
index bdbe7b7..06b047c6 100644
--- a/content/browser/conversions/conversion_internals_browsertest.cc
+++ b/content/browser/conversions/conversion_internals_browsertest.cc
@@ -257,14 +257,19 @@
   EXPECT_TRUE(NavigateToURL(shell(), GURL(kConversionInternalsUrl)));
 
   TestConversionManager manager;
-  manager.SetSentReportsForWebUI({
-      {.report_url = GURL("https://example.com/1"),
-       .report_body = "a",
-       .http_response_code = 200},
-      {.report_url = GURL("https://example.com/2"),
-       .report_body = "b",
-       .http_response_code = 404},
-  });
+  manager.SetSentReportsForWebUI(
+      {SentReportInfo(/*conversion_id=*/0,
+                      /*original_report_time=*/base::Time(),
+                      /*report_url=*/GURL("https://example.com/1"),
+                      /*report_body=*/"a",
+                      /*http_response_code=*/200,
+                      /*should_retry*/ false),
+       SentReportInfo(/*conversion_id=*/0,
+                      /*original_report_time=*/base::Time(),
+                      /*report_url=*/GURL("https://example.com/2"),
+                      /*report_body=*/"b",
+                      /*http_response_code=*/404,
+                      /*should_retry*/ false)});
   OverrideWebUIConversionManager(&manager);
 
   std::string wait_script = R"(
diff --git a/content/browser/conversions/conversion_manager_impl.cc b/content/browser/conversions/conversion_manager_impl.cc
index b0f3264..668861b 100644
--- a/content/browser/conversions/conversion_manager_impl.cc
+++ b/content/browser/conversions/conversion_manager_impl.cc
@@ -60,6 +60,14 @@
   return false;
 }
 
+bool ShouldRetryReport(const ConversionPolicy& policy,
+                       base::Time now,
+                       const SentReportInfo& info) {
+  bool past_max_allowed_age =
+      (now - info.original_report_time) > policy.GetMaxReportAge();
+  return info.should_retry && !past_max_allowed_age;
+}
+
 }  // namespace
 
 const constexpr base::TimeDelta kConversionManagerQueueReportsInterval =
@@ -129,10 +137,9 @@
   // Once the database is loaded, get all reports that may have expired while
   // Chrome was not running and handle these specially. It is safe to post tasks
   // to the storage context as soon as it is created.
-  GetAndHandleReports(
-      base::BindOnce(&ConversionManagerImpl::HandleReportsExpiredAtStartup,
-                     weak_factory_.GetWeakPtr()),
-      clock_->Now() + kConversionManagerQueueReportsInterval);
+  GetAndHandleReports(base::BindOnce(&ConversionManagerImpl::QueueReports,
+                                     weak_factory_.GetWeakPtr()),
+                      clock_->Now() + kConversionManagerQueueReportsInterval);
 
   // Start a repeating timer that will fetch reports once every
   // |kConversionManagerQueueReportsInterval| and add them to |reporter_|.
@@ -231,6 +238,13 @@
 void ConversionManagerImpl::GetAndQueueReportsForNextInterval() {
   // Get all the reports that will be reported in the next interval and them to
   // the |reporter_|.
+  //
+  // TODO(https://crbug.com/1054127): Consider integrating a
+  // net::NetworkConnectionTracker to control when reports should be queued.
+  // This should limit the number of failed attempts. Its possible this could
+  // also be implemented in the sender layer to provide finer grained-control.
+  // Note that this will still require delaying reports once a network
+  // connection is available to ensure they are not temporally joinable.
   GetAndHandleReports(base::BindOnce(&ConversionManagerImpl::QueueReports,
                                      weak_factory_.GetWeakPtr()),
                       clock_->Now() + kConversionManagerQueueReportsInterval);
@@ -238,33 +252,29 @@
 
 void ConversionManagerImpl::QueueReports(
     std::vector<ConversionReport> reports) {
-  if (!reports.empty()) {
-    // |reporter_| is owned by |this|, so base::Unretained() is safe as the
-    // reporter and callbacks will be deleted first.
-    reporter_->AddReportsToQueue(
-        std::move(reports),
-        base::BindRepeating(&ConversionManagerImpl::OnReportSent,
-                            base::Unretained(this)));
-  }
-}
+  if (reports.empty())
+    return;
 
-void ConversionManagerImpl::HandleReportsExpiredAtStartup(
-    std::vector<ConversionReport> reports) {
-  // Add delay to all reports that expired while the browser was not running so
-  // they are not temporally join-able.
+  // Add delay to all reports that expired while the browser was not able to
+  // send reports (or not running) so they are not temporally joinable.
   base::Time current_time = clock_->Now();
   for (ConversionReport& report : reports) {
-    if (report.report_time > current_time)
+    if (report.report_time >= current_time)
       continue;
 
     base::Time updated_report_time =
-        conversion_policy_->GetReportTimeForExpiredReportAtStartup(
-            current_time);
+        conversion_policy_->GetReportTimeForReportPastSendTime(current_time);
 
-    report.extra_delay = updated_report_time - report.report_time;
+    report.original_report_time = report.report_time;
     report.report_time = updated_report_time;
   }
-  QueueReports(std::move(reports));
+
+  // |reporter_| is owned by |this|, so base::Unretained() is safe as the
+  // reporter and callbacks will be deleted first.
+  reporter_->AddReportsToQueue(
+      std::move(reports),
+      base::BindRepeating(&ConversionManagerImpl::OnReportSent,
+                          base::Unretained(this)));
 }
 
 void ConversionManagerImpl::HandleReportsSentFromWebUI(
@@ -293,34 +303,42 @@
                           base::Unretained(this), std::move(all_reports_sent)));
 }
 
-void ConversionManagerImpl::MaybeStoreSentReportInfo(
-    absl::optional<SentReportInfo> info) {
-  if (info.has_value()) {
-    while (sent_reports_.size() >= max_sent_reports_to_store_)
-      sent_reports_.pop_front();
-    sent_reports_.push_back(std::move(*info));
-  }
+void ConversionManagerImpl::MaybeStoreSentReportInfo(SentReportInfo info) {
+  if (info.report_url.is_empty())
+    return;
+
+  while (sent_reports_.size() >= max_sent_reports_to_store_)
+    sent_reports_.pop_front();
+  sent_reports_.push_back(std::move(info));
 }
 
-void ConversionManagerImpl::OnReportSent(int64_t conversion_id,
-                                         absl::optional<SentReportInfo> info) {
-  conversion_storage_.AsyncCall(&ConversionStorage::DeleteConversion)
-      .WithArgs(conversion_id)
-      .Then(base::DoNothing::Once<bool>());
+void ConversionManagerImpl::OnReportSent(SentReportInfo info) {
+  // Reports that should be retried are not deleted.
+  if (!ShouldRetryReport(*conversion_policy_, clock_->Now(), info)) {
+    conversion_storage_.AsyncCall(&ConversionStorage::DeleteConversion)
+        .WithArgs(info.conversion_id)
+        .Then(base::DoNothing::Once<bool>());
+  }
   MaybeStoreSentReportInfo(std::move(info));
 }
 
 void ConversionManagerImpl::OnReportSentFromWebUI(
     base::OnceClosure reports_sent_barrier,
-    int64_t conversion_id,
-    absl::optional<SentReportInfo> info) {
+    SentReportInfo info) {
   // |reports_sent_barrier| is a OnceClosure view of a RepeatingClosure obtained
   // by base::BarrierClosure().
-  conversion_storage_.AsyncCall(&ConversionStorage::DeleteConversion)
-      .WithArgs(conversion_id)
-      .Then(base::BindOnce([](base::OnceClosure callback,
-                              bool result) { std::move(callback).Run(); },
-                           std::move(reports_sent_barrier)));
+
+  // Reports that should be retried are not deleted.
+  if (!ShouldRetryReport(*conversion_policy_, clock_->Now(), info)) {
+    conversion_storage_.AsyncCall(&ConversionStorage::DeleteConversion)
+        .WithArgs(info.conversion_id)
+        .Then(base::BindOnce([](base::OnceClosure callback,
+                                bool result) { std::move(callback).Run(); },
+                             std::move(reports_sent_barrier)));
+  } else {
+    std::move(reports_sent_barrier).Run();
+  }
+
   MaybeStoreSentReportInfo(std::move(info));
 }
 
diff --git a/content/browser/conversions/conversion_manager_impl.h b/content/browser/conversions/conversion_manager_impl.h
index 83e3335..0f35b55f 100644
--- a/content/browser/conversions/conversion_manager_impl.h
+++ b/content/browser/conversions/conversion_manager_impl.h
@@ -65,12 +65,11 @@
 
     // Adds |reports| to a shared queue of reports that need to be sent. Runs
     // |report_sent_callback| for every report that is sent, with the associated
-    // |conversion_id| of the report. |SentReportInfo| is not available if the
-    // report was not sent.
+    // |conversion_id| of the report and the time the report was originally
+    // supposed to be sent.
     virtual void AddReportsToQueue(
         std::vector<ConversionReport> reports,
-        base::RepeatingCallback<void(int64_t, absl::optional<SentReportInfo>)>
-            report_sent_callback) = 0;
+        base::RepeatingCallback<void(SentReportInfo)> report_sent_callback) = 0;
   };
 
   // Configures underlying storage to be setup in memory, rather than on
@@ -139,22 +138,19 @@
   // Queue the given |reports| on |reporter_|.
   void QueueReports(std::vector<ConversionReport> reports);
 
-  void HandleReportsExpiredAtStartup(std::vector<ConversionReport> reports);
-
   void HandleReportsSentFromWebUI(base::OnceClosure done,
                                   std::vector<ConversionReport> reports);
 
-  void MaybeStoreSentReportInfo(absl::optional<SentReportInfo> info);
+  void MaybeStoreSentReportInfo(SentReportInfo info);
 
-  // Notify storage to delete the given |conversion_id| when its associated
+  // Notifies storage to delete the given |conversion_id| when its associated
   // report has been sent.
-  void OnReportSent(int64_t conversion_id, absl::optional<SentReportInfo> info);
+  void OnReportSent(SentReportInfo info);
 
   // Similar to OnReportSent, but invokes |reports_sent_barrier| when the
   // report has been removed from storage.
   void OnReportSentFromWebUI(base::OnceClosure reports_sent_barrier,
-                             int64_t conversion_id,
-                             absl::optional<SentReportInfo> info);
+                             SentReportInfo info);
 
   // Friend to expose the ConversionStorage for certain tests.
   friend std::vector<ConversionReport> GetConversionsToReportForTesting(
diff --git a/content/browser/conversions/conversion_manager_impl_unittest.cc b/content/browser/conversions/conversion_manager_impl_unittest.cc
index 354603ee..d779043 100644
--- a/content/browser/conversions/conversion_manager_impl_unittest.cc
+++ b/content/browser/conversions/conversion_manager_impl_unittest.cc
@@ -44,8 +44,7 @@
   ConstantStartupDelayPolicy() = default;
   ~ConstantStartupDelayPolicy() override = default;
 
-  base::Time GetReportTimeForExpiredReportAtStartup(
-      base::Time now) const override {
+  base::Time GetReportTimeForReportPastSendTime(base::Time now) const override {
     return now + kExpiredReportOffset;
   }
 };
@@ -58,17 +57,21 @@
   ~TestConversionReporter() override = default;
 
   // ConversionManagerImpl::ConversionReporter
-  void AddReportsToQueue(
-      std::vector<ConversionReport> reports,
-      base::RepeatingCallback<void(int64_t, absl::optional<SentReportInfo>)>
-          report_sent_callback) override {
+  void AddReportsToQueue(std::vector<ConversionReport> reports,
+                         base::RepeatingCallback<void(SentReportInfo)>
+                             report_sent_callback) override {
     num_reports_ += reports.size();
     last_conversion_id_ = *reports.back().conversion_id;
     last_report_time_ = reports.back().report_time;
 
     if (should_run_report_sent_callbacks_) {
       for (const auto& report : reports) {
-        report_sent_callback.Run(*report.conversion_id, sent_report_info_);
+        // Override the supplied info with the proper id / report time.
+        SentReportInfo info = sent_report_info_ ? sent_report_info_.value()
+                                                : GetBlankSentReportInfo();
+        info.conversion_id = *report.conversion_id;
+        info.original_report_time = report.original_report_time;
+        report_sent_callback.Run(std::move(info));
       }
     }
 
@@ -110,6 +113,12 @@
   base::OnceClosure quit_closure_;
 };
 
+SentReportInfo SentReportInfoWithUrl(const std::string& url) {
+  SentReportInfo info = GetBlankSentReportInfo();
+  info.report_url = GURL(url);
+  return info;
+}
+
 // Time after impression that a conversion can first be sent. See
 // ConversionStorageDelegateImpl::GetReportTimeForConversion().
 constexpr base::TimeDelta kFirstReportingWindow = base::TimeDelta::FromDays(2);
@@ -267,6 +276,90 @@
   EXPECT_EQ(2u, test_reporter_->num_reports());
 }
 
+TEST_F(ConversionManagerImplTest,
+       QueuedReportFailedWithShouldRetry_QueuedAgain) {
+  test_reporter_->ShouldRunReportSentCallbacks(true);
+
+  SentReportInfo info = GetBlankSentReportInfo();
+  info.should_retry = true;
+  test_reporter_->SetSentReportInfo(info);
+
+  conversion_manager_->HandleImpression(
+      ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
+  conversion_manager_->HandleConversion(DefaultConversion());
+
+  task_environment_.FastForwardBy(kFirstReportingWindow -
+                                  kConversionManagerQueueReportsInterval);
+  EXPECT_EQ(1u, test_reporter_->num_reports());
+
+  // If the report indicated retry, it should be added to the queue again.
+  task_environment_.FastForwardBy(kConversionManagerQueueReportsInterval);
+  EXPECT_EQ(2u, test_reporter_->num_reports());
+}
+
+TEST_F(ConversionManagerImplTest,
+       QueuedReportFailedWithoutShouldRetry_NotQueuedAgain) {
+  test_reporter_->ShouldRunReportSentCallbacks(true);
+
+  SentReportInfo info = GetBlankSentReportInfo();
+  info.should_retry = false;
+  test_reporter_->SetSentReportInfo(info);
+
+  conversion_manager_->HandleImpression(
+      ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
+  conversion_manager_->HandleConversion(DefaultConversion());
+
+  task_environment_.FastForwardBy(kFirstReportingWindow -
+                                  kConversionManagerQueueReportsInterval);
+  EXPECT_EQ(1u, test_reporter_->num_reports());
+
+  // If the report indicated retry, it should be added to the queue again.
+  task_environment_.FastForwardBy(kConversionManagerQueueReportsInterval);
+  EXPECT_EQ(1u, test_reporter_->num_reports());
+}
+
+TEST_F(ConversionManagerImplTest, QueuedReportAlwaysFails_StopsSending) {
+  test_reporter_->ShouldRunReportSentCallbacks(true);
+
+  SentReportInfo info = GetBlankSentReportInfo();
+  info.should_retry = true;
+  test_reporter_->SetSentReportInfo(info);
+
+  conversion_manager_->HandleImpression(
+      ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
+  conversion_manager_->HandleConversion(DefaultConversion());
+
+  task_environment_.FastForwardBy(kFirstReportingWindow);
+
+  // Verify that the report is eventually expired and further attempts to send
+  // are not made.
+  task_environment_.FastForwardBy(base::TimeDelta::FromDays(14));
+  size_t reports = test_reporter_->num_reports();
+  task_environment_.FastForwardBy(base::TimeDelta::FromDays(1));
+
+  // Reports are attempted to be delivered once upon expiry.
+  EXPECT_EQ(reports + 1, test_reporter_->num_reports());
+}
+
+TEST_F(ConversionManagerImplTest, ReportExpiredAtStartup_Sent) {
+  conversion_manager_->HandleImpression(
+      ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
+  conversion_manager_->HandleConversion(DefaultConversion());
+
+  // Simulate shutdown.
+  conversion_manager_.reset();
+
+  // Fast-forward past the reporting window and past report expiry.
+  task_environment_.FastForwardBy(kFirstReportingWindow);
+  task_environment_.FastForwardBy(base::TimeDelta::FromDays(100));
+
+  // Simulate startup and ensure the report is sent before being expired.
+  CreateManager();
+
+  test_reporter_->WaitForNumReports(1);
+  EXPECT_EQ(1u, test_reporter_->num_reports());
+}
+
 TEST_F(ConversionManagerImplTest, QueuedReportSent_NotQueuedAgain) {
   test_reporter_->ShouldRunReportSentCallbacks(true);
   conversion_manager_->HandleImpression(
@@ -282,14 +375,13 @@
 }
 
 TEST_F(ConversionManagerImplTest, QueuedReportSent_SentReportInfoUpdated) {
-  const SentReportInfo sent_report_info_1 = {
-      .report_url = GURL("https://example/a"),
-      .http_response_code = 200,
-  };
-  const SentReportInfo sent_report_info_2 = {
-      .report_url = GURL("https://example/b"),
-      .http_response_code = 404,
-  };
+  SentReportInfo sent_report_info_1 = GetBlankSentReportInfo();
+  sent_report_info_1.report_url = GURL("https://example/a");
+  sent_report_info_1.http_response_code = 200;
+
+  SentReportInfo sent_report_info_2 = GetBlankSentReportInfo();
+  sent_report_info_2.report_url = GURL("https://example/b");
+  sent_report_info_2.http_response_code = 404;
 
   test_reporter_->ShouldRunReportSentCallbacks(true);
 
@@ -297,6 +389,9 @@
   conversion_manager_->HandleImpression(
       ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
   conversion_manager_->HandleConversion(DefaultConversion());
+  sent_report_info_1.original_report_time =
+      clock().Now() + kFirstReportingWindow;
+  sent_report_info_1.conversion_id = 1;
   task_environment_.FastForwardBy(kFirstReportingWindow -
                                   kConversionManagerQueueReportsInterval);
 
@@ -311,6 +406,11 @@
   conversion_manager_->HandleImpression(
       ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
   conversion_manager_->HandleConversion(DefaultConversion());
+  sent_report_info_2.original_report_time =
+      clock().Now() + kFirstReportingWindow;
+
+  // The other report is deleted, so id 1 is reused.
+  sent_report_info_2.conversion_id = 1;
   task_environment_.FastForwardBy(kFirstReportingWindow -
                                   kConversionManagerQueueReportsInterval);
 
@@ -321,21 +421,27 @@
 TEST_F(ConversionManagerImplTest, QueuedReportSent_StoresLastN) {
   test_reporter_->ShouldRunReportSentCallbacks(true);
 
+  std::vector<SentReportInfo> infos = {
+      SentReportInfoWithUrl("https://a.example/1"),
+      SentReportInfoWithUrl("https://a.example/2"),
+      SentReportInfoWithUrl("https://a.example/3"),
+      SentReportInfoWithUrl("https://a.example/4")};
+
   // Process |kMaxSentReportsToStore + 1| reports.
-  for (int i : {1, 2, 3, 4}) {
-    test_reporter_->SetSentReportInfo(SentReportInfo{.http_response_code = i});
+  for (auto& info : infos) {
+    test_reporter_->SetSentReportInfo(info);
     conversion_manager_->HandleImpression(
         ImpressionBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build());
     conversion_manager_->HandleConversion(DefaultConversion());
+    info.original_report_time = clock().Now() + kFirstReportingWindow;
+    info.conversion_id = 1;
     task_environment_.FastForwardBy(kFirstReportingWindow -
                                     kConversionManagerQueueReportsInterval);
   }
 
   // Only the last |kMaxSentReportsToStore| should be stored.
   EXPECT_THAT(conversion_manager_->GetSentReportsForWebUI(),
-              ElementsAre(SentReportInfo{.http_response_code = 2},
-                          SentReportInfo{.http_response_code = 3},
-                          SentReportInfo{.http_response_code = 4}));
+              ElementsAre(infos[1], infos[2], infos[3]));
 }
 
 // Add a conversion to storage and reset the manager to mimic a report being
diff --git a/content/browser/conversions/conversion_network_sender_impl.cc b/content/browser/conversions/conversion_network_sender_impl.cc
index 9281ff8..ae0946d 100644
--- a/content/browser/conversions/conversion_network_sender_impl.cc
+++ b/content/browser/conversions/conversion_network_sender_impl.cc
@@ -55,12 +55,9 @@
   // Use a large time range to capture users that might not open the browser for
   // a long time while a conversion report is pending. Revisit this range if it
   // is non-ideal for real world data.
-  // Add |extra_delay| to the reported time which will include the amount of
-  // time since the report was originally scheduled, for reports at startup
-  // whose |report_time| changes due to additional startup delay.
   base::Time now = base::Time::Now();
   base::TimeDelta time_since_original_report_time =
-      (now - report.report_time) + report.extra_delay;
+      (now - report.original_report_time);
   base::UmaHistogramCustomTimes("Conversions.ExtraReportDelay2",
                                 time_since_original_report_time,
                                 base::TimeDelta::FromSeconds(1),
@@ -175,6 +172,8 @@
                    network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED;
   simple_url_loader_ptr->SetRetryOptions(/*max_retries=*/1, retry_mode);
 
+  DCHECK(report.conversion_id);
+
   // Unretained is safe because the URLLoader is owned by |this| and will be
   // deleted before |this|.
   simple_url_loader_ptr->DownloadHeadersOnly(
@@ -182,7 +181,8 @@
       base::BindOnce(&ConversionNetworkSenderImpl::OnReportSent,
                      base::Unretained(this), std::move(it),
                      std::move(report_url), std::move(report_body),
-                     std::move(sent_callback)));
+                     std::move(sent_callback), *report.conversion_id,
+                     report.original_report_time));
   LogMetricsOnReportSend(report);
 }
 
@@ -196,15 +196,11 @@
     GURL report_url,
     std::string report_body,
     ReportSentCallback sent_callback,
+    int64_t conversion_id,
+    base::Time original_report_time,
     scoped_refptr<net::HttpResponseHeaders> headers) {
   network::SimpleURLLoader* loader = it->get();
 
-  SentReportInfo sent_report_info = {
-      .report_url = std::move(report_url),
-      .report_body = std::move(report_body),
-      .http_response_code = headers ? headers->response_code() : 0,
-  };
-
   // Consider a non-200 HTTP code as a non-internal error.
   int net_error = loader->NetError();
   bool internal_ok =
@@ -229,7 +225,24 @@
   }
 
   loaders_in_progress_.erase(it);
-  std::move(sent_callback).Run(std::move(sent_report_info));
+
+  // Retry reports that have not received headers and failed with one of the
+  // specified error codes. These codes are chosen from the
+  // "Conversions.Report.HttpResponseOrNetErrorCode" histogram. HTTP errors
+  // should not be retried to prevent over requesting servers.
+  bool should_retry =
+      !headers && (net_error == net::ERR_INTERNET_DISCONNECTED ||
+                   net_error == net::ERR_NAME_NOT_RESOLVED ||
+                   net_error == net::ERR_TIMED_OUT ||
+                   net_error == net::ERR_CONNECTION_TIMED_OUT ||
+                   net_error == net::ERR_CONNECTION_ABORTED ||
+                   net_error == net::ERR_CONNECTION_RESET);
+
+  std::move(sent_callback)
+      .Run(SentReportInfo(conversion_id, original_report_time,
+                          std::move(report_url), std::move(report_body),
+                          headers ? headers->response_code() : 0,
+                          should_retry));
 }
 
 }  // namespace content
diff --git a/content/browser/conversions/conversion_network_sender_impl.h b/content/browser/conversions/conversion_network_sender_impl.h
index ed27b7f4..12108fb1 100644
--- a/content/browser/conversions/conversion_network_sender_impl.h
+++ b/content/browser/conversions/conversion_network_sender_impl.h
@@ -67,6 +67,8 @@
                     GURL report_url,
                     std::string report_body,
                     ReportSentCallback sent_callback,
+                    int64_t conversion_id,
+                    base::Time original_report_time,
                     scoped_refptr<net::HttpResponseHeaders> headers);
 
   // Reports that are actively being sent.
diff --git a/content/browser/conversions/conversion_network_sender_impl_unittest.cc b/content/browser/conversions/conversion_network_sender_impl_unittest.cc
index 1f57f93..3d70bf9 100644
--- a/content/browser/conversions/conversion_network_sender_impl_unittest.cc
+++ b/content/browser/conversions/conversion_network_sender_impl_unittest.cc
@@ -97,6 +97,65 @@
       kReportUrl, ""));
 }
 
+TEST_F(ConversionNetworkSenderTest, LoadFlags) {
+  auto report = GetReport(/*conversion_id=*/1);
+  network_sender_->SendReport(report, GetSentCallback());
+  int load_flags =
+      test_url_loader_factory_.GetPendingRequest(0)->request.load_flags;
+  EXPECT_TRUE(load_flags & net::LOAD_BYPASS_CACHE);
+  EXPECT_TRUE(load_flags & net::LOAD_DISABLE_CACHE);
+}
+
+TEST_F(ConversionNetworkSenderTest, ReportSent_QueryParamsSetCorrectly) {
+  auto impression =
+      ImpressionBuilder(base::Time())
+          .SetData(100)
+          .SetReportingOrigin(url::Origin::Create(GURL("https://a.com")))
+          .Build();
+  ConversionReport report(impression,
+                          /*conversion_data=*/5,
+                          /*conversion_time=*/base::Time(),
+                          /*report_time=*/base::Time(),
+                          /*conversion_id=*/1);
+  network_sender_->SendReport(report, base::DoNothing());
+
+  const network::ResourceRequest* pending_request;
+  EXPECT_TRUE(test_url_loader_factory_.IsPending(
+      "https://a.com/.well-known/attribution-reporting/report-attribution",
+      &pending_request));
+  EXPECT_EQ(R"({"source_event_id":"100","trigger_data":"5"})",
+            network::GetUploadData(*pending_request));
+}
+
+TEST_F(ConversionNetworkSenderTest, ReportSent_RequestAttributesSet) {
+  auto impression =
+      ImpressionBuilder(base::Time())
+          .SetData(1)
+          .SetReportingOrigin(url::Origin::Create(GURL("https://a.com")))
+          .SetConversionOrigin(url::Origin::Create(GURL("https://sub.b.com")))
+          .Build();
+  ConversionReport report(impression,
+                          /*conversion_data=*/1,
+                          /*conversion_time=*/base::Time(),
+                          /*report_time=*/base::Time(),
+                          /*conversion_id=*/1);
+  network_sender_->SendReport(report, base::DoNothing());
+
+  const network::ResourceRequest* pending_request;
+  std::string expected_report_url(
+      "https://a.com/.well-known/attribution-reporting/report-attribution");
+  EXPECT_TRUE(test_url_loader_factory_.IsPending(expected_report_url,
+                                                 &pending_request));
+
+  // Ensure that the request is sent with no credentials.
+  EXPECT_EQ(network::mojom::CredentialsMode::kOmit,
+            pending_request->credentials_mode);
+  EXPECT_EQ("POST", pending_request->method);
+
+  // Make sure the domain is used as the referrer.
+  EXPECT_EQ(GURL("https://b.com"), pending_request->referrer);
+}
+
 TEST_F(ConversionNetworkSenderTest, ReportSent_CallbackFired) {
   auto report = GetReport(/*conversion_id=*/1);
   network_sender_->SendReport(report, GetSentCallback());
@@ -105,11 +164,10 @@
       kReportUrl, ""));
   EXPECT_THAT(
       sent_reports_,
-      ElementsAre(SentReportInfo{
-          .report_url = GURL(kReportUrl),
-          .report_body = R"({"source_event_id":"1","trigger_data":"1"})",
-          .http_response_code = 200,
-      }));
+      ElementsAre(SentReportInfo(
+          *report.conversion_id, report.original_report_time, GURL(kReportUrl),
+          R"({"source_event_id":"1","trigger_data":"1"})",
+          /*http_response_code=*/200, /*should_retry=*/false)));
 }
 
 TEST_F(ConversionNetworkSenderTest, SenderDeletedDuringRequest_NoCrash) {
@@ -137,11 +195,76 @@
   // instead of just setting |http_response_code = 0|?
   EXPECT_THAT(
       sent_reports_,
-      ElementsAre(SentReportInfo{
-          .report_url = GURL(kReportUrl),
-          .report_body = R"({"source_event_id":"1","trigger_data":"1"})",
-          .http_response_code = 0,
-      }));
+      ElementsAre(SentReportInfo(
+          *report.conversion_id, report.original_report_time, GURL(kReportUrl),
+          R"({"source_event_id":"1","trigger_data":"1"})",
+          /*http_response_code=*/0, /*should_retry=*/true)));
+}
+
+TEST_F(ConversionNetworkSenderTest,
+       ReportRequestFailsWithTargetedError_ShouldRetrySet) {
+  struct {
+    int net_error;
+    bool should_retry;
+  } kTestCases[] = {
+      {.net_error = net::ERR_INTERNET_DISCONNECTED, .should_retry = true},
+      {.net_error = net::ERR_TIMED_OUT, .should_retry = true},
+      {.net_error = net::ERR_CONNECTION_ABORTED, .should_retry = true},
+      {.net_error = net::ERR_CONNECTION_TIMED_OUT, .should_retry = true},
+      {.net_error = net::ERR_CONNECTION_REFUSED, .should_retry = false},
+      {.net_error = net::ERR_CERT_DATE_INVALID, .should_retry = false},
+      {.net_error = net::OK, .should_retry = false},
+  };
+
+  for (const auto& test_case : kTestCases) {
+    auto report = GetReport(/*conversion_id=*/1);
+    network_sender_->SendReport(report, GetSentCallback());
+    EXPECT_EQ(1, test_url_loader_factory_.NumPending());
+
+    // By default, headers are not sent for network errors.
+    test_url_loader_factory_.SimulateResponseForPendingRequest(
+        GURL(kReportUrl),
+        network::URLLoaderCompletionStatus(test_case.net_error),
+        network::mojom::URLResponseHead::New(), std::string());
+
+    EXPECT_EQ(test_case.should_retry, sent_reports_.back().should_retry);
+  }
+}
+
+TEST_F(ConversionNetworkSenderTest, ReportRequestFailsWithHeaders_NotRetried) {
+  auto head = network::mojom::URLResponseHead::New();
+  head->headers = base::MakeRefCounted<net::HttpResponseHeaders>("");
+
+  // Simulate a retry-able network error with headers received.
+  test_url_loader_factory_.AddResponse(
+      GURL(kReportUrl),
+      /*head=*/std::move(head), /*content=*/"",
+      network::URLLoaderCompletionStatus(net::ERR_INTERNET_DISCONNECTED),
+      network::TestURLLoaderFactory::Redirects(),
+      network::TestURLLoaderFactory::ResponseProduceFlags::
+          kSendHeadersOnNetworkError);
+
+  auto report = GetReport(/*conversion_id=*/1);
+  network_sender_->SendReport(report, GetSentCallback());
+
+  // Ensure the request was replied to.
+  EXPECT_EQ(0, test_url_loader_factory_.NumPending());
+
+  EXPECT_EQ(1u, num_reports_sent());
+  EXPECT_EQ(false, sent_reports_.back().should_retry);
+}
+
+TEST_F(ConversionNetworkSenderTest,
+       ReportRequestFailsWithHttpError_ShouldRetryNotSet) {
+  auto report = GetReport(/*conversion_id=*/1);
+  network_sender_->SendReport(report, GetSentCallback());
+  EXPECT_EQ(1, test_url_loader_factory_.NumPending());
+
+  EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
+      kReportUrl, "", net::HttpStatusCode::HTTP_BAD_REQUEST));
+
+  EXPECT_EQ(1u, num_reports_sent());
+  EXPECT_EQ(false, sent_reports_[0].should_retry);
 }
 
 TEST_F(ConversionNetworkSenderTest,
@@ -201,56 +324,6 @@
   }
 }
 
-TEST_F(ConversionNetworkSenderTest, ReportSent_QueryParamsSetCorrectly) {
-  auto impression =
-      ImpressionBuilder(base::Time())
-          .SetData(100)
-          .SetReportingOrigin(url::Origin::Create(GURL("https://a.com")))
-          .Build();
-  ConversionReport report(impression,
-                          /*conversion_data=*/5,
-                          /*conversion_time=*/base::Time(),
-                          /*report_time=*/base::Time(),
-                          /*conversion_id=*/1);
-  network_sender_->SendReport(report, base::DoNothing());
-
-  const network::ResourceRequest* pending_request;
-  EXPECT_TRUE(test_url_loader_factory_.IsPending(
-      "https://a.com/.well-known/attribution-reporting/report-attribution",
-      &pending_request));
-  EXPECT_EQ(R"({"source_event_id":"100","trigger_data":"5"})",
-            network::GetUploadData(*pending_request));
-}
-
-TEST_F(ConversionNetworkSenderTest, ReportSent_RequestAttributesSet) {
-  auto impression =
-      ImpressionBuilder(base::Time())
-          .SetData(1)
-          .SetReportingOrigin(url::Origin::Create(GURL("https://a.com")))
-          .SetConversionOrigin(url::Origin::Create(GURL("https://sub.b.com")))
-          .Build();
-  ConversionReport report(impression,
-                          /*conversion_data=*/1,
-                          /*conversion_time=*/base::Time(),
-                          /*report_time=*/base::Time(),
-                          /*conversion_id=*/1);
-  network_sender_->SendReport(report, base::DoNothing());
-
-  const network::ResourceRequest* pending_request;
-  std::string expected_report_url(
-      "https://a.com/.well-known/attribution-reporting/report-attribution");
-  EXPECT_TRUE(test_url_loader_factory_.IsPending(expected_report_url,
-                                                 &pending_request));
-
-  // Ensure that the request is sent with no credentials.
-  EXPECT_EQ(network::mojom::CredentialsMode::kOmit,
-            pending_request->credentials_mode);
-  EXPECT_EQ("POST", pending_request->method);
-
-  // Make sure the domain is used as the referrer.
-  EXPECT_EQ(GURL("https://b.com"), pending_request->referrer);
-}
-
 TEST_F(ConversionNetworkSenderTest, ReportResultsInHttpError_SentCallbackRuns) {
   auto report = GetReport(/*conversion_id=*/1);
   network_sender_->SendReport(report, GetSentCallback());
@@ -261,11 +334,11 @@
       kReportUrl, "", net::HttpStatusCode::HTTP_BAD_REQUEST));
   EXPECT_THAT(
       sent_reports_,
-      ElementsAre(SentReportInfo{
-          .report_url = GURL(kReportUrl),
-          .report_body = R"({"source_event_id":"1","trigger_data":"1"})",
-          .http_response_code = net::HttpStatusCode::HTTP_BAD_REQUEST,
-      }));
+      ElementsAre(SentReportInfo(
+          *report.conversion_id, report.original_report_time, GURL(kReportUrl),
+          R"({"source_event_id":"1","trigger_data":"1"})",
+          /*http_response_code=*/net::HttpStatusCode::HTTP_BAD_REQUEST,
+          /*should_retry=*/false)));
 }
 
 TEST_F(ConversionNetworkSenderTest, ManyReports_AllSentSuccessfully) {
@@ -287,15 +360,6 @@
   EXPECT_EQ(0, test_url_loader_factory_.NumPending());
 }
 
-TEST_F(ConversionNetworkSenderTest, LoadFlags) {
-  auto report = GetReport(/*conversion_id=*/1);
-  network_sender_->SendReport(report, GetSentCallback());
-  int load_flags =
-      test_url_loader_factory_.GetPendingRequest(0)->request.load_flags;
-  EXPECT_TRUE(load_flags & net::LOAD_BYPASS_CACHE);
-  EXPECT_TRUE(load_flags & net::LOAD_DISABLE_CACHE);
-}
-
 TEST_F(ConversionNetworkSenderTest, ErrorHistogram) {
   // All OK.
   {
diff --git a/content/browser/conversions/conversion_policy.cc b/content/browser/conversions/conversion_policy.cc
index 310df1c6..26f9635c 100644
--- a/content/browser/conversions/conversion_policy.cc
+++ b/content/browser/conversions/conversion_policy.cc
@@ -128,7 +128,7 @@
          base::clamp(expiry, kMinImpressionExpiry, kDefaultImpressionExpiry);
 }
 
-base::Time ConversionPolicy::GetReportTimeForExpiredReportAtStartup(
+base::Time ConversionPolicy::GetReportTimeForReportPastSendTime(
     base::Time now) const {
   // Do not use any delay in debug mode.
   if (debug_mode_)
@@ -143,4 +143,9 @@
          base::TimeDelta::FromMilliseconds(base::RandInt(0, 5 * 60 * 1000));
 }
 
+base::TimeDelta ConversionPolicy::GetMaxReportAge() const {
+  // Chosen from looking at "Conversions.ExtraReportDelay" histogram.
+  return base::TimeDelta::FromDays(14);
+}
+
 }  // namespace content
diff --git a/content/browser/conversions/conversion_policy.h b/content/browser/conversions/conversion_policy.h
index 29575256..b1d29be 100644
--- a/content/browser/conversions/conversion_policy.h
+++ b/content/browser/conversions/conversion_policy.h
@@ -87,11 +87,15 @@
       base::Time impression_time,
       StorableImpression::SourceType source_type) const WARN_UNUSED_RESULT;
 
-  // Delays reports that should have been sent while the browser was not open by
-  // given them a noisy report time to help disassociate them from other
-  // reports.
-  virtual base::Time GetReportTimeForExpiredReportAtStartup(
-      base::Time now) const WARN_UNUSED_RESULT;
+  // Delays reports that missed their report time, such as the browser not being
+  // open, or internet being disconnected. This given them a noisy report time
+  // to help disassociate them from other reports.
+  virtual base::Time GetReportTimeForReportPastSendTime(base::Time now) const
+      WARN_UNUSED_RESULT;
+
+  // Gets the maximum time a report can be held in storage after its report
+  // time.
+  virtual base::TimeDelta GetMaxReportAge() const WARN_UNUSED_RESULT;
 
  private:
   // For testing only.
diff --git a/content/browser/conversions/conversion_report.cc b/content/browser/conversions/conversion_report.cc
index 9e0557c..ff57047 100644
--- a/content/browser/conversions/conversion_report.cc
+++ b/content/browser/conversions/conversion_report.cc
@@ -15,6 +15,7 @@
       conversion_data(conversion_data),
       conversion_time(conversion_time),
       report_time(report_time),
+      original_report_time(report_time),
       conversion_id(conversion_id) {}
 
 ConversionReport::ConversionReport(const ConversionReport& other) = default;
diff --git a/content/browser/conversions/conversion_report.h b/content/browser/conversions/conversion_report.h
index f0aa934f0..d362804 100644
--- a/content/browser/conversions/conversion_report.h
+++ b/content/browser/conversions/conversion_report.h
@@ -43,9 +43,10 @@
   // The time this conversion report should be sent.
   base::Time report_time;
 
-  // Tracks ephemeral increases to |report_time| for this conversion report, for
-  // the purposes of logging metrics.
-  base::TimeDelta extra_delay;
+  // The original report time assigned to this report when it was created,
+  // ignoring any ephemeral increases to |report_time| for this conversion
+  // report.
+  base::Time original_report_time;
 
   // Id assigned by storage to uniquely identify a completed conversion. If
   // null, an ID has not been assigned yet.
diff --git a/content/browser/conversions/conversion_reporter_impl.cc b/content/browser/conversions/conversion_reporter_impl.cc
index f18601a..9c03aca 100644
--- a/content/browser/conversions/conversion_reporter_impl.cc
+++ b/content/browser/conversions/conversion_reporter_impl.cc
@@ -33,8 +33,7 @@
 
 void ConversionReporterImpl::AddReportsToQueue(
     std::vector<ConversionReport> reports,
-    base::RepeatingCallback<void(int64_t, absl::optional<SentReportInfo>)>
-        report_sent_callback) {
+    base::RepeatingCallback<void(SentReportInfo)> report_sent_callback) {
   DCHECK(!reports.empty());
 
   // Shuffle new reports to provide plausible deniability on the ordering of
@@ -75,14 +74,19 @@
           &report.impression.conversion_origin(),
           &report.impression.reporting_origin())) {
     network_sender_->SendReport(
-        report, base::BindOnce(&ConversionReporterImpl::OnReportSentWithInfo,
-                               base::Unretained(this), *report.conversion_id));
+        report, base::BindOnce(&ConversionReporterImpl::OnReportSent,
+                               base::Unretained(this)));
   } else {
     // If measurement is disallowed, just drop the report on the floor. We need
     // to make sure we forward that the report was "sent" to ensure it is
     // deleted from storage, etc. This simulates sending the report through a
     // null channel.
-    OnReportSent(*report.conversion_id, /*info=*/absl::nullopt);
+    OnReportSent(SentReportInfo(*report.conversion_id,
+                                report.original_report_time,
+                                /*report_url=*/GURL(),
+                                /*report_body=*/"",
+                                /*http_response_code=*/0,
+                                /*should_retry*/ false));
   }
   report_queue_.pop();
   MaybeScheduleNextReport();
@@ -108,19 +112,13 @@
                      base::Unretained(this)));
 }
 
-void ConversionReporterImpl::OnReportSent(int64_t conversion_id,
-                                          absl::optional<SentReportInfo> info) {
-  auto it = conversion_report_callbacks_.find(conversion_id);
+void ConversionReporterImpl::OnReportSent(SentReportInfo info) {
+  auto it = conversion_report_callbacks_.find(info.conversion_id);
   DCHECK(it != conversion_report_callbacks_.end());
-  std::move(it->second).Run(conversion_id, std::move(info));
+  std::move(it->second).Run(std::move(info));
   conversion_report_callbacks_.erase(it);
 }
 
-void ConversionReporterImpl::OnReportSentWithInfo(int64_t conversion_id,
-                                                  SentReportInfo info) {
-  OnReportSent(conversion_id, std::move(info));
-}
-
 bool ConversionReporterImpl::ReportComparator::operator()(
     const ConversionReport& a,
     const ConversionReport& b) const {
diff --git a/content/browser/conversions/conversion_reporter_impl.h b/content/browser/conversions/conversion_reporter_impl.h
index 954e065f..6ff3127 100644
--- a/content/browser/conversions/conversion_reporter_impl.h
+++ b/content/browser/conversions/conversion_reporter_impl.h
@@ -60,10 +60,9 @@
   ~ConversionReporterImpl() override;
 
   // ConversionManagerImpl::ConversionReporter:
-  void AddReportsToQueue(
-      std::vector<ConversionReport> reports,
-      base::RepeatingCallback<void(int64_t, absl::optional<SentReportInfo>)>
-          report_sent_callback) override;
+  void AddReportsToQueue(std::vector<ConversionReport> reports,
+                         base::RepeatingCallback<void(SentReportInfo)>
+                             report_sent_callback) override;
 
   void SetNetworkSenderForTesting(
       std::unique_ptr<NetworkSender> network_sender);
@@ -74,9 +73,7 @@
 
   // Called when a conversion report sent via NetworkSender::SendReport() has
   // completed loading.
-  void OnReportSent(int64_t conversion_id, absl::optional<SentReportInfo> info);
-  // Adapter for use with |NetworkSender::SendReport()|.
-  void OnReportSentWithInfo(int64_t conversion_id, SentReportInfo info);
+  void OnReportSent(SentReportInfo info);
 
   // Comparator used to order ConversionReports by their report time, with the
   // smallest time at the top of |report_queue_|.
@@ -95,9 +92,7 @@
   // sent by |network_sender_|, and their associated report sent callbacks. The
   // number of concurrent conversion reports being sent at any time is expected
   // to be small, so a flat_map is used.
-  base::flat_map<
-      int64_t,
-      base::OnceCallback<void(int64_t, absl::optional<SentReportInfo>)>>
+  base::flat_map<int64_t, base::OnceCallback<void(SentReportInfo)>>
       conversion_report_callbacks_;
 
   const base::Clock* clock_;
diff --git a/content/browser/conversions/conversion_reporter_impl_unittest.cc b/content/browser/conversions/conversion_reporter_impl_unittest.cc
index 953be29..8f481b0 100644
--- a/content/browser/conversions/conversion_reporter_impl_unittest.cc
+++ b/content/browser/conversions/conversion_reporter_impl_unittest.cc
@@ -48,7 +48,11 @@
                   ReportSentCallback sent_callback) override {
     last_sent_report_id_ = *conversion_report.conversion_id;
     num_reports_sent_++;
-    std::move(sent_callback).Run({.http_response_code = 200});
+    SentReportInfo info = GetBlankSentReportInfo();
+    info.conversion_id = *conversion_report.conversion_id;
+    info.original_report_time = conversion_report.original_report_time;
+    info.http_response_code = 200;
+    std::move(sent_callback).Run(info);
   }
 
   int64_t last_sent_report_id() { return last_sent_report_id_; }
@@ -96,12 +100,10 @@
        ReportAddedWithImmediateReportTime_ReportSent) {
   reporter_->AddReportsToQueue(
       {GetReport(clock().Now(), clock().Now(), /*conversion_id=*/1)},
-      base::BindRepeating(
-          [](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-            EXPECT_EQ(1L, conversion_id);
-            EXPECT_TRUE(info.has_value());
-            EXPECT_EQ(200, info->http_response_code);
-          }));
+      base::BindRepeating([](SentReportInfo info) {
+        EXPECT_EQ(1L, info.conversion_id);
+        EXPECT_EQ(200, info.http_response_code);
+      }));
 
   // Fast forward by 0, as we yield the thread when a report is scheduled to be
   // sent.
@@ -114,12 +116,10 @@
   reporter_->AddReportsToQueue(
       {GetReport(clock().Now(), clock().Now() - base::TimeDelta::FromHours(10),
                  /*conversion_id=*/1)},
-      base::BindRepeating(
-          [](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-            EXPECT_EQ(1L, conversion_id);
-            EXPECT_TRUE(info.has_value());
-            EXPECT_EQ(200, info->http_response_code);
-          }));
+      base::BindRepeating([](SentReportInfo info) {
+        EXPECT_EQ(1L, info.conversion_id);
+        EXPECT_EQ(200, info.http_response_code);
+      }));
 
   // Fast forward by 0, as we yield the thread when a report is scheduled to be
   // sent.
@@ -185,11 +185,9 @@
                                 /*conversion_id=*/i));
   }
   reporter_->AddReportsToQueue(
-      reports,
-      base::BindLambdaForTesting(
-          [&](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-            last_report_id = conversion_id;
-          }));
+      reports, base::BindLambdaForTesting([&](SentReportInfo info) {
+        last_report_id = info.conversion_id;
+      }));
   task_environment_.FastForwardBy(base::TimeDelta());
   EXPECT_EQ(0u, sender_->num_reports_sent());
 
@@ -205,9 +203,7 @@
 TEST_F(ConversionReporterImplTest, ManyReportsAddedSeparately_SentInOrder) {
   int64_t last_report_id = 0;
   auto report_sent_callback = base::BindLambdaForTesting(
-      [&](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-        last_report_id = conversion_id;
-      });
+      [&](SentReportInfo info) { last_report_id = info.conversion_id; });
   for (int i = 1; i < 10; i++) {
     reporter_->AddReportsToQueue(
         {GetReport(clock().Now(),
@@ -233,11 +229,12 @@
       SetBrowserClientForTesting(&disallowed_browser_client);
   reporter_->AddReportsToQueue(
       {GetReport(clock().Now(), clock().Now(), /*conversion_id=*/1)},
-      base::BindRepeating(
-          [](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-            EXPECT_EQ(1L, conversion_id);
-            EXPECT_FALSE(info.has_value());
-          }));
+      base::BindRepeating([](SentReportInfo info) {
+        EXPECT_EQ(1L, info.conversion_id);
+
+        // Verify that the report was not sent to the NetworkSender.
+        EXPECT_EQ(0, info.http_response_code);
+      }));
 
   // Fast forward by 0, as we yield the thread when a report is scheduled to be
   // sent.
@@ -288,11 +285,11 @@
                          /*conversion_id=*/1)};
     reporter_->AddReportsToQueue(
         std::move(reports),
-        base::BindLambdaForTesting(
-            [&](int64_t conversion_id, absl::optional<SentReportInfo> info) {
-              EXPECT_EQ(1L, conversion_id);
-              EXPECT_EQ(test_case.report_allowed, info.has_value());
-            }));
+        base::BindLambdaForTesting([&](SentReportInfo info) {
+          EXPECT_EQ(1L, info.conversion_id);
+          EXPECT_EQ(test_case.report_allowed ? 200 : 0,
+                    info.http_response_code);
+        }));
 
     // Fast forward by 0, as we yield the thread when a report is scheduled to
     // be sent.
diff --git a/content/browser/conversions/conversion_storage_sql.cc b/content/browser/conversions/conversion_storage_sql.cc
index 116783e..9ec41e04 100644
--- a/content/browser/conversions/conversion_storage_sql.cc
+++ b/content/browser/conversions/conversion_storage_sql.cc
@@ -95,8 +95,7 @@
 const int kDeprecatedVersionNumber = 0;
 
 void RecordInitializationStatus(const ConversionStorageSql::InitStatus status) {
-  base::UmaHistogramEnumeration("Conversions.Storage.Sql.InitStatus", status,
-                                ConversionStorageSql::InitStatus::kMaxValue);
+  base::UmaHistogramEnumeration("Conversions.Storage.Sql.InitStatus2", status);
 }
 
 void RecordImpressionsDeleted(int count) {
diff --git a/content/browser/conversions/conversion_storage_sql_unittest.cc b/content/browser/conversions/conversion_storage_sql_unittest.cc
index 1d334c2..e754d51d 100644
--- a/content/browser/conversions/conversion_storage_sql_unittest.cc
+++ b/content/browser/conversions/conversion_storage_sql_unittest.cc
@@ -468,7 +468,7 @@
   storage()->StoreImpression(ImpressionBuilder(clock()->Now()).Build());
   CloseDatabase();
 
-  histograms.ExpectUniqueSample("Conversions.Storage.Sql.InitStatus",
+  histograms.ExpectUniqueSample("Conversions.Storage.Sql.InitStatus2",
                                 ConversionStorageSql::InitStatus::kSuccess, 1);
 }
 
diff --git a/content/browser/conversions/conversion_test_utils.cc b/content/browser/conversions/conversion_test_utils.cc
index 83b95c6e..b8ac3533 100644
--- a/content/browser/conversions/conversion_test_utils.cc
+++ b/content/browser/conversions/conversion_test_utils.cc
@@ -358,7 +358,7 @@
   const auto tie = [](const ConversionReport& conversion) {
     return std::make_tuple(conversion.impression, conversion.conversion_data,
                            conversion.conversion_time, conversion.report_time,
-                           conversion.extra_delay);
+                           conversion.original_report_time);
   };
   return tie(a) == tie(b);
 }
@@ -366,7 +366,8 @@
 bool operator==(const SentReportInfo& a, const SentReportInfo& b) {
   const auto tie = [](const SentReportInfo& info) {
     return std::make_tuple(info.report_url, info.report_body,
-                           info.http_response_code);
+                           info.http_response_code, info.original_report_time,
+                           info.conversion_id);
   };
   return tie(a) == tie(b);
 }
@@ -388,4 +389,13 @@
   return conversion_reports;
 }
 
+SentReportInfo GetBlankSentReportInfo() {
+  return SentReportInfo(/*conversion_id=*/0,
+                        /*original_report_time=*/base::Time(),
+                        /*report_url=*/GURL(),
+                        /*report_body=*/"",
+                        /*http_response_code=*/0,
+                        /*should_retry*/ false);
+}
+
 }  // namespace content
diff --git a/content/browser/conversions/conversion_test_utils.h b/content/browser/conversions/conversion_test_utils.h
index a399137..b74b438 100644
--- a/content/browser/conversions/conversion_test_utils.h
+++ b/content/browser/conversions/conversion_test_utils.h
@@ -333,6 +333,8 @@
     ConversionManagerImpl* manager,
     base::Time max_report_time) WARN_UNUSED_RESULT;
 
+SentReportInfo GetBlankSentReportInfo();
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_CONVERSIONS_CONVERSION_TEST_UTILS_H_
diff --git a/content/browser/conversions/sent_report_info.cc b/content/browser/conversions/sent_report_info.cc
new file mode 100644
index 0000000..867ed50
--- /dev/null
+++ b/content/browser/conversions/sent_report_info.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 "content/browser/conversions/sent_report_info.h"
+
+namespace content {
+
+SentReportInfo::SentReportInfo(int64_t conversion_id,
+                               base::Time original_report_time,
+                               GURL report_url,
+                               std::string report_body,
+                               int http_response_code,
+                               bool should_retry)
+    : conversion_id(conversion_id),
+      original_report_time(original_report_time),
+      report_url(report_url),
+      report_body(std::move(report_body)),
+      http_response_code(http_response_code),
+      should_retry(should_retry) {}
+
+SentReportInfo::SentReportInfo(const SentReportInfo& other) = default;
+SentReportInfo& SentReportInfo::operator=(const SentReportInfo& other) =
+    default;
+SentReportInfo::SentReportInfo(SentReportInfo&& other) = default;
+SentReportInfo& SentReportInfo::operator=(SentReportInfo&& other) = default;
+
+SentReportInfo::~SentReportInfo() = default;
+
+}  // namespace content
diff --git a/content/browser/conversions/sent_report_info.h b/content/browser/conversions/sent_report_info.h
index 2781c9ee..8263c8d3 100644
--- a/content/browser/conversions/sent_report_info.h
+++ b/content/browser/conversions/sent_report_info.h
@@ -5,20 +5,46 @@
 #ifndef CONTENT_BROWSER_CONVERSIONS_SENT_REPORT_INFO_H_
 #define CONTENT_BROWSER_CONVERSIONS_SENT_REPORT_INFO_H_
 
+#include <stdint.h>
 #include <string>
 
+#include "base/time/time.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
 namespace content {
 
-// Struct that contains data about sent reports for display in the Conversion
-// Internals WebUI.
+// Struct that contains data about sent reports. Some info is displayed in the
+// Conversion Internals WebUI.
 struct CONTENT_EXPORT SentReportInfo {
+  SentReportInfo(int64_t conversion_id,
+                 base::Time original_report_time,
+                 GURL report_url,
+                 std::string report_body,
+                 int http_response_code,
+                 bool should_retry);
+  SentReportInfo(const SentReportInfo& other);
+  SentReportInfo& operator=(const SentReportInfo& other);
+  SentReportInfo(SentReportInfo&& other);
+  SentReportInfo& operator=(SentReportInfo&& other);
+  ~SentReportInfo();
+
+  // Information from the `ConversionReport` that was sent.
+  int64_t conversion_id;
+  base::Time original_report_time;
+
+  // Information on the network request that was sent.
+  //
+  // An empty `report_url` indicates that the report was not attempted to be
+  // sent. For example, if the embedder disabled the API.
   GURL report_url;
   std::string report_body;
   int http_response_code;
 
+  // Whether the report should be retried. Set if the report failed without
+  // receiving response headers.
+  bool should_retry;
+
   // When adding new members, the corresponding `operator==()` definition in
   // `conversion_test_utils.h` should also be updated.
 };
diff --git a/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc b/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
index 9b0a249..d6bfe3a 100644
--- a/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
+++ b/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
@@ -89,6 +89,8 @@
   void RegisterDCOMPSurfaceHandle(
       mojo::PlatformHandle surface_handle,
       RegisterDCOMPSurfaceHandleCallback callback) override {}
+  void UnregisterDCOMPSurfaceHandle(
+      const base::UnguessableToken& token) override {}
 #endif
   void CreateVideoEncodeAcceleratorProvider(
       mojo::PendingReceiver<media::mojom::VideoEncodeAcceleratorProvider>
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
index ad22655..b9e4ded 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -131,7 +131,7 @@
     return message;
   }
 
-  storage::FileErrorOr<base::File> file_or_error = filesystem_proxy->OpenFile(
+  base::FileErrorOr<base::File> file_or_error = filesystem_proxy->OpenFile(
       info_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
   if (!file_or_error.is_error()) {
     auto& file = file_or_error.value();
diff --git a/content/browser/media/dcomp_surface_registry_broker.cc b/content/browser/media/dcomp_surface_registry_broker.cc
index 2f32fa2..b8e8b76 100644
--- a/content/browser/media/dcomp_surface_registry_broker.cc
+++ b/content/browser/media/dcomp_surface_registry_broker.cc
@@ -32,6 +32,19 @@
                                      std::move(callback), absl::nullopt));
 }
 
+void UnregisterDCOMPSurfaceHandleOnIOThread(
+    const base::UnguessableToken& token) {
+  auto* gpu_process_host =
+      GpuProcessHost::Get(GpuProcessKind::GPU_PROCESS_KIND_SANDBOXED, false);
+  if (!gpu_process_host) {
+    DLOG(ERROR) << __func__ << ": Failed to get GpuProcessHost!";
+    return;
+  }
+
+  auto* gpu_service = gpu_process_host->gpu_host()->gpu_service();
+  gpu_service->UnregisterDCOMPSurfaceHandle(token);
+}
+
 }  // namespace
 
 DCOMPSurfaceRegistryBroker::DCOMPSurfaceRegistryBroker() = default;
@@ -42,11 +55,18 @@
     mojo::PlatformHandle surface_handle,
     RegisterDCOMPSurfaceHandleCallback callback) {
   DVLOG(1) << __func__;
-
   GetIOThreadTaskRunner({})->PostTask(
       FROM_HERE, base::BindOnce(&RegisterDCOMPSurfaceHandleOnIOThread,
                                 std::move(surface_handle),
                                 media::BindToCurrentLoop(std::move(callback))));
 }
 
+void DCOMPSurfaceRegistryBroker::UnregisterDCOMPSurfaceHandle(
+    const base::UnguessableToken& token) {
+  DVLOG(1) << __func__;
+  GetIOThreadTaskRunner({})->PostTask(
+      FROM_HERE,
+      base::BindOnce(&UnregisterDCOMPSurfaceHandleOnIOThread, token));
+}
+
 }  // namespace content
diff --git a/content/browser/media/dcomp_surface_registry_broker.h b/content/browser/media/dcomp_surface_registry_broker.h
index 3e3ba58..6d5ebf5 100644
--- a/content/browser/media/dcomp_surface_registry_broker.h
+++ b/content/browser/media/dcomp_surface_registry_broker.h
@@ -26,6 +26,8 @@
   void RegisterDCOMPSurfaceHandle(
       mojo::PlatformHandle surface_handle,
       RegisterDCOMPSurfaceHandleCallback callback) override;
+  void UnregisterDCOMPSurfaceHandle(
+      const base::UnguessableToken& token) override;
 };
 
 }  // namespace content
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc
index e7659966..eded688 100644
--- a/content/browser/prerender/prerender_browsertest.cc
+++ b/content/browser/prerender/prerender_browsertest.cc
@@ -376,13 +376,6 @@
   const GURL kInitialUrl = GetUrl("/empty.html");
   const GURL kPrerenderingUrl = GetUrl("/empty.html?prerender");
 
-  // TODO(https://crbug.com/1186893): PrerenderHost is not deleted when the
-  // page enters BackForwardCache, though it should be. While this functionality
-  // is not implemented, disable BackForwardCache for testing and wait for the
-  // old RenderFrameHost to be deleted after we navigate away from it.
-  DisableBackForwardCacheForTesting(
-      web_contents(), BackForwardCacheImpl::TEST_ASSUMES_NO_CACHING);
-
   ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
   int host_id = AddPrerender(kPrerenderingUrl);
 
@@ -2757,38 +2750,23 @@
 
 // End: Tests for feature restrictions in prerendered pages ====================
 
-// Tests prerendering for low-end devices.
-class PrerenderLowMemoryBrowserTest : public PrerenderBrowserTest {
- public:
-  PrerenderLowMemoryBrowserTest() {
-    // Set the value of memory threshold more than the physical memory.  The
-    // test will expect that prerendering does not occur.
-    std::string memory_threshold =
-        base::NumberToString(base::SysInfo::AmountOfPhysicalMemoryMB() + 1);
-    feature_list_.InitWithFeaturesAndParameters(
-        {{blink::features::kPrerender2,
-          {{blink::features::kPrerender2MemoryThresholdParamName,
-            memory_threshold}}}},
-        {});
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
 // Tests that prerendering doesn't run for low-end devices.
-IN_PROC_BROWSER_TEST_F(PrerenderLowMemoryBrowserTest, NoPrerender) {
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, LowEndDevice) {
   base::HistogramTester histogram_tester;
   const GURL kInitialUrl = GetUrl("/empty.html");
   const GURL kPrerenderingUrl = GetUrl("/empty.html?prerender");
 
+  // Set low-end device mode.
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kEnableLowEndDeviceMode);
+
   // Attempt to prerender.
   test::PrerenderHostRegistryObserver observer(*web_contents_impl());
   ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
   AddPrerenderAsync(kPrerenderingUrl);
-  observer.WaitForTrigger(kPrerenderingUrl);
 
   // It should fail.
+  observer.WaitForTrigger(kPrerenderingUrl);
   EXPECT_FALSE(HasHostForUrl(kPrerenderingUrl));
   histogram_tester.ExpectUniqueSample(
       "Prerender.Experimental.PrerenderHostFinalStatus",
@@ -2911,6 +2889,58 @@
   EXPECT_EQ(shell()->web_contents()->GetTitle(), kPrerenderingTitle);
 }
 
+// Tests that WebContentsObserver::TitleWasSet is not dispatched when title is
+// set during prerendering, but is later dispatched after activation.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, TitleWasSetWithPrerendering) {
+  const GURL kInitialUrl = GetUrl("/title2.html");
+  const GURL kPrerenderingUrlWithTitle = GetUrl("/simple_page.html");
+  const GURL kPrerenderingUrlWithoutTitle = GetUrl("/title1.html");
+  const std::u16string kInitialTitle(u"Title Of Awesomeness");
+  const std::u16string kPrerenderingTitle(u"OK");
+
+  // Navigate to an initial page; TitleWasSet should be called when page sets
+  // its title.
+  {
+    testing::NiceMock<MockWebContentsObserver> mock_observer(
+        shell()->web_contents());
+    EXPECT_CALL(mock_observer, TitleWasSet(testing::_));
+    ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+    EXPECT_EQ(shell()->web_contents()->GetTitle(), kInitialTitle);
+  }
+
+  // Prerender a page; TitleWasSet should not be called despite the page setting
+  // a title.
+  {
+    testing::NiceMock<MockWebContentsObserver> mock_observer(
+        shell()->web_contents());
+    EXPECT_CALL(mock_observer, TitleWasSet(testing::_)).Times(0);
+    ASSERT_NE(AddPrerender(kPrerenderingUrlWithTitle),
+              RenderFrameHost::kNoFrameTreeNodeId);
+  }
+
+  // Activate prerendered page; TitleWasSet should now be called.
+  {
+    testing::NiceMock<MockWebContentsObserver> mock_observer(
+        shell()->web_contents());
+    EXPECT_CALL(mock_observer, TitleWasSet(testing::_))
+        .WillOnce(testing::Invoke([kPrerenderingTitle](NavigationEntry* entry) {
+          EXPECT_EQ(entry->GetTitleForDisplay(), kPrerenderingTitle);
+        }));
+    NavigatePrimaryPage(kPrerenderingUrlWithTitle);
+  }
+
+  // Prerender a page without a title and then activate it; TitleWasSet should
+  // not be called.
+  {
+    testing::NiceMock<MockWebContentsObserver> mock_observer(
+        shell()->web_contents());
+    EXPECT_CALL(mock_observer, TitleWasSet(testing::_)).Times(0);
+    ASSERT_NE(AddPrerender(kPrerenderingUrlWithoutTitle),
+              RenderFrameHost::kNoFrameTreeNodeId);
+    NavigatePrimaryPage(kPrerenderingUrlWithoutTitle);
+  }
+}
+
 // Ensures WebContents::OpenURL targeting a frame in a prerendered host will
 // successfully navigate that frame.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenURLInPrerenderingFrame) {
@@ -3866,6 +3896,110 @@
   }
 }
 
+// Tests that a trigger page destroys a prerendered page when it navigates
+// forward and goes into the BFCache.
+IN_PROC_BROWSER_TEST_P(PrerenderWithBackForwardCacheBrowserTest,
+                       CancelOnAfterTriggerIsStoredInBackForwardCache_Forward) {
+  base::HistogramTester histogram_tester;
+  const GURL kInitialUrl = GetUrl("/empty.html");
+  const GURL kNextUrl = GetUrl("/empty.html?next");
+  const GURL kPrerenderingUrl = GetUrl("/empty.html?prerender");
+
+  // Navigate to an initial page.
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+  RenderFrameHostImpl* initial_frame_host = current_frame_host();
+
+  // Make a prerendered page from the initial page.
+  int host_id = AddPrerender(kPrerenderingUrl);
+  test::PrerenderHostObserver prerender_observer(*web_contents_impl(), host_id);
+
+  // Navigate the initial page to a non-prerendered page.
+  ASSERT_TRUE(NavigateToURL(shell(), kNextUrl));
+
+  // Check if the initial page is in the BFCache.
+  switch (GetParam()) {
+    case BackForwardCacheType::kDisabled:
+      // The BFCache is disabled, so the initial page is not in the BFCache.
+      ASSERT_FALSE(initial_frame_host->IsInBackForwardCache());
+      break;
+    case BackForwardCacheType::kEnabled:
+      // The BFCache is enabled but the same-site BFCache is disabled. The
+      // navigation was same-origin, so the initial page is not in the BFCache.
+      ASSERT_FALSE(IsSameSiteBackForwardCacheEnabled());
+      ASSERT_FALSE(initial_frame_host->IsInBackForwardCache());
+      break;
+    case BackForwardCacheType::kEnabledWithSameSite:
+      // The same-site BFCache is enabled, so the initial page is in the BFCache
+      // after the same-origin navigation.
+      ASSERT_TRUE(IsSameSiteBackForwardCacheEnabled());
+      ASSERT_TRUE(initial_frame_host->IsInBackForwardCache());
+      break;
+  }
+
+  // The navigation should destroy the prerendered page regardless of if the
+  // initial page was in the BFCache.
+  prerender_observer.WaitForDestroyed();
+  EXPECT_FALSE(HasHostForUrl(kPrerenderingUrl));
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus",
+      PrerenderHost::FinalStatus::kTriggerDestroyed, 1);
+}
+
+// Tests that a trigger page destroys a prerendered page when it navigates back
+// and goes into the BFCache.
+IN_PROC_BROWSER_TEST_P(PrerenderWithBackForwardCacheBrowserTest,
+                       CancelOnAfterTriggerIsStoredInBackForwardCache_Back) {
+  base::HistogramTester histogram_tester;
+  const GURL kInitialUrl = GetUrl("/empty.html");
+  const GURL kNextUrl = GetUrl("/empty.html?next");
+  const GURL kPrerenderingUrl = GetUrl("/empty.html?prerender");
+
+  // Navigate to an initial page.
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+
+  // Navigate to a next page.
+  ASSERT_TRUE(NavigateToURL(shell(), kNextUrl));
+  RenderFrameHostImpl* next_frame_host = current_frame_host();
+
+  // Make a prerendered page from the next page.
+  int host_id = AddPrerender(kPrerenderingUrl);
+  test::PrerenderHostObserver prerender_observer(*web_contents_impl(), host_id);
+
+  // Navigate back to the initial page.
+  content::TestNavigationObserver navigation_observer(web_contents());
+  shell()->GoBackOrForward(-1);
+  navigation_observer.Wait();
+  EXPECT_EQ(web_contents()->GetLastCommittedURL(), kInitialUrl);
+
+  // Check if the next page is in the BFCache.
+  switch (GetParam()) {
+    case BackForwardCacheType::kDisabled:
+      // The BFCache is disabled, so the next page is not in the BFCache.
+      ASSERT_FALSE(next_frame_host->IsInBackForwardCache());
+      break;
+    case BackForwardCacheType::kEnabled:
+      // The BFCache is enabled but the same-site BFCache is disabled. The back
+      // navigation was same-origin, so the next page is not in the BFCache.
+      ASSERT_FALSE(IsSameSiteBackForwardCacheEnabled());
+      ASSERT_FALSE(next_frame_host->IsInBackForwardCache());
+      break;
+    case BackForwardCacheType::kEnabledWithSameSite:
+      // The same-site BFCache is enabled, so the next page is in the BFCache
+      // after the same-origin back navigation.
+      ASSERT_TRUE(IsSameSiteBackForwardCacheEnabled());
+      ASSERT_TRUE(next_frame_host->IsInBackForwardCache());
+      break;
+  }
+
+  // The navigation should destroy the prerendered page regardless of if the
+  // next page was in the BFCache.
+  prerender_observer.WaitForDestroyed();
+  EXPECT_FALSE(HasHostForUrl(kPrerenderingUrl));
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus",
+      PrerenderHost::FinalStatus::kTriggerDestroyed, 1);
+}
+
 class TestSpeculationHostDelegate final : public SpeculationHostDelegate {
  public:
   TestSpeculationHostDelegate() = default;
diff --git a/content/browser/prerender/prerender_host_registry.cc b/content/browser/prerender/prerender_host_registry.cc
index 7d6f4ab..8a02633 100644
--- a/content/browser/prerender/prerender_host_registry.cc
+++ b/content/browser/prerender/prerender_host_registry.cc
@@ -8,13 +8,11 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
-#include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/system/sys_info.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/trace_event/common/trace_event_common.h"
 #include "base/trace_event/trace_conversion_helper.h"
-#include "build/build_config.h"
 #include "content/browser/prerender/prerender_metrics.h"
 #include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/renderer_host/navigation_request.h"
@@ -24,29 +22,6 @@
 
 namespace content {
 
-namespace {
-
-bool DeviceHasEnoughMemoryForPrerender() {
-  // Use the same default threshold as the back/forward cache. See comments in
-  // DeviceHasEnoughMemoryForBackForwardCache().
-  static constexpr int kDefaultMemoryThresholdMb =
-#if defined(OS_ANDROID)
-      1700;
-#else
-      0;
-#endif
-
-  // The default is overridable by field trial param.
-  int memory_threshold_mb = base::GetFieldTrialParamByFeatureAsInt(
-      blink::features::kPrerender2,
-      blink::features::kPrerender2MemoryThresholdParamName,
-      kDefaultMemoryThresholdMb);
-
-  return base::SysInfo::AmountOfPhysicalMemoryMB() > memory_threshold_mb;
-}
-
-}  // namespace
-
 PrerenderHostRegistry::PrerenderHostRegistry() {
   DCHECK(blink::features::IsPrerender2Enabled());
 }
@@ -86,8 +61,8 @@
 
   // Don't prerender on low-end devices.
   // TODO(https://crbug.com/1176120): Fallback to NoStatePrefetch
-  // since the memory requirements are different.
-  if (!DeviceHasEnoughMemoryForPrerender()) {
+  // if the memory requirements are different.
+  if (base::SysInfo::IsLowEndDevice()) {
     base::UmaHistogramEnumeration(
         "Prerender.Experimental.PrerenderHostFinalStatus",
         PrerenderHost::FinalStatus::kLowEndDevice);
diff --git a/content/browser/prerender/prerender_host_registry_unittest.cc b/content/browser/prerender/prerender_host_registry_unittest.cc
index c89676c..8a02800 100644
--- a/content/browser/prerender/prerender_host_registry_unittest.cc
+++ b/content/browser/prerender/prerender_host_registry_unittest.cc
@@ -136,16 +136,18 @@
 
 class PrerenderHostRegistryTest : public RenderViewHostImplTestHarness {
  public:
-  PrerenderHostRegistryTest() {
-    // Enable prerendering with no physical memory requirement so the test can
-    // run on any bot.
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {{blink::features::kPrerender2,
-          {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-        {});
-  }
+  PrerenderHostRegistryTest() = default;
   ~PrerenderHostRegistryTest() override = default;
 
+  void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
+    RenderViewHostImplTestHarness::SetUp();
+  }
+
+  void TearDown() override {
+    RenderViewHostImplTestHarness::TearDown();
+  }
+
   std::unique_ptr<TestWebContents> CreateWebContents(const GURL& url) {
     std::unique_ptr<TestWebContents> web_contents(TestWebContents::Create(
         GetBrowserContext(), SiteInstanceImpl::Create(GetBrowserContext())));
diff --git a/content/browser/prerender/prerender_host_unittest.cc b/content/browser/prerender/prerender_host_unittest.cc
index 0ed3496..1632c73 100644
--- a/content/browser/prerender/prerender_host_unittest.cc
+++ b/content/browser/prerender/prerender_host_unittest.cc
@@ -109,12 +109,7 @@
 class PrerenderHostTest : public RenderViewHostImplTestHarness {
  public:
   PrerenderHostTest() {
-    // Enable prerendering with no physical memory requirement so the test can
-    // run on any bot.
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {{blink::features::kPrerender2,
-          {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-        {});
+    scoped_feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
   }
 
   ~PrerenderHostTest() override = default;
diff --git a/content/browser/prerender/prerender_origin_trial_browsertest.cc b/content/browser/prerender/prerender_origin_trial_browsertest.cc
index aead06b..1c4b7d0 100644
--- a/content/browser/prerender/prerender_origin_trial_browsertest.cc
+++ b/content/browser/prerender/prerender_origin_trial_browsertest.cc
@@ -102,12 +102,7 @@
         feature_list_.InitAndDisableFeature(blink::features::kPrerender2);
         break;
       case FeatureEnabledType::kEnabled:
-        // Enable prerendering with no physical memory requirement so the test
-        // can run on any bot.
-        feature_list_.InitWithFeaturesAndParameters(
-            {{blink::features::kPrerender2,
-              {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-            {});
+        feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
         break;
       case FeatureEnabledType::kDefault:
         break;
@@ -309,7 +304,7 @@
 // Check the availability of Prerender 2 related APIs on a page with a valid
 // Origin Trial token. The following table shows the expected availability:
 // (The expected availability on the prerendered page should be same as the
-// availability on a page without a valid Origin Trial token listed above.)
+// availability on a page without a valid Oritin Trial token listed above.)
 //                |    blink::features::kPrerender2   |
 //                | disabled  | enabled   | default   |
 // ---------------|-----------|-----------|-----------|
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 8f768ecd..c115cd4 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -765,6 +765,17 @@
   return (index != -1) ? entries_[index].get() : nullptr;
 }
 
+NavigationEntryImpl*
+NavigationControllerImpl::GetEntryWithUniqueIDIncludingPending(
+    int nav_entry_id) const {
+  NavigationEntryImpl* entry = GetEntryWithUniqueID(nav_entry_id);
+  if (entry)
+    return entry;
+  return pending_entry_ && pending_entry_->GetUniqueID() == nav_entry_id
+             ? pending_entry_
+             : nullptr;
+}
+
 void NavigationControllerImpl::RegisterExistingOriginToPreventOptInIsolation(
     const url::Origin& origin) {
   for (int i = 0; i < GetEntryCount(); i++) {
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h
index 5b3ccca0..89e6057 100644
--- a/content/browser/renderer_host/navigation_controller_impl.h
+++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -226,6 +226,10 @@
 
   // Return the entry with the given unique id, or null if not found.
   NavigationEntryImpl* GetEntryWithUniqueID(int nav_entry_id) const;
+  // Same as above method, but also includes the pending entry in the search
+  // space.
+  NavigationEntryImpl* GetEntryWithUniqueIDIncludingPending(
+      int nav_entry_id) const;
 
   NavigationControllerDelegate* delegate() const { return delegate_; }
 
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 8268c707..a7476c8 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -3862,21 +3862,12 @@
     EXPECT_EQ(expected_entry_count, controller.GetEntryCount());
 
     // Do a navigation on the "child1" subframe to about:blank#foo, creating a
-    // same-document navigation. If it's a renderer-initiated navigation, the
-    // navigation will be classified as "auto", so we won't append a new
-    // NavigationEntry, and instead update the current NavigationEntry. However,
-    // if it's a browser-initiated navigation, the navigation is classified as
-    // "new" and will create a new entry instead.
-    // TODO(rakina): Make the browser-initiated and renderer-initiated
-    // navigation case have the same behavior, once the discussion in
-    // https://github.com/whatwg/html/issues/6491 converges.
+    // same-document navigation. The navigation will do a replacement and get
+    // classified as "auto", so we won't append a new NavigationEntry, and
+    // instead update the current NavigationEntry.
     NavigateSubframeAndCheckNavigationType(
         contents(), root->child_at(subframe_index), "child2",
-        GURL("about:blank#foo"),
-        renderer_initiated() ? NAVIGATION_TYPE_AUTO_SUBFRAME
-                             : NAVIGATION_TYPE_NEW_SUBFRAME);
-    if (!renderer_initiated())
-      expected_entry_count++;
+        GURL("about:blank#foo"), NAVIGATION_TYPE_AUTO_SUBFRAME);
     EXPECT_EQ(expected_entry_count, controller.GetEntryCount());
 
     // Do a navigation on the "child2" subframe to |url_2|.
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index f38d3de..61539c9 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -1996,6 +1996,10 @@
         should_replace_current_entry_for_same_url_nav);
   }
 
+  if (ShouldReplaceCurrentEntryForNavigationFromInitialEmptyDocument()) {
+    common_params_->should_replace_current_entry = true;
+  }
+
   DCHECK(!IsNavigationStarted());
   SetState(WILL_START_REQUEST);
   is_navigation_started_ = true;
@@ -5983,7 +5987,7 @@
                     : net::HttpResponseInfo::ConnectionInfo();
 }
 
-bool NavigationRequest::IsInMainFrame() {
+bool NavigationRequest::IsInMainFrame() const {
   return frame_tree_node()->IsMainFrame();
 }
 
@@ -5991,7 +5995,7 @@
   return IsInMainFrame() ? nullptr : frame_tree_node()->parent();
 }
 
-bool NavigationRequest::IsInPrimaryMainFrame() {
+bool NavigationRequest::IsInPrimaryMainFrame() const {
   return IsInMainFrame() &&
          frame_tree_node()->frame_tree()->type() == FrameTree::Type::kPrimary;
 }
@@ -6254,14 +6258,8 @@
   if (nav_entry_id_ == 0)
     return nullptr;
 
-  NavigationControllerImpl* controller = GetNavigationController();
-  NavigationEntry* entry = controller->GetEntryWithUniqueID(nav_entry_id_);
-  if (entry)
-    return entry;
-  return (controller->GetPendingEntry() &&
-          controller->GetPendingEntry()->GetUniqueID() == nav_entry_id_)
-             ? controller->GetPendingEntry()
-             : nullptr;
+  return GetNavigationController()->GetEntryWithUniqueIDIncludingPending(
+      nav_entry_id_);
 }
 
 int NavigationRequest::GetNavigationEntryOffset() {
@@ -6445,7 +6443,8 @@
                             .value;
   if (coop_value ==
           network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep &&
-      !CompatibleWithCrossOriginIsolated(cross_origin_embedder_policy_)) {
+      !CompatibleWithCrossOriginIsolated(cross_origin_embedder_policy_) &&
+      !anonymous()) {
     NOTREACHED();
     base::debug::DumpWithoutCrashing();
     return false;
@@ -6810,6 +6809,44 @@
   return true;
 }
 
+bool NavigationRequest::
+    ShouldReplaceCurrentEntryForNavigationFromInitialEmptyDocument() const {
+  DCHECK_LE(state_, WILL_START_NAVIGATION);
+
+  // Never replace if there is no NavigationEntry to replace.
+  if (!frame_tree_node_->navigator().controller().GetEntryCount())
+    return false;
+
+  if (IsInMainFrame()) {
+    // Currently we only handle subframe initial empty document replacements.
+    // TODO(https://crbug.com/1215096): Handle main frame navigations too.
+    return false;
+  }
+
+  if (!frame_tree_node_
+           ->is_on_initial_empty_document_or_subsequent_empty_documents()) {
+    // Return if we're not on the initial empty document (or subsequent empty
+    // documents).
+    // TODO(https://crbug.com/1215096): Only replace when we're on the initial
+    // empty document (don't replace on subsequent empty documents).
+    return false;
+  }
+
+  if (common_params_->navigation_type !=
+          blink::mojom::NavigationType::SAME_DOCUMENT &&
+      common_params_->navigation_type !=
+          blink::mojom::NavigationType::DIFFERENT_DOCUMENT) {
+    // History navigations, session restore, and reloads shouldn't do
+    // replacement.
+    return false;
+  }
+
+  // If the navigation explicitly requested for history list clearing (e.g. when
+  // running layout tests), don't do a replacement (since there won't be any
+  // entry to replace after the navigation).
+  return !commit_params_->should_clear_history_list;
+}
+
 bool NavigationRequest::ShouldReplaceCurrentEntryForFailedNavigation() const {
   DCHECK(state_ == CANCELING || state_ == WILL_FAIL_REQUEST);
 
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 83ef668e..10a7d40 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -270,8 +270,8 @@
   const GURL& GetURL() override;
   SiteInstanceImpl* GetStartingSiteInstance() override;
   SiteInstanceImpl* GetSourceSiteInstance() override;
-  bool IsInMainFrame() override;
-  bool IsInPrimaryMainFrame() override;
+  bool IsInMainFrame() const override;
+  bool IsInPrimaryMainFrame() const override;
   bool IsInPrerenderedMainFrame() override;
   bool IsPrerenderedPageActivation() override;
   bool IsRendererInitiated() override;
@@ -1418,6 +1418,10 @@
   // or not. Called when the navigation just started.
   bool ShouldReplaceCurrentEntryForSameUrlNavigation() const;
 
+  // Whether this navigation happens on the initial empty document, and thus
+  // should replace the current entry.  Called when the navigation just started.
+  bool ShouldReplaceCurrentEntryForNavigationFromInitialEmptyDocument() const;
+
   // Whether a failed navigation should replace the current entry or not. Called
   // when an error page is about to be committed.
   bool ShouldReplaceCurrentEntryForFailedNavigation() const;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 488ce4c1..80962e9c 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -2668,13 +2668,13 @@
   return nullptr;
 }
 
-WebContents* RenderFrameHostImpl::AccessibilityWebContents() {
+RenderFrameHostImpl* RenderFrameHostImpl::AccessibilityRenderFrameHost() {
   // If this method is called when the frame is in BackForwardCache, evict
   // the frame to avoid ignoring any accessibility related events which are not
   // expected.
   if (IsInactiveAndDisallowActivation())
     return nullptr;
-  return delegate()->GetAsWebContents();
+  return this;
 }
 
 void RenderFrameHostImpl::AccessibilityHitTest(
@@ -9418,7 +9418,8 @@
 #endif  // !defined(OS_ANDROID)
 }
 
-bool IsInitialEmptyCommit(const GURL& url, bool has_committed_real_load) {
+bool IsInitialSynchronousAboutBlankCommit(const GURL& url,
+                                          bool has_committed_real_load) {
   return url.SchemeIs(url::kAboutScheme) && url != GURL(url::kAboutSrcdocURL) &&
          !has_committed_real_load;
 }
@@ -9438,12 +9439,12 @@
   // This function must only be called when there are no NavigationRequests for
   // a navigation can be found at DidCommit time, which can only happen in two
   // cases:
-  // 1) This was a renderer-initiated navigation to the initial empty
-  // document.
+  // 1) This was a synchronous renderer-initiated navigation to about:blank
+  // after the initial empty document.
   // 2) This was a renderer-initiated same-document navigation.
-  DCHECK(
-      IsInitialEmptyCommit(url, frame_tree_node_->has_committed_real_load()) ||
-      is_same_document);
+  DCHECK(IsInitialSynchronousAboutBlankCommit(
+             url, frame_tree_node_->has_committed_real_load()) ||
+         is_same_document);
   DCHECK(!is_same_document_history_api_navigation || is_same_document);
 
   net::IsolationInfo isolation_info = ComputeIsolationInfoInternal(
@@ -9939,9 +9940,10 @@
   // the synchronous about:blank commit can actually go through (e.g. check
   // if the frame's initial empty document state, instead of checking the
   // less-accurate `has_committed_real_load`).
-  const bool is_initial_empty_commit = IsInitialEmptyCommit(
-      params->url, frame_tree_node_->has_committed_real_load());
-  if (!navigation_request && !is_initial_empty_commit &&
+  const bool is_synchronous_about_blank_commit =
+      IsInitialSynchronousAboutBlankCommit(
+          params->url, frame_tree_node_->has_committed_real_load());
+  if (!navigation_request && !is_synchronous_about_blank_commit &&
       !is_same_document_navigation) {
     LogCannotCommitUrlCrashKeys(params->url, is_same_document_navigation,
                                 navigation_request.get());
@@ -10005,7 +10007,7 @@
     // If there is no valid NavigationRequest corresponding to this commit,
     // create one in order to properly issue DidFinishNavigation calls to
     // WebContentsObservers.
-    DCHECK(is_initial_empty_commit || is_same_document_navigation);
+    DCHECK(is_synchronous_about_blank_commit || is_same_document_navigation);
 
     // Fill the redirect chain for the NavigationRequest. Since this is only for
     // initial empty commits or same-document navigation, we should just push
@@ -11035,109 +11037,18 @@
 
 bool CalculateShouldReplaceCurrentEntry(
     NavigationRequest* request,
-    const mojom::DidCommitSameDocumentNavigationParamsPtr same_document_params,
-    FrameTreeNode* node) {
-  // We want to predict the value of DidCommitProvisionalLoadParams'
-  // should_replace_current_entry. We use the value from CommonNavigationParams
-  // to start off. This is what the browser sent the renderer at commit time,
-  // but the actual result that came back from the renderer after commit might
-  // be because of various decisions made by the renderer, which are considered
-  // below.
-  bool result = request->common_params().should_replace_current_entry;
-
-  // -- Prepare the values needed for prediction.
-  const bool is_restore =
-      NavigationTypeUtils::IsRestore(request->common_params().navigation_type);
-  const bool is_history =
-      NavigationTypeUtils::IsHistory(request->common_params().navigation_type);
-  const bool is_reload =
-      NavigationTypeUtils::IsReload(request->common_params().navigation_type);
-  const bool has_valid_page_state = (blink::PageState::CreateFromEncodedData(
-                                         request->commit_params().page_state)
-                                         .IsValid());
-  const bool is_error_page = (request->GetNetErrorCode() != net::OK);
-
-  // The navigation URL used by the renderer during commit time (the url in
-  // WebNavigationParams and DocumentLoader) before finishing the commit will be
-  // the original URL before redirects instead of the final URL, except for:
-  // - Error pages, where kUnreachableWebDataURL is used.
-  // - loadDataWithBaseURL, where the base URL is used.
-  // See RenderFrameImpl's CommitNavigation(), CommitFailedNavigation() and
-  // FillNavigationParamsRequest() for more details.
-  GURL original_url;
-  if (is_error_page) {
-    original_url = GURL(kUnreachableWebDataURL);
-  } else if (request->IsNavigationTreatedAsLoadDataWithBaseURLInTheRenderer()) {
-    original_url = request->common_params().base_url_for_data_url;
-  } else {
-    original_url = !request->commit_params().original_url.is_empty()
-                       ? request->commit_params().original_url
-                       : request->common_params().url;
-  }
-
-  // Predict if the renderer classified the navigation as a "back/forward"
-  // navigation (WebFrameLoadType::kBackForward).
-  bool will_be_classified_as_back_forward_navigation = false;
-  if (is_error_page) {
-    // For error pages, whenever the navigation has a valid PageState, it will
-    // be considered as a back/forward navigation. This includes history
-    // navigations and restores. See RenderFrameImpl's CommitFailedNavigation().
-    will_be_classified_as_back_forward_navigation = has_valid_page_state;
-  } else {
-    // For normal navigations, RenderFrameImpl's NavigationTypeToLoadType()
-    // will classify a navigation as kBackForward if it's a history navigation,
-    // or if it's a restore navigation with valid PageState.
-    will_be_classified_as_back_forward_navigation =
-        is_history || (is_restore && has_valid_page_state);
-  }
-
-  // -- Now we have all the information we need to determine the final value of
-  // should_replace_current_entry.
-  if (same_document_params) {
-    // If this is a synchronous renderer commit (a same-document navigation
-    // initiated by a same-process frame), the NavigationRequest will be
-    // constructed at commit time, so the value from  CommonNavigationParams
-    // must be correct.
-    if (request->is_synchronous_renderer_commit())
-      return result;
-    // DocumentLoader::UpdateForSameDocumentNavigation() sets the "replace"
-    // bit to true for anything that's not WebFrameLoadType::kStandard. We
-    // know if it's classified as kBackForward through
-    // |will_be_classified_as_back_forward_navigation|. Meanwhile,
-    // kReplaceCurrentItem will only be true when
-    // `should_replace_current_entry` in CommonNavigationParams is true, or if
-    // this is a synchronous same-URL commit, both of which should already be
-    // handled.
-    result |= will_be_classified_as_back_forward_navigation;
-  } else {
-    // Simulate FrameLoader::DetermineFrameLoadType()'s handling of
-    // navigations after the subframe's initial empty document.
-    if (!will_be_classified_as_back_forward_navigation && !is_reload) {
-      // Non-back-forward/reload navigations on a subframe's initial empty
-      // document will result in replacement.
-      result |=
-          (!node->IsMainFrame() &&
-           node->is_on_initial_empty_document_or_subsequent_empty_documents());
-    }
-  }
-
-  // Simulate FrameLoader::DetermineFrameLoadType()'s handling of navigations on
-  // a main frame when the history length is 0. If the navigation is not the
-  // to an empty URL on a newly opened window, it will be turned into a standard
-  // non-replacement commit.
-  if (node->IsMainFrame() &&
-      request->commit_params().current_history_list_length == 0 &&
-      (!original_url.is_empty() || !node->opener())) {
-    result = false;
-  }
-
-  // Note that we won't simulate FrameLoader::DetermineFrameLoadType()'s
-  // handling of same-URL navigations here as it's not needed: only standard
-  // commits (which excludes back/forward navigations and replacements) will be
-  // converted to reloads, and the reloads will have
-  // should_replace_current_entry == false, same as standard commits that don't
-  // get converted.
-  return result;
+    const mojom::DidCommitProvisionalLoadParams& params) {
+  // A Renderer-initiated same-document navigation is not known to the browser
+  // before it committed and whether it does replacement or not is not
+  // predictable, so we need to use the renderer-supplied value, and in the
+  // future move |should_replace_current_entry| from
+  // DidCommitProvisionalLoadParams to DidCommitSameDocumentNavigationParams.
+  // For other navigations, the CommonNavigationParams' value supplied by the
+  // browser to the renderer at commit time can be used, as the renderer will
+  // always follow it.
+  return request->IsSameDocument()
+             ? params.should_replace_current_entry
+             : request->common_params().should_replace_current_entry;
 }
 
 // Calculates the "loading" URL for a given navigation. This tries to replicate
@@ -11333,8 +11244,7 @@
       (params.gesture == NavigationGesture::NavigationGestureUser);
 
   const bool browser_should_replace_current_entry =
-      CalculateShouldReplaceCurrentEntry(request, same_document_params.Clone(),
-                                         frame_tree_node_);
+      CalculateShouldReplaceCurrentEntry(request, params);
 
   const GURL browser_url = CalculateLoadingURL(
       request, params, renderer_url_info_, is_error_page_, last_committed_url_);
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 53ae0467..09bf4d6 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -468,7 +468,7 @@
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
       override;
-  WebContents* AccessibilityWebContents() override;
+  RenderFrameHostImpl* AccessibilityRenderFrameHost() override;
   void AccessibilityHitTest(
       const gfx::Point& point_in_frame_pixels,
       ax::mojom::Event opt_event_to_fire,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 2f0cb9d..8e2e5085 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2609,6 +2609,16 @@
       registry.get(),
       base::BindRepeating(&RenderProcessHostImpl::BindPluginRegistry,
                           weak_factory_.GetWeakPtr()));
+#else
+  if (base::FeatureList::IsEnabled(
+          features::kNavigationThreadingOptimizations)) {
+    // On platforms where plugins are disabled, the PluginRegistry interface is
+    // never bound. This still results in posting a task on the UI thread to
+    // look for the interface which can be slow. Instead, drop the interface
+    // immediately on the IO thread by binding en empty interface handler.
+    registry->AddInterface(base::BindRepeating(
+        [](mojo::PendingReceiver<blink::mojom::PluginRegistry> receiver) {}));
+  }
 #endif
 
 #if BUILDFLAG(ENABLE_LIBRARY_CDMS)
diff --git a/content/browser/screen_orientation/screen_orientation_browsertest.cc b/content/browser/screen_orientation/screen_orientation_browsertest.cc
index 071f6d0..91cfc6d 100644
--- a/content/browser/screen_orientation/screen_orientation_browsertest.cc
+++ b/content/browser/screen_orientation/screen_orientation_browsertest.cc
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "content/browser/prerender/prerender_host_registry.h"
@@ -431,6 +432,7 @@
       : prerender_helper_(base::BindRepeating(
             &ScreenOrientationLockForPrerenderBrowserTest::web_contents,
             base::Unretained(this))) {
+    feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
   }
 
   // ScreenOrientationBrowserTest:
@@ -443,6 +445,7 @@
 
  protected:
   test::PrerenderTestHelper prerender_helper_;
+  base::test::ScopedFeatureList feature_list_;
 };
 
 class FakeScreenOrientationDelegate : public ScreenOrientationDelegate {
diff --git a/content/browser/speculation_rules/speculation_host_impl_unittest.cc b/content/browser/speculation_rules/speculation_host_impl_unittest.cc
index 31de369c..5124c013 100644
--- a/content/browser/speculation_rules/speculation_host_impl_unittest.cc
+++ b/content/browser/speculation_rules/speculation_host_impl_unittest.cc
@@ -30,12 +30,7 @@
 class SpeculationHostImplTest : public RenderViewHostImplTestHarness {
  public:
   SpeculationHostImplTest() {
-    // Enable prerendering with no physical memory requirement so the test can
-    // run on any bot.
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {{blink::features::kPrerender2,
-          {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-        {});
+    scoped_feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
   }
 
   void SetUp() override {
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 5b481dd..e9d924e 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1837,27 +1837,7 @@
     }
   }
 
-  // We use the title for the last committed entry rather than a pending
-  // navigation entry. For example, when the user types in a URL, we want to
-  // keep the old page's title until the new load has committed and we get a new
-  // title.
-  NavigationEntry* entry = GetController().GetLastCommittedEntry();
-
-  // We make an exception for initial navigations. We only want to use the title
-  // from the visible entry if:
-  // 1. The pending entry has been explicitly assigned a title to display.
-  // 2. The user is doing a history navigation in a new tab (e.g., Ctrl+Back),
-  //    which case there is a pending entry index other than -1.
-  //
-  // Otherwise, we want to stick with the last committed entry's title during
-  // new navigations, which have pending entries at index -1 with no title.
-  if (GetController().IsInitialNavigation() &&
-      ((GetController().GetVisibleEntry() &&
-        !GetController().GetVisibleEntry()->GetTitle().empty()) ||
-       GetController().GetPendingEntryIndex() != -1)) {
-    entry = GetController().GetVisibleEntry();
-  }
-
+  NavigationEntry* entry = GetNavigationEntryForTitle();
   if (entry) {
     return entry->GetTitleForDisplay();
   }
@@ -5484,6 +5464,16 @@
       UpdateFaviconURL(rfhi, rfhi->FaviconURLs());
       OnManifestUrlChanged(rfhi->GetPage());
     }
+
+    // The page might have set its title while prerendering, and if it was, we
+    // skipped notifying observers then, and we need to notify them now after
+    // the page is activated.
+    DCHECK(navigation_handle->IsInPrimaryMainFrame());
+    NavigationEntryImpl* entry = GetController().GetLastCommittedEntry();
+    DCHECK(entry);
+    if (!entry->GetTitle().empty()) {
+      NotifyTitleUpdateForEntry(entry);
+    }
   }
 }
 
@@ -6306,15 +6296,26 @@
                                           const std::u16string& title) {
   OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::UpdateTitleForEntry",
                         "title", title);
+  NavigationEntryImpl* entry_impl =
+      NavigationEntryImpl::FromNavigationEntry(entry);
+  bool title_changed = UpdateTitleForEntryImpl(entry_impl, title);
+  if (title_changed)
+    NotifyTitleUpdateForEntry(entry_impl);
+}
+
+bool WebContentsImpl::UpdateTitleForEntryImpl(NavigationEntryImpl* entry,
+                                              const std::u16string& title) {
   std::u16string final_title;
   base::TrimWhitespace(title, base::TRIM_ALL, &final_title);
 
   // If a page is created via window.open and never navigated,
   // there will be no navigation entry. In this situation,
   // |page_title_when_no_navigation_entry_| will be used for page title.
+  // For a title update from a non-primary frame tree, |entry| will always be
+  // non-null.
   if (entry) {
     if (final_title == entry->GetTitle())
-      return;  // Nothing changed, don't bother.
+      return false;  // Nothing changed, don't bother.
 
     entry->SetTitle(final_title);
 
@@ -6322,22 +6323,58 @@
     final_title = entry->GetTitleForDisplay();
   } else {
     if (page_title_when_no_navigation_entry_ == final_title)
-      return;  // Nothing changed, don't bother.
+      return false;  // Nothing changed, don't bother.
 
     page_title_when_no_navigation_entry_ = final_title;
   }
+  return true;
+}
 
-  // Lastly, set the title for the view.
-  view_->SetPageTitle(final_title);
+void WebContentsImpl::NotifyTitleUpdateForEntry(NavigationEntryImpl* entry) {
+  // |entry|, if non-null, must belong to the primary frame tree's
+  // NavigationController.
+  DCHECK(!entry || GetController().GetEntryWithUniqueIDIncludingPending(
+                       entry->GetUniqueID()));
+  std::u16string final_title = entry ? entry->GetTitleForDisplay()
+                                     : page_title_when_no_navigation_entry_;
+  bool did_web_contents_title_change = entry == GetNavigationEntryForTitle();
+  if (did_web_contents_title_change)
+    view_->SetPageTitle(final_title);
 
   {
     SCOPED_UMA_HISTOGRAM_TIMER("WebContentsObserver.TitleWasSet");
     observers_.NotifyObservers(&WebContentsObserver::TitleWasSet, entry);
   }
-  if (entry == GetController().GetEntryAtOffset(0))
+
+  if (did_web_contents_title_change)
     NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE);
 }
 
+NavigationEntry* WebContentsImpl::GetNavigationEntryForTitle() {
+  // We use the title for the last committed entry rather than a pending
+  // navigation entry. For example, when the user types in a URL, we want to
+  // keep the old page's title until the new load has committed and we get a new
+  // title.
+  NavigationEntry* entry = GetController().GetLastCommittedEntry();
+
+  // We make an exception for initial navigations. We only want to use the title
+  // from the visible entry if:
+  // 1. The pending entry has been explicitly assigned a title to display.
+  // 2. The user is doing a history navigation in a new tab (e.g., Ctrl+Back),
+  //    which case there is a pending entry index other than -1.
+  //
+  // Otherwise, we want to stick with the last committed entry's title during
+  // new navigations, which have pending entries at index -1 with no title.
+  if (GetController().IsInitialNavigation() &&
+      ((GetController().GetVisibleEntry() &&
+        !GetController().GetVisibleEntry()->GetTitle().empty()) ||
+       GetController().GetPendingEntryIndex() != -1)) {
+    entry = GetController().GetVisibleEntry();
+  }
+
+  return entry;
+}
+
 void WebContentsImpl::SendChangeLoadProgress() {
   OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::SendChangeLoadProgress",
                         "load_progress", frame_tree_.load_progress());
@@ -7370,23 +7407,23 @@
   OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::UpdateTitle",
                         "render_frame_host", render_frame_host, "title", title);
   // Try to find the navigation entry, which might not be the current one.
-  // For example, it might be from a recently swapped out RFH.
+  // For example, it might be from a pending deletion RFH, or it might be from a
+  // non-primary frame tree.
   NavigationEntryImpl* entry =
       render_frame_host->frame_tree()->controller().GetEntryWithUniqueID(
           render_frame_host->nav_entry_id());
 
   // We can handle title updates when we don't have an entry in
   // UpdateTitleForEntry, but only if the update is from the current RFH.
-  // This check also makes sure that we only update the title for the primary
-  // main frame in case of multiple FrameTrees (MPArch) as GetMainFrame returns
-  // the main frame for the FrameTree owned by this WebContents (i.e. primary
-  // FrameTree)
   if (!entry && render_frame_host != GetMainFrame())
     return;
 
   // TODO(evan): make use of title_direction.
   // http://code.google.com/p/chromium/issues/detail?id=27094
-  UpdateTitleForEntry(entry, title);
+  bool title_changed = UpdateTitleForEntryImpl(entry, title);
+  if (title_changed && render_frame_host == GetMainFrame()) {
+    NotifyTitleUpdateForEntry(entry);
+  }
 }
 
 void WebContentsImpl::UpdateTargetURL(RenderFrameHostImpl* render_frame_host,
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 3a7d822..6921352 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1799,6 +1799,23 @@
   // to be alive.
   void NotifyPrimaryMainFrameProcessIsAlive();
 
+  // If |entry| is null, this method updates the WebContents' fallback title for
+  // when there is no navigation entry (i.e. when GetNavigationEntryForTitle()
+  // returns nullptr), otherwise updates |entry|'s title. If defined, |entry|
+  // must belong to the WebContents' primary NavigationController. Returns true
+  // if the title (entry's or fallback) was changed, false otherwise.
+  bool UpdateTitleForEntryImpl(NavigationEntryImpl* entry,
+                               const std::u16string& title);
+  // Dispatches WebContentsObserver::TitleWasSet and also notifies the delegate
+  // of a title change if |entry| is the entry whose title is being used as the
+  // display title.
+  void NotifyTitleUpdateForEntry(NavigationEntryImpl* entry);
+  // Returns the navigation entry whose title is used as the display title for
+  // this WebContents (i.e. for WebContents::GetTitle()). This value can be
+  // null, in which case a fallback title is used (see
+  // |page_title_when_no_navigation_entry_|).
+  NavigationEntry* GetNavigationEntryForTitle();
+
   // Data for core operation ---------------------------------------------------
 
   // Delegate for notifying our owner about stuff. Not owned by us.
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 51c924f..2427e7e 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -231,6 +231,27 @@
   DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver);
 };
 
+class MockWebContentsDelegate : public WebContentsDelegate {
+ public:
+  explicit MockWebContentsDelegate(
+      blink::ProtocolHandlerSecurityLevel security_level =
+          blink::ProtocolHandlerSecurityLevel::kStrict)
+      : security_level_(security_level) {}
+  MOCK_METHOD2(HandleContextMenu,
+               bool(RenderFrameHost*, const ContextMenuParams&));
+  MOCK_METHOD4(RegisterProtocolHandler,
+               void(RenderFrameHost*, const std::string&, const GURL&, bool));
+  MOCK_METHOD(void, NavigationStateChanged, (WebContents*, InvalidateTypes));
+
+  blink::ProtocolHandlerSecurityLevel GetProtocolHandlerSecurityLevel(
+      RenderFrameHost*) override {
+    return security_level_;
+  }
+
+ private:
+  blink::ProtocolHandlerSecurityLevel security_level_;
+};
+
 // Pretends to be a normal browser that receives toggles and transitions to/from
 // a fullscreened state.
 class FakeFullscreenDelegate : public WebContentsDelegate {
@@ -332,6 +353,13 @@
 
 }  // namespace
 
+TEST_F(WebContentsImplTest, SetMainFrameMimeType) {
+  ASSERT_TRUE(controller().IsInitialNavigation());
+  std::string mime = "text/html";
+  main_test_rfh()->GetPage().SetContentsMimeType(mime);
+  EXPECT_EQ(mime, contents()->GetContentsMimeType());
+}
+
 TEST_F(WebContentsImplTest, UpdateTitle) {
   FakeWebContentsDelegate fake_delegate;
   contents()->SetDelegate(&fake_delegate);
@@ -372,38 +400,57 @@
   EXPECT_EQ(title, contents()->GetTitle());
 }
 
-TEST_F(WebContentsImplTest, SetMainFrameMimeType) {
-  ASSERT_TRUE(controller().IsInitialNavigation());
-  std::string mime = "text/html";
-  main_test_rfh()->GetPage().SetContentsMimeType(mime);
-  EXPECT_EQ(mime, contents()->GetContentsMimeType());
-}
-
-TEST_F(WebContentsImplTest, DontUseTitleFromPendingEntry) {
+TEST_F(WebContentsImplTest, UpdateTitleWhileFirstNavigationIsPending) {
   const GURL kGURL(GetWebUIURL("blah"));
-  controller().LoadURL(
-      kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
-  EXPECT_EQ(std::u16string(), contents()->GetTitle());
-
-  // Also test setting title while the first navigation is still pending.
+  controller().LoadURL(kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED,
+                       std::string());
+  ASSERT_TRUE(!!controller().GetPendingEntry());
   const std::u16string title = u"Initial Entry Title";
   contents()->UpdateTitle(main_test_rfh(), title, base::i18n::LEFT_TO_RIGHT);
   EXPECT_EQ(title, contents()->GetTitle());
 }
 
-TEST_F(WebContentsImplTest, UseTitleFromPendingEntryIfSet) {
+TEST_F(WebContentsImplTest, DontUsePendingEntryUrlAsTitle) {
   const GURL kGURL(GetWebUIURL("blah"));
-  const std::u16string title = u"My Title";
   controller().LoadURL(
       kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+  EXPECT_EQ(std::u16string(), contents()->GetTitle());
+}
 
-  NavigationEntry* entry = controller().GetVisibleEntry();
-  ASSERT_EQ(kGURL, entry->GetURL());
-  entry->SetTitle(title);
+TEST_F(WebContentsImplTest, UpdateAndUseTitleFromFirstNavigationPendingEntry) {
+  const GURL kGURL(GetWebUIURL("blah"));
+  controller().LoadURL(kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED,
+                       std::string());
 
+  MockWebContentsDelegate delegate;
+  contents()->SetDelegate(&delegate);
+  EXPECT_CALL(delegate,
+              NavigationStateChanged(contents(), INVALIDATE_TYPE_TITLE));
+
+  const std::u16string title = u"Initial Entry Title";
+  contents()->UpdateTitleForEntry(controller().GetPendingEntry(), title);
   EXPECT_EQ(title, contents()->GetTitle());
 }
 
+TEST_F(WebContentsImplTest,
+       UpdateAndDontUseTitleFromPendingEntryForSecondNavigation) {
+  const GURL first_gurl("http://www.foo.com");
+  const GURL second_gurl("http://www.bar.com");
+
+  // Complete first navigation.
+  NavigationSimulator::NavigateAndCommitFromBrowser(contents(), first_gurl);
+  std::u16string first_title = contents()->GetTitle();
+
+  // Start second navigation.
+  controller().LoadURL(second_gurl, Referrer(), ui::PAGE_TRANSITION_TYPED,
+                       std::string());
+  // We shouldn't use the title of the second navigation's pending entry, even
+  // after explicitly setting it - we only use the pending entry's title if it's
+  // for the first navigation.
+  contents()->UpdateTitleForEntry(controller().GetPendingEntry(), u"bar");
+  EXPECT_EQ(contents()->GetTitle(), first_title);
+}
+
 // Stub out local frame mojo binding. Intercepts calls to EnableViewSourceMode
 // and marks the message as received. This class attaches to the first
 // RenderFrameHostImpl created.
@@ -2684,30 +2731,6 @@
             observer.last_vertical_scroll_direction().value());
 }
 
-namespace {
-
-class MockWebContentsDelegate : public WebContentsDelegate {
- public:
-  explicit MockWebContentsDelegate(
-      blink::ProtocolHandlerSecurityLevel security_level =
-          blink::ProtocolHandlerSecurityLevel::kStrict)
-      : security_level_(security_level) {}
-  MOCK_METHOD2(HandleContextMenu,
-               bool(RenderFrameHost*, const ContextMenuParams&));
-  MOCK_METHOD4(RegisterProtocolHandler,
-               void(RenderFrameHost*, const std::string&, const GURL&, bool));
-
-  blink::ProtocolHandlerSecurityLevel GetProtocolHandlerSecurityLevel(
-      RenderFrameHost*) override {
-    return security_level_;
-  }
-
- private:
-  blink::ProtocolHandlerSecurityLevel security_level_;
-};
-
-}  // namespace
-
 TEST_F(WebContentsImplTest, HandleContextMenuDelegate) {
   MockWebContentsDelegate delegate;
   contents()->SetDelegate(&delegate);
diff --git a/content/browser/webrtc/webrtc_getusermedia_browsertest.cc b/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
index 7f633e0..e54341ff 100644
--- a/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
+++ b/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
@@ -374,7 +374,10 @@
           video_ids[0])));
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest, TwoGetUserMediaAndStop) {
+// Sheriff 2021-08-10, test is flaky.
+// See https://crbug.com/1238334.
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+                       DISABLED_TwoGetUserMediaAndStop) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 0a482b3..ae5e3076 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -235,8 +235,6 @@
     {wf::EnableDevicePosture, features::kDevicePosture},
     {wf::EnableDocumentPolicy, features::kDocumentPolicy},
     {wf::EnableDocumentPolicyNegotiation, features::kDocumentPolicyNegotiation},
-    {wf::EnableExpensiveBackgroundTimerThrottling,
-     features::kExpensiveBackgroundTimerThrottling},
     {wf::EnableFencedFrames, blink::features::kFencedFrames,
      kSetOnlyIfOverridden},
     {wf::EnableSharedStorageAPI, blink::features::kSharedStorageAPI},
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java
index bcb2b51..9aa40eae 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java
@@ -1153,7 +1153,6 @@
     @SmallTest
     @Feature({"AndroidWebView", "Android-JavaBridge"})
     @UseMethodParameter(JavaBridgeActivityTestRule.MojoTestParams.class)
-    @DisabledTest(message = "https://crbug.com/1183737")
     public void testReplaceJavascriptInterface(boolean useMojo) throws Throwable {
         class Test {
             public Test(int value) {
diff --git a/content/public/browser/navigation_handle.h b/content/public/browser/navigation_handle.h
index 85025f2..c398dee8 100644
--- a/content/public/browser/navigation_handle.h
+++ b/content/public/browser/navigation_handle.h
@@ -96,14 +96,14 @@
   // page, so consider whether you want to call IsInPrimaryMainFrame() instead.
   // See the documentation below for details. The return value remains constant
   // over the navigation lifetime.
-  virtual bool IsInMainFrame() = 0;
+  virtual bool IsInMainFrame() const = 0;
 
   // Whether the navigation is taking place in the main frame of the primary
   // frame tree. With MPArch (crbug.com/1164280), a WebContents may have
   // additional frame trees for prerendering pages in addition to the primary
   // frame tree (holding the page currently shown to the user). The return
   // value remains constant over the navigation lifetime.
-  virtual bool IsInPrimaryMainFrame() = 0;
+  virtual bool IsInPrimaryMainFrame() const = 0;
 
   // Prerender2:
   // Whether the navigation is taking place in the main frame of the
diff --git a/content/public/browser/web_contents_receiver_set.h b/content/public/browser/web_contents_receiver_set.h
index 36ba25e..55cd755 100644
--- a/content/public/browser/web_contents_receiver_set.h
+++ b/content/public/browser/web_contents_receiver_set.h
@@ -18,16 +18,6 @@
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
 
-namespace chrome_browser_net {
-class NetErrorTabHelper;
-}
-namespace printing {
-class PrintManager;
-}
-namespace subresource_redirect {
-class SubresourceRedirectObserver;
-}
-
 namespace content {
 
 class RenderFrameHost;
@@ -92,9 +82,6 @@
  private:
   WebContentsFrameReceiverSetPassKey() = default;
 
-  friend class ::chrome_browser_net::NetErrorTabHelper;
-  friend class ::printing::PrintManager;
-  friend class ::subresource_redirect::SubresourceRedirectObserver;
   friend class TestFrameInterfaceBinder;
   FRIEND_TEST_ALL_PREFIXES(WebContentsReceiverSetBrowserTest,
                            OverrideForTesting);
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index dd6c0b7..298600e 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -286,11 +286,6 @@
     "ExperimentalContentSecurityPolicyFeatures",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Throttle tasks in Blink background timer queues based on CPU budgets
-// for the background tab. Bug: https://crbug.com/639852.
-const base::Feature kExpensiveBackgroundTimerThrottling{
-    "ExpensiveBackgroundTimerThrottling", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Extra CORS safelisted headers. See https://crbug.com/999054.
 const base::Feature kExtraSafelistedRequestHeadersForOutOfBlinkCors{
     "ExtraSafelistedRequestHeadersForOutOfBlinkCors",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 91f5dd9..4f2dc38b 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -69,7 +69,6 @@
 CONTENT_EXPORT extern const base::Feature kExperimentalAccessibilityLabels;
 CONTENT_EXPORT extern const base::Feature
     kExperimentalContentSecurityPolicyFeatures;
-CONTENT_EXPORT extern const base::Feature kExpensiveBackgroundTimerThrottling;
 CONTENT_EXPORT extern const base::Feature
     kExtraSafelistedRequestHeadersForOutOfBlinkCors;
 CONTENT_EXPORT extern const base::Feature kFeaturePolicyForClientHints;
diff --git a/content/public/test/mock_navigation_handle.h b/content/public/test/mock_navigation_handle.h
index 580a73c4..878b79b 100644
--- a/content/public/test/mock_navigation_handle.h
+++ b/content/public/test/mock_navigation_handle.h
@@ -49,7 +49,7 @@
   SiteInstance* GetSourceSiteInstance() override {
     return nullptr;  // Good enough for unit tests...
   }
-  bool IsInMainFrame() override {
+  bool IsInMainFrame() const override {
     return render_frame_host_ ? !render_frame_host_->GetParent() : true;
   }
   MOCK_METHOD0(IsInPrerenderedMainFrame, bool());
@@ -62,7 +62,9 @@
     NOTIMPLEMENTED();
     return false;
   }
-  bool IsInPrimaryMainFrame() override { return is_in_primary_main_frame_; }
+  bool IsInPrimaryMainFrame() const override {
+    return is_in_primary_main_frame_;
+  }
   MOCK_METHOD0(GetFrameTreeNodeId, int());
   MOCK_METHOD0(GetPreviousRenderFrameHostId, GlobalRenderFrameHostId());
   bool IsServedFromBackForwardCache() override {
diff --git a/content/public/test/prerender_test_util.cc b/content/public/test/prerender_test_util.cc
index c19e99bb..6d521be 100644
--- a/content/public/test/prerender_test_util.cc
+++ b/content/public/test/prerender_test_util.cc
@@ -224,12 +224,7 @@
 
 PrerenderTestHelper::PrerenderTestHelper(const WebContents::Getter& fn)
     : get_web_contents_fn_(fn) {
-  // Enable prerendering with no physical memory requirement so the test can run
-  // on any bot.
-  feature_list_.InitWithFeaturesAndParameters(
-      {{blink::features::kPrerender2,
-        {{blink::features::kPrerender2MemoryThresholdParamName, "0"}}}},
-      {});
+  feature_list_.InitAndEnableFeature(blink::features::kPrerender2);
 }
 
 PrerenderTestHelper::~PrerenderTestHelper() = default;
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
index ebcc788..597d2f0 100644
--- a/content/renderer/media/media_factory.cc
+++ b/content/renderer/media/media_factory.cc
@@ -728,7 +728,6 @@
     factory_selector->AddFactory(
         RendererType::kMediaFoundation,
         std::make_unique<media::MediaFoundationRendererClientFactory>(
-            render_thread->compositor_task_runner(),
             std::move(dcomp_texture_creation_cb),
             CreateMojoRendererFactory()));
   }
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
index acb80ee7..ce325e3 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
@@ -29,4 +29,13 @@
 ++++++android.view.View name='red'
 ++++++android.view.View name='<newline>'
 ++++++android.widget.RadioButton role_description='radio button' checkable clickable focusable name='blue'
+++android.widget.GridView role_description='tree grid' clickable collection row_count=1 column_count=1
+++++android.view.View
+++++++android.view.View collection_item name='content' row_span=1 column_span=1
+++android.widget.GridView role_description='table' collection row_count=1 column_count=1
+++++android.view.View
+++++++android.view.View collection_item name='content' row_span=1 column_span=1
+++android.widget.GridView role_description='table' collection row_count=1 column_count=1
+++++android.view.View
+++++++android.view.View collection_item name='content' row_span=1 column_span=1
 ++android.widget.TextView name='Done'
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-posinset-expected-auralinux.txt
index 8319d5e..c9fc582 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-auralinux.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-auralinux.txt
@@ -33,4 +33,16 @@
 ++++++++[static] name='red'
 ++++++[static] name='<newline>'
 ++++++[radio button] name='blue' checkable:true posinset:1 setsize:1
-++[static] name='Done'
\ No newline at end of file
+++[tree table] cols=1 headers=(NONE); rows=1 headers=(NONE); caption=false; spans=(all: 1x1)
+++++[table row] posinset:2 setsize:100
+++++++[table cell] name='content' (row=0, col=0, row_span=1, col_span=1, n_row_headers=0, n_col_headers=0)
+++++++++[static] name='content'
+++[table] cols=1 headers=(NONE); rows=1 headers=(NONE); caption=false; spans=(all: 1x1)
+++++[table row]
+++++++[table cell] name='content' (row=0, col=0, row_span=1, col_span=1, n_row_headers=0, n_col_headers=0)
+++++++++[static] name='content'
+++[table] cols=1 headers=(NONE); rows=1 headers=(NONE); caption=false; spans=(all: 1x1)
+++++[table row]
+++++++[table cell] name='content' (row=0, col=0, row_span=1, col_span=1, n_row_headers=0, n_col_headers=0)
+++++++++[static] name='content'
+++[static] name='Done'
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt b/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt
index 03f1273..96bad86 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt
@@ -60,5 +60,20 @@
 ++++++++++++inlineTextBox name='<newline>'
 ++++++++++radioButton name='blue' setSize=1 posInSet=1 checkedState=false
 ++++++++++staticText ignored name='blue'
+++++++treeGrid
+++++++++row setSize=100 posInSet=2
+++++++++++cell name='content'
+++++++++++++staticText name='content'
+++++++++++++++inlineTextBox name='content'
+++++++grid
+++++++++row
+++++++++++cell name='content'
+++++++++++++staticText name='content'
+++++++++++++++inlineTextBox name='content'
+++++++table
+++++++++row
+++++++++++cell name='content'
+++++++++++++staticText name='content'
+++++++++++++++inlineTextBox name='content'
 ++++++staticText name='Done'
 ++++++++inlineTextBox name='Done'
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-mac.txt b/content/test/data/accessibility/aria/aria-posinset-expected-mac.txt
index 84514ef2..179709e 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-mac.txt
@@ -33,4 +33,28 @@
 ++++++++AXStaticText AXRoleDescription='text' AXValue='red'
 ++++++AXGroup AXRoleDescription='group' AXTitle='<newline>'
 ++++++AXRadioButton AXARIAPosInSet=1 AXARIASetSize=1 AXRoleDescription='radio button' AXTitle='blue' AXValue=0
+++AXTable AXRoleDescription='table'
+++++AXRow AXRoleDescription='row'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXColumn AXRoleDescription='column'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXGroup AXRoleDescription='group'
+++AXTable AXRoleDescription='table'
+++++AXRow AXRoleDescription='row'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXColumn AXRoleDescription='column'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXGroup AXRoleDescription='group'
+++AXTable AXRoleDescription='table'
+++++AXRow AXRoleDescription='row'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXColumn AXRoleDescription='column'
+++++++AXCell AXRoleDescription='cell'
+++++++++AXStaticText AXRoleDescription='text' AXValue='content'
+++++AXGroup AXRoleDescription='group'
 ++AXStaticText AXRoleDescription='text' AXValue='Done'
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-win.txt b/content/test/data/accessibility/aria/aria-posinset-expected-win.txt
index 7d8dd2be..8f194ed 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-win.txt
@@ -33,4 +33,16 @@
 ++++++++ROLE_SYSTEM_STATICTEXT name='red'
 ++++++ROLE_SYSTEM_WHITESPACE name='<newline>'
 ++++++ROLE_SYSTEM_RADIOBUTTON name='blue' FOCUSABLE IA2_STATE_CHECKABLE setsize:1 posinset:1 checkable:true
+++ROLE_SYSTEM_OUTLINE
+++++ROLE_SYSTEM_OUTLINEITEM setsize:100 posinset:2
+++++++ROLE_SYSTEM_CELL name='content'
+++++++++ROLE_SYSTEM_STATICTEXT name='content'
+++ROLE_SYSTEM_TABLE
+++++ROLE_SYSTEM_ROW
+++++++ROLE_SYSTEM_CELL name='content'
+++++++++ROLE_SYSTEM_STATICTEXT name='content'
+++ROLE_SYSTEM_TABLE
+++++ROLE_SYSTEM_ROW
+++++++ROLE_SYSTEM_CELL name='content'
+++++++++ROLE_SYSTEM_STATICTEXT name='content'
 ++ROLE_SYSTEM_STATICTEXT name='Done'
diff --git a/content/test/data/accessibility/aria/aria-posinset.html b/content/test/data/accessibility/aria/aria-posinset.html
index c3f3870..de9bdde 100644
--- a/content/test/data/accessibility/aria/aria-posinset.html
+++ b/content/test/data/accessibility/aria/aria-posinset.html
@@ -41,6 +41,24 @@
     <label><input type="radio" name="color" value="blue">blue</label>
   </p>
 </form>
+<div role="treegrid">
+  <!--aria-posinset and aria-setsize supported on treegrid row-->
+  <div role="row" aria-posinset="2" aria-setsize="100">
+      <div role="gridcell">content</div>
+    </div>
+</div>
+<div role="grid">
+  <!--aria-posinset and aria-setsize NOT supported on grid row-->
+  <div role="row" aria-posinset="2" aria-setsize="100">
+      <div role="gridcell">content</div>
+    </div>
+</div>
+<div role="table">
+  <!--aria-posinset and aria-setsize NOT supported on table row-->
+  <div role="row" aria-posinset="2" aria-setsize="100">
+      <div role="gridcell">content</div>
+    </div>
+</div>
 </body>
 <script>
 function loaded(){
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt
index dbdf23b1..8a61146 100644
--- a/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt
@@ -1,3 +1,3 @@
-Document
+Document Value.IsReadOnly=true
 ++Group IsControlElement=false
 ++++ComboBox ExpandCollapse.ExpandCollapseState='Collapsed' Value.IsReadOnly=false Value.Value='Mercedes Label'
diff --git a/content/test/data/accessibility/html/iframe-create-expected-uia-win.txt b/content/test/data/accessibility/html/iframe-create-expected-uia-win.txt
index abd6efa..41b319c 100644
--- a/content/test/data/accessibility/html/iframe-create-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/iframe-create-expected-uia-win.txt
@@ -1,7 +1,7 @@
 Document
 ++Group IsControlElement=false
 ++++Document
-++++++Document
+++++++Document Value.Value='about:srcdoc'
 ++++++++Group IsControlElement=false
 ++++++++++Hyperlink Name='done'
 ++++++++++++Text Name='done' IsControlElement=false
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-uia-win.txt b/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-uia-win.txt
index b01fea99..ea8e9b0 100644
--- a/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-uia-win.txt
@@ -1,4 +1,4 @@
 Document Name='done'
 ++Group IsControlElement=false
 ++++Document
-++++++Document
\ No newline at end of file
+++++++Document Value.Value='about:srcdoc'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/optgroup-expected-uia-win.txt b/content/test/data/accessibility/html/optgroup-expected-uia-win.txt
index 019326a..408fd94 100644
--- a/content/test/data/accessibility/html/optgroup-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/optgroup-expected-uia-win.txt
@@ -1,4 +1,4 @@
-Document
+Document Value.IsReadOnly=true
 ++Group IsControlElement=false
 ++++List Selection.CanSelectMultiple=false Selection.IsSelectionRequired=false Value.IsReadOnly=false
 ++++++Group Name='Enabled'
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
index 0497a7a8..138f587 100644
--- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -150,6 +150,9 @@
 crbug.com/1161570 [ mac nvidia debug ] GpuCrash_InfoForHardwareGpu [ Skip ]
 crbug.com/1161570 [ mac nvidia debug ] GpuCrash_InfoForDualHardwareGpus [ Skip ]
 
+# Flaky tab crash on Win10 x64 Debug (NVIDIA)
+crbug.com/1238162 [ win10 nvidia-0x1cb3 debug ] GpuCrash_InfoForHardwareGpu [ RetryOnFailure ]
+
 # Flaky for LaCrOS
 crbug.com/1205899 [ linux display-server-wayland ] ContextLost_WebGLBlockedAfterJSNavigation [ RetryOnFailure ]
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index af836b2..cd3243a 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -313,9 +313,6 @@
 # Fails when dcheck_always_on set to true
 [ fuchsia ] deqp/data/gles2/shaders/preprocessor.html [ Skip ]
 
-crbug.com/1238056 [ fuchsia angle-swiftshader ] conformance/ogles/GL/build/build_017_to_024.html [ Failure ]
-
-
 ####################
 # Win failures     #
 ####################
@@ -416,7 +413,6 @@
 crbug.com/angleproject/4334 [ win angle-vulkan passthrough ] conformance/textures/misc/canvas-teximage-after-multiple-drawimages.html [ Skip ]
 crbug.com/1216686 [ win angle-vulkan passthrough ] conformance/glsl/bugs/complex-glsl-does-not-crash.html [ Failure ]
 crbug.com/1216686 [ win angle-vulkan passthrough ] conformance/glsl/misc/shader-uniform-packing-restrictions.html [ Failure ]
-crbug.com/1238056 [ win angle-vulkan passthrough ] conformance/ogles/GL/build/build_017_to_024.html [ Failure ]
 
 # Vulkan / Win / NVIDIA / Passthrough command decoder
 crbug.com/963205 [ win nvidia angle-vulkan passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ Failure ]
@@ -496,7 +492,6 @@
 crbug.com/angleproject/5505 [ mac angle-metal passthrough ] conformance/ogles/GL/acos/acos_001_to_006.html [ Failure ]
 crbug.com/angleproject/5505 [ mac angle-metal passthrough ] conformance/ogles/GL/asin/asin_001_to_006.html [ Failure ]
 crbug.com/1227129 [ mac angle-metal passthrough ] conformance/glsl/misc/ternary-operators-in-initializers.html [ Failure ]
-crbug.com/1238056 [ mac angle-metal passthrough ] conformance/ogles/GL/build/build_017_to_024.html [ Failure ]
 
 # Mac / Passthrough command decoder / Metal / AMD
 crbug.com/1227767 [ bigsur amd-0x6821 angle-metal passthrough ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ]
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index e214996..c26a1a2 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -1414,7 +1414,6 @@
   }
   params->history_list_was_cleared = history_list_was_cleared_;
 
-  const bool is_history_navigation = (session_history_offset_ != 0);
   RenderFrameHostImpl* current_rfh = frame_tree_node_->current_frame_host();
 
   // See CalculateShouldReplaceCurrentEntry() in RenderFrameHostImpl on why we
@@ -1422,16 +1421,6 @@
   params->should_replace_current_entry =
       should_replace_current_entry_ ||
       (request_ && request_->common_params().should_replace_current_entry);
-  if (same_document) {
-    params->should_replace_current_entry |=
-        (is_history_navigation ||
-         current_rfh->GetLastCommittedURL() == navigation_url_);
-  } else {
-    params->should_replace_current_entry |=
-        (!frame_tree_node_->IsMainFrame() &&
-         frame_tree_node_
-             ->is_on_initial_empty_document_or_subsequent_empty_documents());
-  }
 
   if (params->should_replace_current_entry &&
       PageTransitionCoreTypeIs(transition_,
diff --git a/device/fido/cable/v2_authenticator.h b/device/fido/cable/v2_authenticator.h
index 5210f49..77963fed 100644
--- a/device/fido/cable/v2_authenticator.h
+++ b/device/fido/cable/v2_authenticator.h
@@ -60,6 +60,7 @@
     SERVER_LINK_WRONG_LENGTH = 108,
     SERVER_LINK_NOT_ON_CURVE = 109,
     NO_SCREENLOCK = 110,
+    NO_BLUETOOTH_PERMISSION = 111,
   };
 
   using MakeCredentialCallback =
diff --git a/docs/cq_quick_run.md b/docs/cq_quick_run.md
index 8b99fc4..6b579c6 100644
--- a/docs/cq_quick_run.md
+++ b/docs/cq_quick_run.md
@@ -15,6 +15,21 @@
 Ping guterman@google.com if you would like to be added to the pilot/beta. Then
 one can trigger a quick run by running either `git cl try -q` or
 `git cl upload -q`. This sets both the Quick-Run and Commit-Queue labels to 1,
-which starts a Quick Run.
+which starts a Quick Run. Setting the two labels at the same time in the Gerrit
+UI also starts a Quick Run
 
 Unlike Dry Runs, Quick Runs can't be reused for CQ+2.
+
+Quick Run starts all the builders a Dry Run would. Not all builders have the
+new test selection algorithm enabled yet, so these builders will run at their
+regular speed. Look for "use_rts: true" in the build to see which builders are
+speed optimized.
+
+
+## Known Issues
+
+Please report any Quick Run issues [here](https://bugs.chromium.org/p/chromium/issues/entry?template=Quick%20Run%20Issue)
+
+* The Gerrit integration isn't fully fleshed out yet so it's hard to tell what's
+a Quick Run vs a normal run. Also, in the future there will be a dedicated
+button in Gerrit for Quick Run, just like Dry Run and Submit.
diff --git a/docs/ui/ask/index.md b/docs/ui/ask/index.md
index 70bdcbc2..3c6999d 100644
--- a/docs/ui/ask/index.md
+++ b/docs/ui/ask/index.md
@@ -4,11 +4,9 @@
 
 ## Desktop
 
-|||---|||
-
 ### **Chat**
 
-[Slack desktop-ui Chromium Channel](https://chromium.slack.com/archives/CGL100B7H)
+[Slack #desktop-ui Chromium Channel](https://chromium.slack.com/archives/CGL100B7H)
 
 Ask short questions here.
 
@@ -29,24 +27,10 @@
 Post to [Chromium UI Discussion](https://groups.google.com/a/chromium.org/forum/#!forum/ui)
 without a Google account.
 
-|||---|||
+# Google Internal Resources
 
----
-
-Google Internal Resources
-
-|||---|||
-
-#####
-
-[Desktop UI Channel](https://chat.google.com/room/AAAA0vhHCUE)
-
-#####
-
-[Desktop UI Discussion](https://groups.google.com/a/google.com/forum/#!forum/chrome-desktop-ui)
-
-#####
-
-[chrome-desktop-ui@google.com](mailto:chrome-desktop-ui@google.com)
-
-|||---|||
+* [Desktop UI Channel](https://chat.google.com/room/AAAA0vhHCUE)
+* [Desktop UI Discussion](https://groups.google.com/a/google.com/forum/#!forum/chrome-desktop-ui)
+* [chrome-desktop-ui@google.com](mailto:chrome-desktop-ui@google.com)
+* [Desktop UI Process](go/cr-ui-process) (internal) has guidance for planning
+  medium-to-large-scale projects.
diff --git a/docs/ui/learn/bestpractices/prepare_for_code_review.md b/docs/ui/learn/bestpractices/prepare_for_code_review.md
new file mode 100644
index 0000000..8af78919
--- /dev/null
+++ b/docs/ui/learn/bestpractices/prepare_for_code_review.md
@@ -0,0 +1,31 @@
+# Prepare for Code Review
+
+* Use a //chrome/browser/ui/views/OWNERS owner when making substantial UI
+  changes in order to ensure consistency with best practices **preferably via
+  chromium-chrome-browser-ui-views-reviews@google.com** for changes in
+  ``//chrome/browser/ui/views`. Hopefully your reviewer will know when to loop
+  them in, but please do so proactively as well. This is good practice even if
+  you have OWNERS approval from a subdirectory as that owner may be more
+  familiar with the feature than UI best practices.
+* If you're doing something that the framework doesn't seem to support, or is
+  hard/complex, it probably means you shouldn't do it. Work with your UI dev
+  contact at this point to resolve this (if you have one), or ask in the
+  `#desktop-ui` Slack. This may require revisions to mocks if they are doing
+  something that should not be supported.
+* Hard-coded constants (colors, spacing values, etc.) are code smells; avoid at
+  all costs. Become friends with
+  [ThemeProvider](/ui/base/theme_provider.h) and
+  [LayoutProvider](/ui/views/layout/layout_provider.h).
+* Use a screen reader to navigate through the UI to make sure it's accessible.
+  Make sure all items are correctly labeled / read out by the screenreader.
+  *TODO([crbug.com/1238153](crbug.com/1238153)): Follow up with detailed
+  instructions for getting started as part off a11y documentation and link those
+  here.*
+* Make sure your UI looks OK in OS dark mode and Incognito (including color
+  contrast).
+* Make sure your UI doesn't break if the strings are extra long (as they will be
+  in some translations). Easiest way to do this is to modify the strings
+  manually to double or triple their length.
+* When you post UI code for review, include screenshots. The best way to do this
+  is posting before (if relevant) and after screenshots as attachments on the
+  linked bug. Mention this in the review.
\ No newline at end of file
diff --git a/docs/ui/learn/index.md b/docs/ui/learn/index.md
index 8e7413f..3806df5 100644
--- a/docs/ui/learn/index.md
+++ b/docs/ui/learn/index.md
@@ -1,5 +1,12 @@
 # Learning about Chromium UI
 
+# Getting Started
+
+* As always, feel free to [reach out](/docs/ui/ask/index.md). We're happy to
+  assist!
+* [Prepare your code for review](bestpractices/prepare_for_code_review.md):
+  Common feedback during code review and how to address it.
+
 # Best Practices
 
 * [Colors](bestpractices/colors.md): How to work with Chromium colors.
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc
index d4793b28..2c8e6e7 100644
--- a/extensions/browser/extension_function.cc
+++ b/extensions/browser/extension_function.cc
@@ -186,9 +186,8 @@
   base::RecordAction(base::UserMetricsAction("BadMessageTerminate_EFD"));
   // Track the specific function's |histogram_value|, as this may indicate a
   // bug in that API's implementation.
-  UMA_HISTOGRAM_ENUMERATION("Extensions.BadMessageFunctionName",
-                            histogram_value,
-                            extensions::functions::ENUM_BOUNDARY);
+  base::UmaHistogramSparse("Extensions.BadMessageFunctionName",
+                           histogram_value);
 }
 
 template <class T>
diff --git a/fuchsia/engine/browser/navigation_policy_throttle_unittest.cc b/fuchsia/engine/browser/navigation_policy_throttle_unittest.cc
index 0e7a16a..9c9518b5 100644
--- a/fuchsia/engine/browser/navigation_policy_throttle_unittest.cc
+++ b/fuchsia/engine/browser/navigation_policy_throttle_unittest.cc
@@ -42,7 +42,7 @@
 
   void set_is_main_frame(bool is_main_frame) { is_main_frame_ = is_main_frame; }
 
-  bool IsInMainFrame() override { return is_main_frame_; }
+  bool IsInMainFrame() const override { return is_main_frame_; }
 
  private:
   bool is_main_frame_ = true;
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc
index 054f7a7..9cb9096 100644
--- a/headless/lib/browser/headless_content_browser_client.cc
+++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -58,6 +58,10 @@
 #include "content/public/browser/navigation_throttle.h"
 #endif  // defined(HEADLESS_USE_POLICY)
 
+#if BUILDFLAG(ENABLE_PRINTING)
+#include "headless/lib/browser/headless_print_manager.h"
+#endif  // defined(ENABLE_PRINTING)
+
 namespace headless {
 
 namespace {
@@ -185,6 +189,23 @@
       &HeadlessContentBrowserClient::BindBadgeService, base::Unretained(this)));
 }
 
+bool HeadlessContentBrowserClient::BindAssociatedReceiverFromFrame(
+    content::RenderFrameHost* render_frame_host,
+    const std::string& interface_name,
+    mojo::ScopedInterfaceEndpointHandle* handle) {
+#if BUILDFLAG(ENABLE_PRINTING)
+  if (interface_name == printing::mojom::PrintManagerHost::Name_) {
+    HeadlessPrintManager::BindPrintManagerHost(
+        mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>(
+            std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
+#endif
+
+  return false;
+}
+
 std::unique_ptr<content::DevToolsManagerDelegate>
 HeadlessContentBrowserClient::CreateDevToolsManagerDelegate() {
   return std::make_unique<HeadlessDevToolsManagerDelegate>(
diff --git a/headless/lib/browser/headless_content_browser_client.h b/headless/lib/browser/headless_content_browser_client.h
index 875a3e5..68b1b0a 100644
--- a/headless/lib/browser/headless_content_browser_client.h
+++ b/headless/lib/browser/headless_content_browser_client.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include "build/build_config.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/render_frame_host.h"
 #include "headless/public/headless_browser.h"
@@ -30,6 +31,10 @@
   void RegisterBrowserInterfaceBindersForFrame(
       content::RenderFrameHost* render_frame_host,
       mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
+  bool BindAssociatedReceiverFromFrame(
+      content::RenderFrameHost* render_frame_host,
+      const std::string& interface_name,
+      mojo::ScopedInterfaceEndpointHandle* handle) override;
   std::unique_ptr<content::DevToolsManagerDelegate>
   CreateDevToolsManagerDelegate() override;
   scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
diff --git a/headless/lib/browser/headless_print_manager.cc b/headless/lib/browser/headless_print_manager.cc
index 532fd12..8476914 100644
--- a/headless/lib/browser/headless_print_manager.cc
+++ b/headless/lib/browser/headless_print_manager.cc
@@ -64,6 +64,19 @@
 HeadlessPrintManager::~HeadlessPrintManager() = default;
 
 // static
+void HeadlessPrintManager::BindPrintManagerHost(
+    mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* print_manager = HeadlessPrintManager::FromWebContents(web_contents);
+  if (!print_manager)
+    return;
+  print_manager->BindReceiver(std::move(receiver), rfh);
+}
+
+// static
 std::string HeadlessPrintManager::PrintResultToString(PrintResult result) {
   switch (result) {
     case PRINT_SUCCESS:
diff --git a/headless/lib/browser/headless_print_manager.h b/headless/lib/browser/headless_print_manager.h
index cd49820..483a46e 100644
--- a/headless/lib/browser/headless_print_manager.h
+++ b/headless/lib/browser/headless_print_manager.h
@@ -68,6 +68,11 @@
 
   ~HeadlessPrintManager() override;
 
+  static void BindPrintManagerHost(
+      mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>
+          receiver,
+      content::RenderFrameHost* rfh);
+
   static std::string PrintResultToString(PrintResult result);
   // Exported for tests.
   HEADLESS_EXPORT static PageRangeStatus PageRangeTextToPages(
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 59d421d..075b8fa 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -58060,7 +58060,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58161,7 +58161,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58261,7 +58261,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58362,7 +58362,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58462,7 +58462,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58563,7 +58563,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58663,7 +58663,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58764,7 +58764,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -58865,7 +58865,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -68222,7 +68222,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -68322,7 +68322,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70140,7 +70140,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70240,7 +70240,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70341,7 +70341,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70442,7 +70442,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70547,7 +70547,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -70655,7 +70655,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
@@ -71660,7 +71660,7 @@
       }
       experiments {
         key: "chromium.chromium_tests.use_rbe_cas"
-        value: 5
+        value: 0
       }
       experiments {
         key: "luci.use_realms"
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star
index 5074780..f6516bda 100644
--- a/infra/config/lib/try.star
+++ b/infra/config/lib/try.star
@@ -301,6 +301,10 @@
         name = name,
         builder_group = "tryserver.chromium.chromiumos",
         goma_backend = builders.goma.backend.RBE_PROD,
+        experiments = {
+            # TODO(crbug.com/1237607): disable rbe cas temporarily.
+            "chromium.chromium_tests.use_rbe_cas": 0,
+        },
         **kwargs
     )
 
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index a7431bd..6eb60dd 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -156,6 +156,25 @@
   ]
 }
 
+source_set("credential_provider_migrator_app_agent") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "credential_provider_migrator_app_agent.h",
+    "credential_provider_migrator_app_agent.mm",
+  ]
+  deps = [
+    "//components/keyed_service/core",
+    "//ios/chrome/app/application_delegate:app_state_header",
+    "//ios/chrome/app/application_delegate:observing_app_state_agent",
+    "//ios/chrome/browser/credential_provider",
+    "//ios/chrome/browser/passwords:store_factory",
+    "//ios/chrome/browser/ui/main:browser_interface_provider",
+    "//ios/chrome/browser/ui/main:scene_state_header",
+    "//ios/chrome/common/app_group",
+    "//ios/chrome/common/credential_provider",
+  ]
+}
+
 source_set("app_metrics_app_state_agent") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
@@ -265,6 +284,7 @@
     ":app_metrics_app_state_agent",
     ":blocking_scene_commands",
     ":content_suggestions_scheduler_app_state_agent",
+    ":credential_provider_migrator_app_agent",
     ":enterprise_app_agent",
     ":first_run_app_state_agent",
     ":mode",
diff --git a/ios/chrome/app/DEPS b/ios/chrome/app/DEPS
index b5802f0..a6a50a5 100644
--- a/ios/chrome/app/DEPS
+++ b/ios/chrome/app/DEPS
@@ -7,25 +7,27 @@
   "+components/component_updater/installer_policies",
   "+components/content_settings",
   "+components/crash/core/common",
-  "+components/previous_session_info/previous_session_info.h",
-  "+components/favicon/core",
   "+components/favicon_base",
+  "+components/favicon/core",
   "+components/feature_engagement",
   "+components/handoff",
   "+components/history/core/browser",
+  "+components/keyed_service/core",
   "+components/metrics",
   "+components/ntp_snippets",
   "+components/password_manager/core/common",
   "+components/payments/core",
   "+components/prefs",
+  "+components/previous_session_info/previous_session_info.h",
   "+components/reading_list/core",
   "+components/search_engines",
+  "+components/signin/public/identity_manager/identity_manager.h",
   "+components/suggestions",
   "+components/sync/driver",
-  "+components/version_info",
   "+components/ukm/ios",
   "+components/unified_consent",
   "+components/url_formatter",
+  "+components/version_info",
   "+components/web_resource",
   "+ios/chrome/browser",
   "+ios/chrome/browser/feature_engagement",
@@ -33,7 +35,6 @@
   "+ios/net",
   "+ios/public/provider/chrome",
   "+mojo/core/embedder/embedder.h",
-  "+components/signin/public/identity_manager/identity_manager.h",
   "+third_party/breakpad/breakpad/src/client/ios",
 
   # Strings and resources.
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.h b/ios/chrome/app/credential_provider_migrator_app_agent.h
new file mode 100644
index 0000000..a37528d0
--- /dev/null
+++ b/ios/chrome/app/credential_provider_migrator_app_agent.h
@@ -0,0 +1,15 @@
+// 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 IOS_CHROME_APP_CREDENTIAL_PROVIDER_MIGRATOR_APP_AGENT_H_
+#define IOS_CHROME_APP_CREDENTIAL_PROVIDER_MIGRATOR_APP_AGENT_H_
+
+#import "ios/chrome/app/application_delegate/observing_app_state_agent.h"
+
+// The agent that kicks off the migration of passwords created in the credential
+// provider to the password manager.
+@interface CredentialProviderAppAgent : SceneObservingAppAgent
+@end
+
+#endif  // IOS_CHROME_APP_CREDENTIAL_PROVIDER_MIGRATOR_APP_AGENT_H_
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.mm b/ios/chrome/app/credential_provider_migrator_app_agent.mm
new file mode 100644
index 0000000..87bac63
--- /dev/null
+++ b/ios/chrome/app/credential_provider_migrator_app_agent.mm
@@ -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.
+
+#import "ios/chrome/app/credential_provider_migrator_app_agent.h"
+
+#include "components/keyed_service/core/service_access_type.h"
+#import "ios/chrome/app/application_delegate/app_state.h"
+#import "ios/chrome/browser/credential_provider/credential_provider_migrator.h"
+#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
+#import "ios/chrome/browser/ui/main/browser_interface_provider.h"
+#import "ios/chrome/browser/ui/main/scene_state.h"
+#include "ios/chrome/common/app_group/app_group_constants.h"
+#import "ios/chrome/common/credential_provider/constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface CredentialProviderAppAgent ()
+
+// |migrator| is in charge of migrating the password when Chrome comes to
+// foreground.
+@property(nonatomic, strong) CredentialProviderMigrator* migrator;
+
+@end
+
+@implementation CredentialProviderAppAgent
+
+- (void)appDidEnterForeground {
+  if (self.migrator) {
+    return;
+  }
+  NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
+  SceneState* anyScene = self.appState.foregroundScenes.firstObject;
+  DCHECK(anyScene);
+  ChromeBrowserState* browserState =
+      anyScene.interfaceProvider.mainInterface.browserState;
+  DCHECK(browserState);
+  scoped_refptr<password_manager::PasswordStore> store =
+      IOSChromePasswordStoreFactory::GetForBrowserState(
+          browserState, ServiceAccessType::IMPLICIT_ACCESS);
+  NSUserDefaults* userDefaults = app_group::GetGroupUserDefaults();
+  self.migrator =
+      [[CredentialProviderMigrator alloc] initWithUserDefaults:userDefaults
+                                                           key:key
+                                                 passwordStore:store];
+  __weak __typeof__(self) weakSelf = self;
+  [self.migrator startMigrationWithCompletion:^(BOOL success, NSError* error) {
+    DCHECK(success);
+    weakSelf.migrator = nil;
+  }];
+}
+
+@end
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 3f806e2..f941eb6b 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -122,6 +122,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 #if BUILDFLAG(IOS_CREDENTIAL_PROVIDER_ENABLED)
+#import "ios/chrome/app/credential_provider_migrator_app_agent.h"
 #include "ios/chrome/browser/credential_provider/credential_provider_service_factory.h"
 #include "ios/chrome/browser/credential_provider/credential_provider_support.h"
 #endif
@@ -659,6 +660,7 @@
   [self.appState addAgent:[[IncognitoUsageAppStateAgent alloc] init]];
   [self.appState addAgent:[[FirstRunAppAgent alloc] init]];
   [self.appState addAgent:[[CertificatePolicyAppAgent alloc] init]];
+  [self.appState addAgent:[[CredentialProviderAppAgent alloc] init]];
 }
 
 #pragma mark - Property implementation.
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
index 3b8a578f..99b03773 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">Algúns complementos fan que Chromium falle. Desinstala:</translation>
 <translation id="2178608107313874732">Chromium non pode usar a cámara neste momento</translation>
 <translation id="2195025571279539885">Queres que a próxima vez Chromium che ofreza a posibilidade de traducir as páxinas en <ph name="LANGUAGE_NAME" /> deste sitio?</translation>
+<translation id="2450140762465183767">Xa podes utilizar Chromium sempre que toques ligazóns en mensaxes, en documentos e noutras aplicacións.</translation>
+<translation id="2478931088402984578">Selecciona <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
 <translation id="2567507405773541360">Realiza máis tarefas cunha versión de Chromium máis sinxela, segura e rápida</translation>
 <translation id="2590893390871230428">Sincronizar os teus datos de Chromium</translation>
 <translation id="2650312721222849884">Para ver as túas pestanas desde calquera dispositivo no que utilices Chromium, activa a sincronización</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">Cando peches sesión, Chromium non sincronizará datos novos coa túa Conta de Google. Os datos que se sincronizasen antes permanecerán na conta.</translation>
 <translation id="9022552996538154597">Iniciar sesión en Chromium</translation>
 <translation id="9089354809943900324">Chromium está desactualizado</translation>
+<translation id="9110075932708282655">Utiliza Chromium de forma predeterminada</translation>
 <translation id="921174536258924340">Chromium non puido comprobar todos os contrasinais. Podes tentalo de novo mañá ou ben <ph name="BEGIN_LINK" />comprobar os contrasinais da túa Conta de Google<ph name="END_LINK" />.</translation>
 <translation id="985602178874221306">Os autores de Chromium</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hy.xtb
index 901306e..bf9326f6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hy.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">Որոշ հավելումներ առաջացնում են Chromium-ի աշխատանքի խափանում: Հեռացրեք դրանք՝</translation>
 <translation id="2178608107313874732">Այս պահին Chromium-ը չի կարող օգտագործել ձեր ֆոտոխցիկը</translation>
 <translation id="2195025571279539885">Ուզո՞ւմ եք, որ Chromium-ն այսուհետ առաջարկի թարգմանել այս կայքի <ph name="LANGUAGE_NAME" /> էջերը:</translation>
+<translation id="2450140762465183767">Այժմ հաղորդագրություններում, փաստաթղթերում և այլ հավելվածներում առկա հղումները կարող եք բացել Chromium-ում։</translation>
+<translation id="2478931088402984578">Ընտրեք <ph name="BEGIN_BOLD" />Chromium-ը<ph name="END_BOLD" />։</translation>
 <translation id="2567507405773541360">Դուք կարող եք ավելի արդյունավետ աշխատել պարզ, ապահով և արագագործ Chromium դիտարկիչի օգնությամբ</translation>
 <translation id="2590893390871230428">Համաժամացնել Chromium-ի տվյալները</translation>
 <translation id="2650312721222849884">Chromium-ն օգտագործելիս ձեր բոլոր ներդիրները տեսնելու համար միացրեք համաժամացումը։</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">Երբ դուք դուրս գաք հաշվից, Chromium-ը չի համաժամացնի նոր տվյալները ձեր Google հաշվի հետ։ Նախկինում համաժամացված տվյալները չեն հեռացվի։</translation>
 <translation id="9022552996538154597">Մուտք գործել Chromium</translation>
 <translation id="9089354809943900324">Chromium-ը հնացել է</translation>
+<translation id="9110075932708282655">Օգտագործեք Chromium-ն ըստ կանխադրման</translation>
 <translation id="921174536258924340">Chromium-ին չհաջողվեց ստուգել բոլոր գաղտնաբառերը։ Վաղը նորից փորձեք կամ <ph name="BEGIN_LINK" />գաղտնաբառերը ստուգեք ձեր Google հաշվում<ph name="END_LINK" />։</translation>
 <translation id="985602178874221306">Chromium Authors</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb
index f9a7ad9..31d89d4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">ზოგიერთი დანამატი Chromium-ის ავარიულად გათიშვას იწვევს. გთხოვთ, მოახდინოთ შემდეგის დეინსტალაცია:</translation>
 <translation id="2178608107313874732">Chromium ამჟამად თქვენს კამერას ვერ გამოიყენებს</translation>
 <translation id="2195025571279539885">გსურთ, Chromium-მა შემდგომში ამ საიტის <ph name="LANGUAGE_NAME" /> გვერდების თარგმნა შემოგთავაზოთ?</translation>
+<translation id="2450140762465183767">ამიერიდან შეგიძლიათ გამოიყენოთ Chromium, როცა შეტყობინებებში, დოკუმენტებში ან სხვა აპებში ბმულებს ეხებით.</translation>
+<translation id="2478931088402984578">აირჩიეთ <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
 <translation id="2567507405773541360">შეძელით მეტი კიდევ უფრო გამარტივებული, დაცული და დაჩქარებული Chromium-ით</translation>
 <translation id="2590893390871230428">თქვენი Chromium მონაცემების სინქრონიზაცია</translation>
 <translation id="2650312721222849884">იმისთვის, რომ იხილოთ თქვენი ჩანართები ნებისმიერი მოწყობილობიდან, საიდანაც Chromium-ს იყენებთ, ჩართეთ სინქრონიზაცია</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">გასვლისას Chromium არ შეასრულებს ახალი მონაცემების სინქრონიზაციას თქვენს Google ანგარიშთან. ადრე სინქრონიზებული მონაცემები ანგარიშში დარჩება.</translation>
 <translation id="9022552996538154597">შედით Chromium-ში</translation>
 <translation id="9089354809943900324">Chromium მოძველდა</translation>
+<translation id="9110075932708282655">გამოიყენეთ Chromium ნაგულისხმევად</translation>
 <translation id="921174536258924340">Chromium-მა ვერ შეამოწმა ყველა პაროლი. ცადეთ ხვალ ან <ph name="BEGIN_LINK" />შეამოწმეთ პაროლები თქვენი Google ანგარიშიდან<ph name="END_LINK" />.</translation>
 <translation id="985602178874221306">Chromium-ის ავტორები</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
index ed569df..caeb726 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">Daži papildinājumi var izraisīt pārlūka Chromium avarēšanu. Lūdzu, atinstalējiet šos papildinājumus:</translation>
 <translation id="2178608107313874732">Chromium pašlaik nevar izmantot jūsu kameru.</translation>
 <translation id="2195025571279539885">Vai vēlaties, lai Chromium nākamreiz piedāvātu šīs vietnes lapas, kuru saturs ir šādā valodā: <ph name="LANGUAGE_NAME" />?</translation>
+<translation id="2450140762465183767">Tagad varat izmantot Chromium ikreiz, kad pieskaraties saitēm ziņojumos, dokumentos un citās lietotnēs.</translation>
+<translation id="2478931088402984578">Atlasiet <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation>
 <translation id="2567507405773541360">Vairāk iespēju vienkāršajā un drošajā pārlūkā Chromium, kas tagad ir vēl ātrāks</translation>
 <translation id="2590893390871230428">Sinhronizēt jūsu Chromium datus</translation>
 <translation id="2650312721222849884">Lai skatītu cilnes no ierīcēm, kurās lietojat pārlūku Chromium, ieslēdziet sinhronizāciju.</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">Ja izrakstīsieties, jaunie dati pārlūkā Chromium netiks sinhronizēti ar jūsu Google kontu. Iepriekš sinhronizētie dati kontā saglabājas.</translation>
 <translation id="9022552996538154597">Pierakstieties pārlūkā Chromium</translation>
 <translation id="9089354809943900324">Chromium versija ir novecojusi.</translation>
+<translation id="9110075932708282655">Chromium izmantošana pēc noklusējuma</translation>
 <translation id="921174536258924340">Pārlūkprogrammā Chromium nevarēja pārbaudīt visas paroles. Mēģiniet vēlreiz rīt vai <ph name="BEGIN_LINK" />pārbaudiet paroles savā Google kontā<ph name="END_LINK" />.</translation>
 <translation id="985602178874221306">Chromium autori</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
index e4dfaf1..9de1140 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">Disa përbërës shtesë shkaktojnë ndërprerje aksidentale të Chromium. Çinstalo:</translation>
 <translation id="2178608107313874732">Chromium nuk mund të përdorë kamerën tënde për momentin</translation>
 <translation id="2195025571279539885">Dëshiron që Chromium të ofrojë përkthimin e faqeve në <ph name="LANGUAGE_NAME" /> nga ky sajt herën tjetër?</translation>
+<translation id="2450140762465183767">Tani mund të përdorësh Chromium sa herë që troket te lidhjet në mesazhe, dokumente dhe aplikacione të tjera.</translation>
+<translation id="2478931088402984578">Zgjidh <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
 <translation id="2567507405773541360">Bëj më shumë me një Chromium të thjeshtë, të sigurt dhe më të shpejtë se kurrë</translation>
 <translation id="2590893390871230428">Sinkronizo të dhënat e Chromium</translation>
 <translation id="2650312721222849884">Për të parë skedat e tua nga çdo vend ku përdor Chromium, aktivizo sinkronizimin</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">Kur të dalësh, Chromium nuk do të sinkronizojë asnjë nga të dhënat e tua të reja me "Llogarinë tënde të Google". Të dhënat e sinkronizuara më herët qëndrojnë në llogari.</translation>
 <translation id="9022552996538154597">Identifikohu në Chromium</translation>
 <translation id="9089354809943900324">Chromium nuk është i përditësuar</translation>
+<translation id="9110075932708282655">Përdor Chromium me parazgjedhje</translation>
 <translation id="921174536258924340">Chromium nuk mund t'i kontrollonte të gjitha fjalëkalimet. Provo përsëri nesër ose <ph name="BEGIN_LINK" />kontrollo fjalëkalimet në "Llogarinë tënde të Google".<ph name="END_LINK" /></translation>
 <translation id="985602178874221306">Autorët e Chromium</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
index b622fe0..a7a28344 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">Một số tiện ích bổ sung khiến Chromium trục trặc. Hãy gỡ cài đặt:</translation>
 <translation id="2178608107313874732">Chromium hiện không thể dùng máy ảnh</translation>
 <translation id="2195025571279539885">Bạn có muốn Chromium đề xuất dịch các trang <ph name="LANGUAGE_NAME" /> của trang web này vào lần tiếp theo không?</translation>
+<translation id="2450140762465183767">Giờ đây, bạn có thể dùng Chromium mỗi khi nhấn vào các đường liên kết trong thư/tin nhắn, tài liệu và các ứng dụng khác.</translation>
+<translation id="2478931088402984578">Chọn <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
 <translation id="2567507405773541360">Với Chromium đơn giản, an toàn và nhanh nhất từ trước đến nay, bạn sẽ làm được nhiều việc hơn</translation>
 <translation id="2590893390871230428">Đồng bộ hóa dữ liệu của bạn trên Chromium</translation>
 <translation id="2650312721222849884">Để xem các thẻ của bạn trên bất cứ thiết bị nào mà bạn có dùng Chromium, hãy bật tính năng đồng bộ hóa</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">Khi bạn đăng xuất, Chromium sẽ không đồng bộ hóa bất cứ dữ liệu mới nào với Tài khoản Google của bạn. Dữ liệu đã đồng bộ hóa trước đó sẽ vẫn có trong tài khoản này.</translation>
 <translation id="9022552996538154597">Đăng nhập vào Chromium</translation>
 <translation id="9089354809943900324">Chromium đã lỗi thời</translation>
+<translation id="9110075932708282655">Sử dụng Chromium theo Mặc định</translation>
 <translation id="921174536258924340">Chromium không thể kiểm tra một số mật khẩu. Hãy thử lại vào ngày mai hoặc <ph name="BEGIN_LINK" />kiểm tra các mật khẩu trong Tài khoản Google của bạn.<ph name="END_LINK" /></translation>
 <translation id="985602178874221306">Tác giả Chromium</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
index b776821..0ea123f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -22,6 +22,8 @@
 <translation id="2168108852149185974">部分外掛程式造成 Chromium 當機,請解除安裝這些外掛程式:</translation>
 <translation id="2178608107313874732">Chromium 目前無法使用你的相機</translation>
 <translation id="2195025571279539885">下次造訪這個網站時,需要 Chromium 為您翻譯其中的<ph name="LANGUAGE_NAME" />網頁嗎?</translation>
+<translation id="2450140762465183767">現在只要在訊息、文件和其他應用程式中輕觸連結,即可透過 Chromium 開啟。</translation>
+<translation id="2478931088402984578">選取 [Chromium]<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation>
 <translation id="2567507405773541360">運用簡便、安全且速度遠勝以往的 Chromium 讓你事半功倍</translation>
 <translation id="2590893390871230428">同步處理你的 Chromium 資料</translation>
 <translation id="2650312721222849884">開啟同步功能後,不論從何處使用 Chromium 都能查看你的分頁</translation>
@@ -100,6 +102,7 @@
 <translation id="894437814105052438">登出帳戶後,Chromium 就不會將任何新資料同步到你的 Google 帳戶。不過,先前已同步處理的資料仍會保存在帳戶中。</translation>
 <translation id="9022552996538154597">登入 Chromium</translation>
 <translation id="9089354809943900324">Chromium 版本過舊</translation>
+<translation id="9110075932708282655">預設為使用 Chromium</translation>
 <translation id="921174536258924340">Chromium 無法檢查所有密碼,請明天再試,或<ph name="BEGIN_LINK" />檢查 Google 帳戶中的密碼。<ph name="END_LINK" /></translation>
 <translation id="985602178874221306">The Chromium Authors</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
index dd0c787d..ab1993c 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome non puido comprobar todos os contrasinais. Téntao de novo mañá.</translation>
 <translation id="2869959624320573933">Inicia sesión en Chrome</translation>
 <translation id="2919738076569633423">Ao usar Chrome, aceptas as <ph name="BEGIN_LINK_TOS" />Condicións de servizo<ph name="END_LINK_TOS" />.</translation>
+<translation id="2957447865124070833">Selecciona <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation>
 <translation id="3030414234702425231">Dado que estás pechando sesión nunha conta xestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, eliminaranse os teus datos de Chrome deste dispositivo, pero conservaranse na túa Conta de Google.</translation>
 <translation id="3167189358072330585">A túa conta non funciona en Google Chrome. Ponte en contacto co teu administrador de dominio ou utiliza unha conta normal de Google para iniciar sesión.</translation>
 <translation id="3173834708294760622">Páxina de Google Chrome</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">Abre Chrome cada vez que toques ligazóns noutras aplicacións</translation>
 <translation id="5854621639439811139">Consello sobre Chrome: Agora algúns botóns, como Atrás, Adiante e Buscar, están na parte inferior da pantalla.</translation>
 <translation id="5876773482963502140">Se permites que Chrome saiba cal é a túa localización, este enviaralla aos sitios aos que lles concedas a autorización pertinente. Os sitios poderán preguntarche pola túa localización se teñen información local que mostrarche (por exemplo, noticias ou tendas próximas).</translation>
+<translation id="6054613632208573261">Utiliza Chrome de forma predeterminada</translation>
 <translation id="6063091872902370735">Permitir inicio de sesión en Chrome</translation>
 <translation id="6181930887571472871">Pásate a Chrome</translation>
 <translation id="6238746320622508509">Permite que Chrome bloquee as pestanas do modo de incógnito.</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">Dámosche a benvida a Chrome</translation>
 <translation id="7662994914830945754">Para ver as túas pestanas desde calquera equipo no que utilices Chrome, inicia sesión e activa a sincronización</translation>
 <translation id="766361182512894255">O teu contrasinal quedou exposto debido a unha violación da seguranza dos datos. Chrome recoméndache que o cambies agora.</translation>
+<translation id="7693590760643069321">Xa podes utilizar Chrome sempre que toques ligazóns en mensaxes, en documentos e noutras aplicacións.</translation>
 <translation id="7698568245838009292">Chrome quere acceder á cámara</translation>
 <translation id="7855730255114109580">Google Chrome está actualizado</translation>
 <translation id="8022947259858476807">Usa Chrome de forma predeterminada para abrir ligazóns, realizar buscas desde widgets e autocompletar contrasinais noutras aplicacións</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hy.xtb
index ab528b3..778e28b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hy.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome-ին չհաջողվեց ստուգել բոլոր գաղտնաբառերը։ Վաղը նորից փորձեք։</translation>
 <translation id="2869959624320573933">Մուտք Chrome</translation>
 <translation id="2919738076569633423">Օգտագործելով Chrom-ը՝ դուք ընդունում եք <ph name="BEGIN_LINK_TOS" />Օգտագործման պայմանները<ph name="END_LINK_TOS" />։</translation>
+<translation id="2957447865124070833">Ընտրեք <ph name="BEGIN_BOLD" />Chrome-ը<ph name="END_BOLD" />։</translation>
 <translation id="3030414234702425231">Դուք դուրս եք գալիս <ph name="SIGNOUT_MANAGED_DOMAIN" /> տիրույթի ադմինիստրատորի կողմից կառավարվող հաշվից: Նկատի առեք, որ Chrome-ի տվյալները սարքից կհեռացվեն, սակայն կմնան ձեր Google հաշվում:</translation>
 <translation id="3167189358072330585">Ձեր հաշիվը չի աշխատում Google Chrome-ում: Մուտք գործելու համար դիմեք ձեր տիրույթի ադմինիստրատորին կամ օգտագործեք սովորական Google հաշիվ:</translation>
 <translation id="3173834708294760622">Google Chrome-ի էջ</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">Բացեք Chrome-ն ամեն անգամ, երբ այլ հավելվածներում հպում եք հղումների</translation>
 <translation id="5854621639439811139">Խորհուրդ Chrome-ից: Որոշ կոճակներ (օրինակ՝ Հետ, Առաջ և Որոնել) այժմ ձեր էկրանի ներքևի հատվածում են:</translation>
 <translation id="5876773482963502140">Ստանալով ձեր տեղադրության տվյալներն օգտագործելու թույլտվություն՝ Chrome-ը դրանք ուղարկում է ձեր կողմից թույլատրված կայքերին։ Կայքերը կարող են պահանջել ձեր տեղադրության տվյալները՝ տվյալ վայրին առնչվող տեղեկություններ ցուցադրելու համար (օրինակ՝ նորություններ կամ մոտակա խանութներ)։</translation>
+<translation id="6054613632208573261">Օգտագործեք Chrome-ն ըստ կանխադրման</translation>
 <translation id="6063091872902370735">Թույլատրել մուտքը Chrome-ում</translation>
 <translation id="6181930887571472871">Անցեք Chrome-ին</translation>
 <translation id="6238746320622508509">Թույլ տվեք Chrome-ին կողպել ձեր ինկոգնիտո ներդիրները։</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">Բարի գալուստ Chrome</translation>
 <translation id="7662994914830945754">Chrome-ն օգտագործելիս ձեր բոլոր ներդիրները տեսնելու համար մտեք հաշիվ և միացրեք համաժամացումը։</translation>
 <translation id="766361182512894255">Տվյալների արտահոսքի արդյունքում ձեր գաղտնաբառը հայտնի է դարձել կողմնակի անձանց։ Chrome-ը խորհուրդ է տալիս փոխել գաղտնաբառը։</translation>
+<translation id="7693590760643069321">Այժմ հաղորդագրություններում, փաստաթղթերում և այլ հավելվածներում առկա հղումները կարող եք բացել Chrome-ում։</translation>
 <translation id="7698568245838009292">Chrome-ն ուզում է օգտագործել տեսախցիկը</translation>
 <translation id="7855730255114109580">Google Chrome-ը թարմացված է</translation>
 <translation id="8022947259858476807">Դարձրեք Chrome-ը ձեր կանխադրված դիտարկիչը՝ հղումներ բացելու, վիջեթներից որոնելու և այլ հավելվածներում գաղտնաբառերի ինքնալրացման համար</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb
index a88c09a2..aea80a6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome-მა ვერ შეამოწმა ყველა პაროლი. ცადეთ ხვალ.</translation>
 <translation id="2869959624320573933">შედით Chrome-ში</translation>
 <translation id="2919738076569633423">Chrome-ის გამოყენებით თქვენ ეთანხმებით <ph name="BEGIN_LINK_TOS" />მომსახურების პირობებს<ph name="END_LINK_TOS" />.</translation>
+<translation id="2957447865124070833">აირჩიეთ <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation>
 <translation id="3030414234702425231">ვინაიდან თქვენ გადიხართ ანგარიშიდან, რომელსაც მართავს <ph name="SIGNOUT_MANAGED_DOMAIN" />, ამ მოწყობილობიდან წაიშლება თქვენი Chrome მონაცემები, თუმცა ისინი შენარჩუნდება თქვენს Google ანგარიშში.</translation>
 <translation id="3167189358072330585">თქვენი ანგარიში არ მუშაობს Google Chrome-ში. გთხოვთ, დაუკავშირდეთ თქვენი დომენის ადმინისტრატორს, ან სისტემაში შესასვლელად, ჩვეულებრივი Google ანგარიში გამოიყენოთ.</translation>
 <translation id="3173834708294760622">Google Chrome-ის გვერდი</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">გახსენით Chrome ყოველთვის, როცა სხვა აპებში ბმულებს შეეხებით</translation>
 <translation id="5854621639439811139">Chrome მინიშნება: ზოგიერთი ღილაკი (როგორიცაა „უკან“, „წინ“ და „ძიება“) ახლა მდებარეობს ეკრანის ქვედა ნაწილში.</translation>
 <translation id="5876773482963502140">Chrome-ისთვის თქვენი მდებარეობის დადგენის დაშვების შემთხვევაში Chrome მას გაუგზავნის საიტებს, რომლებისთვისაც შესაბამის ნებართვას გასცემთ. საიტებს მდებარეობის მოთხოვნა შეუძლია ისეთი ადგილობრივი ინფორმაციის საჩვენებლად, როგორიცაა, მაგალითად, ახლომდებარე მაღაზიები ან ახალი ამბები.</translation>
+<translation id="6054613632208573261">გამოიყენეთ Chrome ნაგულისხმევად</translation>
 <translation id="6063091872902370735">Chrome-ში შესვლის დაშვება</translation>
 <translation id="6181930887571472871">გადაერთეთ Chrome-ზე</translation>
 <translation id="6238746320622508509">მიეცით საშუალება Chrome-ს, ჩაკეტოს თქვენი ინკოგნიტო ჩანართები.</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">მოგესალმებათ Chrome!</translation>
 <translation id="7662994914830945754">იმისთვის, რომ იხილოთ თქვენი ჩანართები ნებისმიერი მოწყობილობიდან, საიდანაც Chrome-ს იყენებთ, შედით სისტემაში და ჩართეთ სინქრონიზაცია</translation>
 <translation id="766361182512894255">თქვენი პაროლი გამოაშკარავდა მონაცემთა გაჟონვისას. Chrome გირჩევთ, ახლავე შეცვალოთ პაროლი.</translation>
+<translation id="7693590760643069321">ამიერიდან შეგიძლიათ გამოიყენოთ Chrome, როცა შეტყობინებებში, დოკუმენტებში ან სხვა აპებში ბმულებს ეხებით.</translation>
 <translation id="7698568245838009292">Chrome-ს კამერაზე წვდომის მიღება სურს</translation>
 <translation id="7855730255114109580">Google Chrome განახლებულია</translation>
 <translation id="8022947259858476807">გამოიყენეთ Chrome ნაგულისხმევ ბრაუზერად, რომ გახსნათ ბმულები, მოიძიოთ ვიჯეტებიდან და ავტომატურად შეავსოთ პაროლები სხვა აპებში</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
index 4e7f3ff..a8fabd93 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Pārlūkprogrammā Chrome nevarēja pārbaudīt visas paroles. Mēģiniet vēlreiz rīt.</translation>
 <translation id="2869959624320573933">Pierakstīšanās pārlūkprogrammā Chrome</translation>
 <translation id="2919738076569633423">Izmantojot pārlūkprogrammu Chrome, jūs piekrītat <ph name="BEGIN_LINK_TOS" />pakalpojumu sniegšanas noteikumiem<ph name="END_LINK_TOS" />.</translation>
+<translation id="2957447865124070833">Atlasiet <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" />.</translation>
 <translation id="3030414234702425231">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />, tādēļ jūsu Chrome dati tiks dzēsti no šīs ierīces. Dati joprojām būs pieejami jūsu Google kontā.</translation>
 <translation id="3167189358072330585">Jūsu konts nedarbojas pārlūkā Google Chrome. Sazinieties ar savu domēna administratoru vai pierakstieties, izmantojot parastu Google kontu.</translation>
 <translation id="3173834708294760622">Google Chrome lapa</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">Tiks atvērts pārlūks Chrome ikreiz, kad pieskarsieties saitēm citās lietotnēs.</translation>
 <translation id="5854621639439811139">Chrome padoms. Tagad ekrāna apakšdaļā ir dažas pogas, piemēram, Atpakaļ, Pārsūtīt un Meklēt.</translation>
 <translation id="5876773482963502140">Ja atļaujat pārlūkam Chrome piekļūt jūsu atrašanās vietas informācijai, pārlūkā Chrome šī informācija tiek nosūtīta uz visām vietnēm, kurām piešķirat atļauju. Vietnēs var tikt lūgta atļauja piekļūt atrašanās vietas informācijai, lai rādītu jums vietēju informāciju, piemēram, vietējās ziņas vai informāciju par tuvumā esošiem veikaliem.</translation>
+<translation id="6054613632208573261">Chrome izmantošana pēc noklusējuma</translation>
 <translation id="6063091872902370735">Atļaut pierakstīšanos pārlūkā Chrome</translation>
 <translation id="6181930887571472871">Pāriet uz Chrome</translation>
 <translation id="6238746320622508509">Atļaujiet pārlūkā Chrome bloķēt inkognito cilnes.</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">Laipni lūdzam pārlūkā Chrome</translation>
 <translation id="7662994914830945754">Lai skatītu cilnes no visām ierīcēm, kurās izmantojat pārlūku Chrome, pierakstieties un ieslēdziet sinhronizāciju.</translation>
 <translation id="766361182512894255">Jūsu parole tika atklāta datu noplūdes dēļ. Chrome iesaka pēc iespējas ātrāk nomainīt paroli.</translation>
+<translation id="7693590760643069321">Tagad varat izmantot Chrome ikreiz, kad pieskaraties saitēm ziņojumos, dokumentos un citās lietotnēs.</translation>
 <translation id="7698568245838009292">Chrome pieprasa piekļuvi kamerai</translation>
 <translation id="7855730255114109580">Pārlūks Google Chrome ir atjaunināts.</translation>
 <translation id="8022947259858476807">Lai atvērtu saites, veiktu meklēšanu logrīkos un automātiski aizpildītu paroles citās lietotnēs, izmantojiet pārlūku Chrome kā noklusējuma pārlūku</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
index a9f70b588..28d8eb8 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome nuk mund t'i kontrollonte të gjitha fjalëkalimet. Provo sërish nesër.</translation>
 <translation id="2869959624320573933">Identifikohu në Chrome</translation>
 <translation id="2919738076569633423">Duke përdorur Chrome, ti pranon <ph name="BEGIN_LINK_TOS" />Kushtet e shërbimit<ph name="END_LINK_TOS" />.</translation>
+<translation id="2957447865124070833">Zgjidh <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation>
 <translation id="3030414234702425231">Duke qenë se po del nga një llogari e menaxhuar nga <ph name="SIGNOUT_MANAGED_DOMAIN" />, të dhënat e tua të Chrome do të fshihen nga kjo pajisje. Të dhënat e tua do të mbeten në "Llogarinë tënde të Google".</translation>
 <translation id="3167189358072330585">Llogaria jote nuk punon në Google Chrome. Kontakto me administratorin e domenit ose përdor një llogari të rregullt të Google për t'u identifikuar.</translation>
 <translation id="3173834708294760622">Faqe e Google Chrome</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">Hap gjithmonë Chrome kur troket te lidhjet në aplikacionet e tjera</translation>
 <translation id="5854621639439811139">Këshillë për Chrome. Disa butona ndodhen tani në fund të ekranit tënd, si p.sh. "Prapa", "Përpara" dhe "Kërko".</translation>
 <translation id="5876773482963502140">Nëse lejon që Chrome të dijë vendndodhjen tënde, Chrome e dërgon atë te çdo sajt që ti lejon. Sajtet mund të kërkojnë për vendndodhjen tënde kur ato kanë informacione lokale për të të shfaqur, si dyqanet në afërsi ose lajme.</translation>
+<translation id="6054613632208573261">Përdor Chrome me parazgjedhje</translation>
 <translation id="6063091872902370735">Lejo identifikimin në Chrome</translation>
 <translation id="6181930887571472871">Kalo te Chrome</translation>
 <translation id="6238746320622508509">Lejo që Chrome t'i kyçë skedat "e fshehta".</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">Mirë se vjen në Chrome</translation>
 <translation id="7662994914830945754">Për të parë skedat e tua nga çdo vend ku përdor Chrome, identifikohu dhe aktivizo sinkronizimin</translation>
 <translation id="766361182512894255">Fjalëkalimi yt është ekspozuar në një nxjerrje të paautorizuar të të dhënave. Chrome rekomandon që ta ndryshosh fjalëkalimin tani.</translation>
+<translation id="7693590760643069321">Tani mund të përdorësh Chrome sa herë që troket te lidhjet në mesazhe, dokumente dhe aplikacione të tjera.</translation>
 <translation id="7698568245838009292">Chrome dëshiron të ketë qasje te kamera</translation>
 <translation id="7855730255114109580">Google Chrome është i përditësuar</translation>
 <translation id="8022947259858476807">Përdor Chrome si parazgjedhje për të hapur lidhjet, për të kërkuar nga miniaplikacionet dhe për të plotësuar automatikisht fjalëkalimet në aplikacione të tjera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
index ac19ce48..3e96a37 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome không thể kiểm tra một số mật khẩu. Hãy thử lại vào ngày mai.</translation>
 <translation id="2869959624320573933">Đăng nhập vào Chrome</translation>
 <translation id="2919738076569633423">Bằng việc sử dụng Chrome, bạn đồng ý với <ph name="BEGIN_LINK_TOS" />Điều khoản dịch vụ<ph name="END_LINK_TOS" />.</translation>
+<translation id="2957447865124070833">Chọn <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation>
 <translation id="3030414234702425231">Vì bạn đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý, nên dữ liệu Chrome của bạn sẽ bị xóa khỏi thiết bị này. Dữ liệu của bạn sẽ vẫn còn trong Tài khoản Google của bạn.</translation>
 <translation id="3167189358072330585">Tài khoản của bạn không hoạt động trên Google Chrome. Vui lòng liên hệ với quản trị viên miền của bạn hoặc sử dụng Tài khoản Google thông thường để đăng nhập.</translation>
 <translation id="3173834708294760622">Trang Google Chrome</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">Mở Chrome bất cứ khi nào bạn nhấn vào đường liên kết trong các ứng dụng khác</translation>
 <translation id="5854621639439811139">Mẹo dành cho Chrome. Một số nút hiện nằm ở cuối màn hình, chẳng hạn như Quay lại, Tiến lên và Tìm kiếm.</translation>
 <translation id="5876773482963502140">Nếu bạn cho Chrome biết vị trí của bạn, thì Chrome sẽ gửi thông tin này đến mọi trang web mà bạn cho phép. Các trang web có thể yêu cầu thông tin vị trí khi có thông tin địa phương để hiển thị cho bạn, chẳng hạn như tin tức hoặc cửa hàng ở gần.</translation>
+<translation id="6054613632208573261">Sử dụng Chrome theo Mặc định</translation>
 <translation id="6063091872902370735">Cho phép đăng nhập vào Chrome</translation>
 <translation id="6181930887571472871">Chuyển sang Chrome</translation>
 <translation id="6238746320622508509">Để Chrome khóa các thẻ Ẩn danh của bạn.</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">Chào mừng bạn đến với Chrome</translation>
 <translation id="7662994914830945754">Để xem các thẻ của bạn trên bất cứ thiết bị nào mà bạn có dùng Chrome, hãy đăng nhập và bật tính năng đồng bộ hóa</translation>
 <translation id="766361182512894255">Mật khẩu của bạn đã bị lộ trong một vụ rò rỉ dữ liệu. Chrome khuyên bạn nên đổi ngay mật khẩu.</translation>
+<translation id="7693590760643069321">Giờ đây, bạn có thể dùng Chrome mỗi khi nhấn vào các đường liên kết trong thư/tin nhắn, tài liệu và các ứng dụng khác.</translation>
 <translation id="7698568245838009292">Chrome muốn truy cập vào máy ảnh</translation>
 <translation id="7855730255114109580">Google Chrome đã được cập nhật</translation>
 <translation id="8022947259858476807">Hãy dùng Chrome theo mặc định để mở đường liên kết, tìm kiếm trong tiện ích và tự động điền mật khẩu trên các ứng dụng khác</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
index 07347fc..9081660 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
@@ -28,6 +28,7 @@
 <translation id="2732745070297234559">Chrome 無法檢查所有密碼,請明天再試。</translation>
 <translation id="2869959624320573933">登入 Chrome</translation>
 <translation id="2919738076569633423">使用 Chrome 即表示你同意《<ph name="BEGIN_LINK_TOS" />服務條款<ph name="END_LINK_TOS" />》。</translation>
+<translation id="2957447865124070833">選取 [Chrome]<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation>
 <translation id="3030414234702425231">由於你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶,系統將刪除你在這個裝置上的 Chrome 資料,但這些資料仍會保留在你的 Google 帳戶中。</translation>
 <translation id="3167189358072330585">無法使用您的帳戶登入 Google Chrome,請洽詢您的網域管理員或使用一般 Google 帳戶登入。</translation>
 <translation id="3173834708294760622">Google Chrome 頁面</translation>
@@ -61,6 +62,7 @@
 <translation id="5716154293141027663">只要輕觸其他應用程式中的連結,即可透過 Chrome 開啟</translation>
 <translation id="5854621639439811139">Chrome 提示。部分按鈕 (例如 [返回]、[往前] 和 [搜尋]) 現在位於畫面底部。</translation>
 <translation id="5876773482963502140">如果允許 Chrome 取得位置資訊,Chrome 會將這項資訊傳送至你允許存取該資訊的網站。當網站要向你顯示當地資訊時 (例如附近商家或新聞),可能會要求你提供位置資訊。</translation>
+<translation id="6054613632208573261">預設為使用 Chrome</translation>
 <translation id="6063091872902370735">允許登入 Chrome</translation>
 <translation id="6181930887571472871">改為使用 Chrome</translation>
 <translation id="6238746320622508509">讓 Chrome 鎖定你的無痕分頁。</translation>
@@ -86,6 +88,7 @@
 <translation id="7626032353295482388">歡迎使用 Chrome</translation>
 <translation id="7662994914830945754">登入帳戶並開啟同步功能後,不論從何處使用 Chrome 都能查看你的分頁</translation>
 <translation id="766361182512894255">你的密碼因為資料侵害事件遭到外洩。Chrome 建議你立即變更密碼。</translation>
+<translation id="7693590760643069321">現在只要在訊息、文件和其他應用程式中輕觸連結,即可透過 Chrome 開啟。</translation>
 <translation id="7698568245838009292">Chrome 要求存取你的相機</translation>
 <translation id="7855730255114109580">Google Chrome 目前是最新版本</translation>
 <translation id="8022947259858476807">預設使用 Chrome 來開啟連結、從小工具搜尋,以及自動在其他應用程式中填入密碼</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 385db975..efad27e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">Non se completou a configuración de sincronización inicial</translation>
 <translation id="2843803966603263712">Rest conf trad</translation>
+<translation id="2848086008667475748">Definir como aplicación predeterminada na configuración</translation>
 <translation id="2858204748079866344">Para protexer a túa privacidade, Chrome non autocompletará o teu contrasinal neste campo.</translation>
 <translation id="285960592395650245">Reintentar a descarga</translation>
 <translation id="2870560284913253234">Sitio</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">Mostrar sempre</translation>
 <translation id="418156467088430727">Ver versión sen conexión nunha nova pestana</translation>
 <translation id="4181841719683918333">Idiomas</translation>
+<translation id="4237377247299956313">Toca <ph name="BEGIN_BOLD" />Default Browser App<ph name="END_BOLD" /> (Aplicación de navegador predeterminada)</translation>
 <translation id="424315890655130736">Introducir contrasinal</translation>
 <translation id="4263576668337963058">Mostrar accións da páxina dispoñibles</translation>
 <translation id="4267380167363222949">Pestana seguinte</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">Busca de códigos QR</translation>
 <translation id="4378154925671717803">Teléfono</translation>
 <translation id="4389019817280890563">Toca para cambiar de idioma.</translation>
+<translation id="4442550905108052454">Abre <ph name="BEGIN_BOLD" />Settings<ph name="END_BOLD" /> (Configuración)</translation>
 <translation id="4454246407045105932">Engadir idioma</translation>
 <translation id="4469418912670346607">Continuar coa configuración</translation>
 <translation id="4474494258097106883">Deseñado para iPhone</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index 2e73d9c..35238cd5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">Համաժամացման սկզբնական կարգավորումը չի ավարտվել</translation>
 <translation id="2843803966603263712">Վերակայել Translate-ի կարգավորումները</translation>
+<translation id="2848086008667475748">Դարձնել կանխադրված դիտարկիչ կարգավորումներում…</translation>
 <translation id="2858204748079866344">Ձեր գաղտնիությունը պաշտպանելու նպատակով Chrome-ն այս դաշտում ավտոմատ չի լրացնի ձեր գաղտնաբառը:</translation>
 <translation id="285960592395650245">Նորից ներբեռնել</translation>
 <translation id="2870560284913253234">Կայք</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">Միշտ ցույց տալ</translation>
 <translation id="418156467088430727">Դիտել անցանց տարբերակը նոր ներդիրում</translation>
 <translation id="4181841719683918333">Լեզուներ</translation>
+<translation id="4237377247299956313">Հպեք <ph name="BEGIN_BOLD" />Դիտարկիչի կանխադրված հավելված<ph name="END_BOLD" />։</translation>
 <translation id="424315890655130736">Մուտքագրեք անցաբառը</translation>
 <translation id="4263576668337963058">Ցուցադրել հասանելի գործողությունները էջերի համար</translation>
 <translation id="4267380167363222949">Հաջորդ ներդիրը</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">Սկանավորել QR կոդը</translation>
 <translation id="4378154925671717803">Հեռախոս</translation>
 <translation id="4389019817280890563">Հպեք՝ լեզուն փոխելու համար։</translation>
+<translation id="4442550905108052454">Բացեք <ph name="BEGIN_BOLD" />Կարգավորումները<ph name="END_BOLD" />։</translation>
 <translation id="4454246407045105932">Ավելացնել լեզու</translation>
 <translation id="4469418912670346607">Շարունակել կարգավորումը</translation>
 <translation id="4474494258097106883">Ստեղծված է հատուկ ձեր iPhone-ի համար</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index 729293c..e540cc18 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">სინქრონიზაციის თავდაპირველი დაყენება არ დასრულებულა</translation>
 <translation id="2843803966603263712">Translate-ის პარამეტრების ჩამოყრა</translation>
+<translation id="2848086008667475748">ნაგულისხმევად დაყენება პარამეტრებიდან…</translation>
 <translation id="2858204748079866344">კონფიდენციალურობის დაცვის მიზნით, Chrome არ შეავსებს ავტომატურად თქვენს პაროლს ამ ველში.</translation>
 <translation id="285960592395650245">ხელახლა სცადეთ ჩამოტვირთვა</translation>
 <translation id="2870560284913253234">საიტი</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">ყოველთვის ჩვენება</translation>
 <translation id="418156467088430727">ხაზგარეშე ვერსიის ახალ ჩანართში ნახვა</translation>
 <translation id="4181841719683918333">ენები</translation>
+<translation id="4237377247299956313">შეეხეთ <ph name="BEGIN_BOLD" />ბრაუზერის ნაგულისხმევ აპს<ph name="END_BOLD" /></translation>
 <translation id="424315890655130736">შეიყვანეთ საიდუმლო ფრაზა</translation>
 <translation id="4263576668337963058">გვერდთან დაკავშირებული ხელმისაწვდომი ქმედებების ჩვენება</translation>
 <translation id="4267380167363222949">შემდეგი ჩანართი</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">QR კოდების ძიება</translation>
 <translation id="4378154925671717803">ტელეფონი</translation>
 <translation id="4389019817280890563">შეეხეთ ენის შესაცვლელად.</translation>
+<translation id="4442550905108052454">გახსენით <ph name="BEGIN_BOLD" />პარამეტრები<ph name="END_BOLD" /></translation>
 <translation id="4454246407045105932">ენის დამატება</translation>
 <translation id="4469418912670346607">დაყენების გაგრძელება</translation>
 <translation id="4474494258097106883">შექმნილია თქვენი iPhone-ისთვის</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index a4d0f914..c508ef1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">Sākotnējā sinhronizācijas iestatīšana nav pabeigta</translation>
 <translation id="2843803966603263712">Atiestatīt tulk. iestat.</translation>
+<translation id="2848086008667475748">Padarīt par noklusējumu sadaļā Iestatījumi…</translation>
 <translation id="2858204748079866344">Lai aizsargātu jūsu konfidencialitāti, Chrome neveiks šī lauka automātisko aizpildi ar jūsu paroli.</translation>
 <translation id="285960592395650245">Lejupielādēt vēlreiz</translation>
 <translation id="2870560284913253234">Vietne</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">Vienmēr rādīt</translation>
 <translation id="418156467088430727">Skatīt bezsaistes versiju jaunā cilnē</translation>
 <translation id="4181841719683918333">Valodas</translation>
+<translation id="4237377247299956313">Pieskarieties vienumam <ph name="BEGIN_BOLD" />Noklusējuma pārlūka lietotne<ph name="END_BOLD" />.</translation>
 <translation id="424315890655130736">Ieejas frāzes ievade</translation>
 <translation id="4263576668337963058">Rādīt pieejamās lapas darbības</translation>
 <translation id="4267380167363222949">Nākamā cilne</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">Meklēšana ar QR kodu</translation>
 <translation id="4378154925671717803">Tālrunis</translation>
 <translation id="4389019817280890563">Pieskarieties, lai mainītu valodu.</translation>
+<translation id="4442550905108052454">Atveriet sadaļu <ph name="BEGIN_BOLD" />Iestatījumi<ph name="END_BOLD" />.</translation>
 <translation id="4454246407045105932">Valodas pievienošana</translation>
 <translation id="4469418912670346607">Turpināt iestatīšanu</translation>
 <translation id="4474494258097106883">Izstrādāts jūsu iPhone tālrunim</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index ed8471b..3849006 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">Konfigurimi i sinkronizimit fillestar nuk ka përfunduar</translation>
 <translation id="2843803966603263712">Rivendos cilësimet e përkthimit</translation>
+<translation id="2848086008667475748">Bëje "Të parazgjedhur" te "Cilësimet"…</translation>
 <translation id="2858204748079866344">Për të mbrojtur privatësinë tënde, Chrome nuk do ta plotësojë automatikisht fjalëkalimin tënd në këtë fushë.</translation>
 <translation id="285960592395650245">Provo sërish shkarkimin</translation>
 <translation id="2870560284913253234">Sajti</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">Trego gjithmonë</translation>
 <translation id="418156467088430727">Shiko versionin jashtë linje në një skedë të re</translation>
 <translation id="4181841719683918333">Gjuhët</translation>
+<translation id="4237377247299956313">Trokit <ph name="BEGIN_BOLD" />Aplikacionin e parazgjedhur të shfletuesit<ph name="END_BOLD" /></translation>
 <translation id="424315890655130736">Fut frazën e kalimit</translation>
 <translation id="4263576668337963058">Shfaq veprimet e disponueshme të faqes</translation>
 <translation id="4267380167363222949">Skeda tjetër</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">Kërkim me kod QR</translation>
 <translation id="4378154925671717803">Telefoni</translation>
 <translation id="4389019817280890563">Trokit për ta ndryshuar gjuhën.</translation>
+<translation id="4442550905108052454">Hap <ph name="BEGIN_BOLD" />Cilësimet<ph name="END_BOLD" /></translation>
 <translation id="4454246407045105932">Shto gjuhën</translation>
 <translation id="4469418912670346607">Vazhdo konfigurimin</translation>
 <translation id="4474494258097106883">Krijuar për iPhone tënd</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index f9167af3..bdec9f027 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
 <translation id="2840687315230832938">Chưa hoàn tất quá trình thiết lập đồng bộ hóa ban đầu</translation>
 <translation id="2843803966603263712">Đặt lại cài đặt dịch</translation>
+<translation id="2848086008667475748">Đặt thành Mặc định trong phần Cài đặt…</translation>
 <translation id="2858204748079866344">Để bảo vệ quyền riêng tư của bạn, Chrome sẽ không tự động điền mật khẩu của bạn vào trường này.</translation>
 <translation id="285960592395650245">Thử tải xuống lại</translation>
 <translation id="2870560284913253234">Trang web</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">Luôn hiển thị</translation>
 <translation id="418156467088430727">Xem phiên bản ngoại tuyến trong thẻ mới</translation>
 <translation id="4181841719683918333">Ngôn ngữ</translation>
+<translation id="4237377247299956313">Nhấn vào <ph name="BEGIN_BOLD" />Ứng dụng trình duyệt mặc định<ph name="END_BOLD" /></translation>
 <translation id="424315890655130736">Nhập cụm mật khẩu</translation>
 <translation id="4263576668337963058">Hiển thị các hành động có thể thực hiện trên trang</translation>
 <translation id="4267380167363222949">Thẻ tiếp theo</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">Tìm kiếm mã QR</translation>
 <translation id="4378154925671717803">Điện thoại</translation>
 <translation id="4389019817280890563">Nhấn để thay đổi ngôn ngữ.</translation>
+<translation id="4442550905108052454">Mở phần <ph name="BEGIN_BOLD" />Cài đặt<ph name="END_BOLD" /></translation>
 <translation id="4454246407045105932">Thêm ngôn ngữ</translation>
 <translation id="4469418912670346607">Tiếp tục thiết lập</translation>
 <translation id="4474494258097106883">Dành riêng cho iPhone</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 1f9abae..c353195 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -185,6 +185,7 @@
 <translation id="2834956026595107950"><ph name="TITLE" />,<ph name="STATE" />,<ph name="URL" /></translation>
 <translation id="2840687315230832938">尚未完成初始同步處理設定</translation>
 <translation id="2843803966603263712">重設翻譯設定</translation>
+<translation id="2848086008667475748">在「設定」中設為預設…</translation>
 <translation id="2858204748079866344">為保護個人隱私,Chrome 不會將你的密碼自動填入這個欄位。</translation>
 <translation id="285960592395650245">重新嘗試下載</translation>
 <translation id="2870560284913253234">網站</translation>
@@ -324,6 +325,7 @@
 <translation id="4172051516777682613">一律顯示</translation>
 <translation id="418156467088430727">在新分頁中檢視離線版本</translation>
 <translation id="4181841719683918333">語言</translation>
+<translation id="4237377247299956313">輕觸 [預設的瀏覽器應用程式]<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation>
 <translation id="424315890655130736">輸入通關密語</translation>
 <translation id="4263576668337963058">顯示可用的網頁動作</translation>
 <translation id="4267380167363222949">下一個分頁</translation>
@@ -339,6 +341,7 @@
 <translation id="4375040482473363939">QR 圖碼搜尋</translation>
 <translation id="4378154925671717803">電話</translation>
 <translation id="4389019817280890563">輕觸即可變更語言。</translation>
+<translation id="4442550905108052454">開啟「設定」<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation>
 <translation id="4454246407045105932">新增語言</translation>
 <translation id="4469418912670346607">繼續設定</translation>
 <translation id="4474494258097106883">專為 iPhone 量身打造</translation>
diff --git a/ios/chrome/browser/credential_provider/BUILD.gn b/ios/chrome/browser/credential_provider/BUILD.gn
index 13b20f0..b7d06da 100644
--- a/ios/chrome/browser/credential_provider/BUILD.gn
+++ b/ios/chrome/browser/credential_provider/BUILD.gn
@@ -19,6 +19,8 @@
     sources = [
       "archivable_credential+password_form.h",
       "archivable_credential+password_form.mm",
+      "credential_provider_migrator.h",
+      "credential_provider_migrator.mm",
       "credential_provider_service.h",
       "credential_provider_service.mm",
       "credential_provider_service_factory.h",
@@ -28,6 +30,7 @@
       "credential_provider_util.h",
       "credential_provider_util.mm",
     ]
+    public_deps = [ "//base" ]
     deps = [
       ":buildflags",
       "//base",
@@ -58,6 +61,7 @@
     testonly = true
     sources = [
       "archivable_credential+password_form_unittest.mm",
+      "credential_provider_migrator_unittest.mm",
       "credential_provider_service_unittest.mm",
     ]
     deps = [
diff --git a/ios/chrome/browser/credential_provider/credential_provider_migrator.h b/ios/chrome/browser/credential_provider/credential_provider_migrator.h
new file mode 100644
index 0000000..835437b
--- /dev/null
+++ b/ios/chrome/browser/credential_provider/credential_provider_migrator.h
@@ -0,0 +1,28 @@
+// 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 IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_CREDENTIAL_PROVIDER_MIGRATOR_H_
+#define IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_CREDENTIAL_PROVIDER_MIGRATOR_H_
+
+#import <Foundation/Foundation.h>
+
+#include "components/password_manager/core/browser/password_store.h"
+
+@interface CredentialProviderMigrator : NSObject
+- (instancetype)initWithUserDefaults:(NSUserDefaults*)userDefaults
+                                 key:(NSString*)key
+                       passwordStore:
+                           (scoped_refptr<password_manager::PasswordStore>)
+                               passwordStore;
+- (instancetype)init NS_UNAVAILABLE;
+
+// Starts migration from the temporal store to the password store. |completion|
+// is called with any error that could have happened. Migration happens in a
+// background thread.
+- (void)startMigrationWithCompletion:(void (^)(BOOL success,
+                                               NSError* error))completion;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_CREDENTIAL_PROVIDER_MIGRATOR_H_
diff --git a/ios/chrome/browser/credential_provider/credential_provider_migrator.mm b/ios/chrome/browser/credential_provider/credential_provider_migrator.mm
new file mode 100644
index 0000000..eb8d1fe
--- /dev/null
+++ b/ios/chrome/browser/credential_provider/credential_provider_migrator.mm
@@ -0,0 +1,85 @@
+// 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 "ios/chrome/browser/credential_provider/credential_provider_migrator.h"
+
+#include "components/password_manager/core/browser/password_form.h"
+#include "components/password_manager/core/browser/password_store.h"
+#import "ios/chrome/browser/credential_provider/archivable_credential+password_form.h"
+#import "ios/chrome/common/credential_provider/user_defaults_credential_store.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using password_manager::PasswordStore;
+
+NSErrorDomain const kCredentialProviderMigratorErrorDomain =
+    @"kCredentialProviderMigratorErrorDomain";
+
+typedef enum : NSInteger {
+  CredentialProviderMigratorErrorAlreadyRunning,
+} CredentialProviderMigratorErrors;
+
+@interface CredentialProviderMigrator ()
+
+// Key used to retrieve the temporal storage.
+@property(nonatomic, copy) NSString* key;
+
+// User defaults containing the temporal storage.
+@property(nonatomic, copy) NSUserDefaults* userDefaults;
+
+// Temporal store containing the passwords created in CPE extension.
+@property(nonatomic, strong) UserDefaultsCredentialStore* temporalStore;
+
+// Password manager store, where passwords will be migrated to.
+@property(nonatomic, assign) scoped_refptr<PasswordStore> passwordStore;
+
+@end
+
+@implementation CredentialProviderMigrator
+
+- (instancetype)initWithUserDefaults:(NSUserDefaults*)userDefaults
+                                 key:(NSString*)key
+                       passwordStore:
+                           (scoped_refptr<PasswordStore>)passwordStore {
+  self = [super init];
+  if (self) {
+    _key = key;
+    _userDefaults = userDefaults;
+    _passwordStore = passwordStore;
+  }
+  return self;
+}
+
+- (void)startMigrationWithCompletion:(void (^)(BOOL success,
+                                               NSError* error))completion {
+  if (self.temporalStore) {
+    NSError* error =
+        [NSError errorWithDomain:kCredentialProviderMigratorErrorDomain
+                            code:CredentialProviderMigratorErrorAlreadyRunning
+                        userInfo:nil];
+    completion(NO, error);
+    return;
+  }
+  self.temporalStore = [[UserDefaultsCredentialStore alloc]
+      initWithUserDefaults:self.userDefaults
+                       key:self.key];
+  NSArray<id<Credential>>* credentials = self.temporalStore.credentials.copy;
+  for (id<Credential> credential in credentials) {
+    password_manager::PasswordForm form =
+        PasswordFormFromCredential(credential);
+    self.passwordStore->AddLogin(form);
+    [self.temporalStore
+        removeCredentialWithRecordIdentifier:credential.recordIdentifier];
+  }
+  __weak __typeof__(self) weakSelf = self;
+  [self.temporalStore saveDataWithCompletion:^(NSError* error) {
+    DCHECK(!error);
+    weakSelf.temporalStore = nil;
+    completion(error == nil, error);
+  }];
+}
+
+@end
diff --git a/ios/chrome/browser/credential_provider/credential_provider_migrator_unittest.mm b/ios/chrome/browser/credential_provider/credential_provider_migrator_unittest.mm
new file mode 100644
index 0000000..04ee3ac51
--- /dev/null
+++ b/ios/chrome/browser/credential_provider/credential_provider_migrator_unittest.mm
@@ -0,0 +1,107 @@
+// 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 "ios/chrome/browser/credential_provider/credential_provider_migrator.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#import "base/test/ios/wait_util.h"
+#include "base/test/task_environment.h"
+#include "components/password_manager/core/browser/mock_password_store.h"
+#include "components/password_manager/core/browser/password_form.h"
+#import "ios/chrome/browser/credential_provider/archivable_credential+password_form.h"
+#import "ios/chrome/common/credential_provider/archivable_credential.h"
+#import "ios/chrome/common/credential_provider/user_defaults_credential_store.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+#include "url/gurl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+using base::test::ios::WaitUntilConditionOrTimeout;
+using base::test::ios::kWaitForFileOperationTimeout;
+using password_manager::MockPasswordStore;
+using password_manager::PasswordForm;
+
+ArchivableCredential* TestCredential() {
+  NSString* username = @"username_value";
+  NSString* keychainIdentifier = @"keychain_identifier_value";
+  NSString* url = @"http://www.alpha.example.com/path/and?args=8";
+  NSString* recordIdentifier = @"recordIdentifier";
+  return [[ArchivableCredential alloc] initWithFavicon:nil
+                                    keychainIdentifier:keychainIdentifier
+                                                  rank:1
+                                      recordIdentifier:recordIdentifier
+                                     serviceIdentifier:url
+                                           serviceName:nil
+                                                  user:username
+                                  validationIdentifier:nil];
+}
+
+class CredentialProviderMigratorTest : public PlatformTest {
+ protected:
+  void SetUp() override {
+    [user_defaults_ removeObjectForKey:store_key_];
+    mock_store_->Init(nullptr);
+  }
+  void TearDown() override {
+    [user_defaults_ removeObjectForKey:store_key_];
+    mock_store_->ShutdownOnUIThread();
+  }
+
+  NSUserDefaults* user_defaults_ = [NSUserDefaults standardUserDefaults];
+  NSString* store_key_ = @"store_key";
+  scoped_refptr<MockPasswordStore> mock_store_ =
+      base::MakeRefCounted<testing::NiceMock<MockPasswordStore>>();
+
+ private:
+  base::test::SingleThreadTaskEnvironment task_environment_;
+};
+
+// Tests basic migration for 1 credential.
+TEST_F(CredentialProviderMigratorTest, Migration) {
+  // Create temp store and add 1 credential.
+  UserDefaultsCredentialStore* store =
+      [[UserDefaultsCredentialStore alloc] initWithUserDefaults:user_defaults_
+                                                            key:store_key_];
+  id<Credential> credential = TestCredential();
+  [store addCredential:credential];
+  [store saveDataWithCompletion:^(NSError* error) {
+    EXPECT_TRUE(error == nil);
+  }];
+  EXPECT_EQ(store.credentials.count, 1u);
+
+  // Create the migrator to be tested.
+  CredentialProviderMigrator* migrator =
+      [[CredentialProviderMigrator alloc] initWithUserDefaults:user_defaults_
+                                                           key:store_key_
+                                                 passwordStore:mock_store_];
+  EXPECT_TRUE(migrator);
+
+  // Start migration.
+  PasswordForm expected = PasswordFormFromCredential(credential);
+  EXPECT_CALL(*mock_store_, AddLogin(expected));
+  __block BOOL blockWaitCompleted = false;
+  [migrator startMigrationWithCompletion:^(BOOL success, NSError* error) {
+    EXPECT_TRUE(success);
+    EXPECT_FALSE(error);
+    blockWaitCompleted = true;
+  }];
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^bool {
+    return blockWaitCompleted;
+  }));
+
+  // Reload temporal store.
+  store =
+      [[UserDefaultsCredentialStore alloc] initWithUserDefaults:user_defaults_
+                                                            key:store_key_];
+  // Verify credentials are empty
+  EXPECT_EQ(store.credentials.count, 0u);
+}
+
+}  // namespace
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
index 37ee466e..974567a 100644
--- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -133,7 +133,7 @@
 
   AccountInfo GetAccountInfo() const override;
 
-  AccountInfo GetSignedInNonSyncAccount(
+  AccountInfo GetAccountInfoForUsername(
       const std::string& username) const override;
 
   safe_browsing::LoginReputationClientRequest::PasswordReuseEvent::
@@ -163,9 +163,7 @@
 
   bool IsPrimaryAccountSignedIn() const override;
 
-  bool IsPrimaryAccountGmail() const override;
-
-  bool IsOtherGaiaAccountGmail(const std::string& username) const override;
+  bool IsAccountGmail(const std::string& username) const override;
 
   bool IsInExcludedCountry() override;
 
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
index 1ac5eaf..5bea3199 100644
--- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
+++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
@@ -378,7 +378,7 @@
       identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync));
 }
 
-AccountInfo ChromePasswordProtectionService::GetSignedInNonSyncAccount(
+AccountInfo ChromePasswordProtectionService::GetAccountInfoForUsername(
     const std::string& username) const {
   auto* identity_manager =
       IdentityManagerFactory::GetForBrowserState(browser_state_);
@@ -479,13 +479,9 @@
          !GetAccountInfo().hosted_domain.empty();
 }
 
-bool ChromePasswordProtectionService::IsPrimaryAccountGmail() const {
-  return GetAccountInfo().hosted_domain == kNoHostedDomainFound;
-}
-
-bool ChromePasswordProtectionService::IsOtherGaiaAccountGmail(
+bool ChromePasswordProtectionService::IsAccountGmail(
     const std::string& username) const {
-  return GetSignedInNonSyncAccount(username).hosted_domain ==
+  return GetAccountInfoForUsername(username).hosted_domain ==
          kNoHostedDomainFound;
 }
 
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm
index f7fb7ef..c157d76 100644
--- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm
+++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm
@@ -103,7 +103,7 @@
   bool IsPrimaryAccountSignedIn() const override {
     return is_account_signed_in_;
   }
-  bool IsPrimaryAccountGmail() const override {
+  bool IsAccountGmail(const std::string& username) const override {
     return is_no_hosted_domain_found_;
   }
   void SetIsIncognito(bool is_incognito) { is_incognito_ = is_incognito; }
diff --git a/ios/chrome/browser/ui/authentication/signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
index 72864a8a..ea953d3 100644
--- a/ios/chrome/browser/ui/authentication/signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
@@ -111,10 +111,7 @@
     "//build/config/ios:xctest_config",
   ]
   testonly = true
-  sources = [
-    "signin_coordinator_egtest.mm",
-    "signin_coordinator_mice_egtest.mm",
-  ]
+  sources = [ "signin_coordinator_egtest.mm" ]
   deps = [
     "//base",
     "//base/test:test_support",
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
index 832ae52..93aadd7 100644
--- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
+++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
@@ -9,6 +9,7 @@
 #import "components/signin/ios/browser/features.h"
 #include "components/signin/public/base/account_consistency_method.h"
 #include "components/signin/public/base/signin_pref_names.h"
+#include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
@@ -16,6 +17,8 @@
 #import "ios/chrome/browser/ui/authentication/views/views_constants.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h"
 #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_constants.h"
+#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h"
+#import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -33,16 +36,21 @@
 
 using chrome_test_util::BookmarksNavigationBarDoneButton;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
+using chrome_test_util::ClearBrowsingDataButton;
+using chrome_test_util::ConfirmClearBrowsingDataButton;
 using chrome_test_util::GoogleServicesSettingsView;
 using chrome_test_util::IdentityCellMatcherForEmail;
 using chrome_test_util::PrimarySignInButton;
 using chrome_test_util::SecondarySignInButton;
+using chrome_test_util::SettingsAccountButton;
+using chrome_test_util::SettingsCollectionView;
 using chrome_test_util::SettingsDoneButton;
 using chrome_test_util::SettingsImportDataContinueButton;
 using chrome_test_util::SettingsImportDataImportButton;
 using chrome_test_util::SettingsImportDataKeepSeparateButton;
 using chrome_test_util::SettingsLink;
 using chrome_test_util::SettingsMenuBackButton;
+using chrome_test_util::SettingsMenuPrivacyButton;
 using chrome_test_util::StaticTextWithAccessibilityLabelId;
 using chrome_test_util::SyncSettingsConfirmButton;
 using l10n_util::GetNSString;
@@ -57,6 +65,8 @@
 
 namespace {
 
+NSString* const kPassphrase = @"hello";
+
 // Returns a matcher for |userEmail| in IdentityChooserViewController.
 id<GREYMatcher> identityChooserButtonMatcherWithEmail(NSString* userEmail) {
   return grey_allOf(grey_accessibilityID(userEmail),
@@ -109,13 +119,6 @@
 
 @implementation SigninCoordinatorTestCase
 
-- (AppLaunchConfiguration)appConfigurationForTestCase {
-  AppLaunchConfiguration config;
-  config.features_disabled.push_back(signin::kMobileIdentityConsistency);
-  config.features_enabled.push_back(signin::kSimplifySignOutIOS);
-  return config;
-}
-
 - (void)setUp {
   [super setUp];
   // Remove closed tab history to make sure the sign-in promo is always visible
@@ -428,7 +431,9 @@
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   [self openSigninFromView:OpenSigninMethodFromSettings tapSettingsLink:YES];
 
-  [[EarlGrey selectElementWithMatcher:GoogleServicesSettingsView()]
+  [[EarlGrey
+      selectElementWithMatcher:grey_accessibilityID(
+                                   kManageSyncTableViewAccessibilityIdentifier)]
       performAction:grey_swipeFastInDirection(kGREYDirectionDown)];
   [[EarlGrey
       selectElementWithMatcher:
@@ -650,4 +655,230 @@
   [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSigninAllowedByPolicy];
 }
 
+// Tests that a signed-in user can open "Settings" screen from the NTP.
+- (void)testOpenManageSyncSettingsFromNTP {
+  // Sign in to Chrome.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+
+  // Select the identity disc particle.
+  [[EarlGrey
+      selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString(
+                                   IDS_ACCNAME_PARTICLE_DISC))]
+      performAction:grey_tap()];
+
+  // Ensure the Settings menu is displayed.
+  [[EarlGrey selectElementWithMatcher:SettingsCollectionView()]
+      assertWithMatcher:grey_sufficientlyVisible()];
+}
+
+// Tests that opening the sign-in screen from the Settings and signing in works
+// correctly when there is already an identity on the device.
+- (void)testSignInFromSettingsMenu {
+  // Set up a fake identity.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+
+  // Check |fakeIdentity| is signed-in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+
+  // Check the Settings Menu labels for sync state.
+  [ChromeEarlGreyUI openSettingsMenu];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityValue(
+                                       l10n_util::GetNSString(
+                                           IDS_IOS_SETTING_ON)),
+                                   grey_accessibilityID(
+                                       kSettingsGoogleSyncAndServicesCellId),
+                                   nil)]
+      assertWithMatcher:grey_sufficientlyVisible()];
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
+                                          kSettingsGoogleServicesCellId)]
+      assertWithMatcher:grey_sufficientlyVisible()];
+  [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
+      assertWithMatcher:grey_sufficientlyVisible()];
+}
+
+// Tests that opening the sign-in screen from the Sync Off tab and signin in
+// will turn Sync On.
+- (void)testSignInFromSyncOffLink {
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  // Check Sync Off label is visible and user is signed in.
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityValue(
+                                       l10n_util::GetNSString(
+                                           IDS_IOS_SETTING_OFF)),
+                                   grey_accessibilityID(
+                                       kSettingsGoogleSyncAndServicesCellId),
+                                   nil)] performAction:grey_tap()];
+
+  [SigninEarlGreyUI tapSigninConfirmationDialog];
+
+  // Check Sync On label is visible and user is signed in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityValue(
+                                       l10n_util::GetNSString(
+                                           IDS_IOS_SETTING_ON)),
+                                   grey_accessibilityID(
+                                       kSettingsGoogleSyncAndServicesCellId),
+                                   nil)]
+      assertWithMatcher:grey_sufficientlyVisible()];
+  [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
+      performAction:grey_tap()];
+  [ChromeEarlGreyUI waitForToolbarVisible:YES];
+}
+
+// Tests that the sign-in promo for no identities is displayed in Settings when
+// the user is signed out and has not added any identities to the device.
+- (void)testSigninPromoWithNoIdentitiesOnDevice {
+  [ChromeEarlGreyUI openSettingsMenu];
+
+  [SigninEarlGrey verifySignedOut];
+  [SigninEarlGreyUI
+      verifySigninPromoVisibleWithMode:SigninPromoViewModeNoAccounts];
+}
+
+// Tests that the sign-in promo with user name is displayed in Settings when the
+// user is signed out.
+- (void)testSigninPromoWhenSignedOut {
+  // Add identity to the device.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+
+  [SigninEarlGrey verifySignedOut];
+  [SigninEarlGreyUI
+      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
+}
+
+// Tests that the sign-in promo is removed from Settings when the user
+// is signed out and has closed the sign-in promo with user name.
+- (void)testSigninPromoClosedWhenSignedOut {
+  // Add identity to the device.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGreyUI
+      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount
+                           closeButton:YES];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
+                                              kSigninPromoCloseButtonId),
+                                          grey_sufficientlyVisible(), nil)]
+      performAction:grey_tap()];
+
+  [SigninEarlGrey verifySignedOut];
+  [SigninEarlGreyUI verifySigninPromoNotVisible];
+}
+
+// Tests that the sign-in promo for Sync is displayed when the user is signed in
+// with Sync off.
+- (void)testSigninPromoWhenSyncOff {
+  // Add identity to the device.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  [SigninEarlGreyUI
+      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
+}
+
+// Tests that no sign-in promo for Sync is displayed when the user is signed in
+// with Sync off and has closed the sign-in promo for Sync.
+- (void)testSigninPromoClosedWhenSyncOff {
+  // Add identity to the device.
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGreyUI
+      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
+  // Tap on dismiss button.
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
+                                              kSigninPromoCloseButtonId),
+                                          grey_sufficientlyVisible(), nil)]
+      performAction:grey_tap()];
+
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  [SigninEarlGreyUI verifySigninPromoNotVisible];
+}
+
+// Tests that a user in the |ConsentLevel::kSignin| state will be signed out
+// after clearing their browsing history.
+- (void)testUserSignedOutWhenClearingBrowsingData {
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()];
+  [ChromeEarlGreyUI
+      tapPrivacyMenuButton:ButtonWithAccessibilityLabelId(
+                               IDS_IOS_CLEAR_BROWSING_DATA_TITLE)];
+  [ChromeEarlGreyUI tapClearBrowsingDataMenuButton:ClearBrowsingDataButton()];
+  [[EarlGrey selectElementWithMatcher:ConfirmClearBrowsingDataButton()]
+      performAction:grey_tap()];
+
+  [SigninEarlGrey verifySignedOut];
+}
+
+// Tests that Sync is on when introducing passphrase from settings, after
+// logging in.
+- (void)testSyncOnWhenPassphraseIntroducedAfterSignIn {
+  [ChromeEarlGrey addBookmarkWithSyncPassphrase:kPassphrase];
+  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()];
+  [SigninEarlGreyUI tapSigninConfirmationDialog];
+
+  [[EarlGrey
+      selectElementWithMatcher:
+          grey_allOf(grey_accessibilityValue(l10n_util::GetNSString(
+                         IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION)),
+                     grey_accessibilityID(kSettingsGoogleSyncAndServicesCellId),
+                     nil)] performAction:grey_tap()];
+
+  // Scroll to bottom of Manage Sync Settings, if necessary.
+  [[EarlGrey selectElementWithMatcher:
+                 grey_allOf(grey_accessibilityID(
+                                kManageSyncTableViewAccessibilityIdentifier),
+                            grey_sufficientlyVisible(), nil)]
+      performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)];
+
+  // Select Encryption item.
+  [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
+                                          IDS_IOS_MANAGE_SYNC_ENCRYPTION)]
+      performAction:grey_tap()];
+
+  // Type and submit the sync passphrase.
+  [SigninEarlGreyUI submitSyncPassphrase:kPassphrase];
+
+  [ChromeEarlGrey
+      waitForSufficientlyVisibleElementWithMatcher:SettingsDoneButton()];
+  [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
+      performAction:grey_tap()];
+  [ChromeEarlGreyUI openSettingsMenu];
+
+  // Check Sync On label is visible.
+  [SigninEarlGrey verifySyncUIEnabled:YES];
+}
 @end
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_mice_egtest.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_mice_egtest.mm
deleted file mode 100644
index dca0f8f9..0000000
--- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_mice_egtest.mm
+++ /dev/null
@@ -1,293 +0,0 @@
-// 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 "base/ios/block_types.h"
-#include "base/ios/ios_util.h"
-#include "components/signin/public/base/account_consistency_method.h"
-#include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/ui/authentication/signin_earl_grey.h"
-#import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
-#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h"
-#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h"
-#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h"
-#import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h"
-#include "ios/chrome/grit/ios_strings.h"
-#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
-#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
-#import "ios/chrome/test/earl_grey/chrome_matchers.h"
-#import "ios/chrome/test/earl_grey/chrome_test_case.h"
-#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
-#import "ios/testing/earl_grey/earl_grey_test.h"
-#import "ios/testing/earl_grey/matchers.h"
-#include "ui/base/l10n/l10n_util_mac.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using chrome_test_util::ButtonWithAccessibilityLabelId;
-using chrome_test_util::ButtonWithAccessibilityLabel;
-using chrome_test_util::GoogleServicesSettingsButton;
-using chrome_test_util::PrimarySignInButton;
-using chrome_test_util::SettingsAccountButton;
-using chrome_test_util::SettingsDoneButton;
-using chrome_test_util::ClearBrowsingDataButton;
-using chrome_test_util::ConfirmClearBrowsingDataButton;
-using chrome_test_util::SettingsMenuPrivacyButton;
-using chrome_test_util::SettingsCollectionView;
-
-namespace {
-NSString* const kPassphrase = @"hello";
-}
-
-// Sign-in interaction tests that work with |kMobileIdentityConsistency|
-// enabled.
-@interface SigninCoordinatorMICETestCase : ChromeTestCase
-@end
-
-@implementation SigninCoordinatorMICETestCase
-
-- (AppLaunchConfiguration)appConfigurationForTestCase {
-  AppLaunchConfiguration config;
-  config.features_enabled.push_back(signin::kMobileIdentityConsistency);
-  return config;
-}
-
-- (void)setUp {
-  [super setUp];
-  // Remove closed tab history to make sure the sign-in promo is always visible
-  // in recent tabs.
-  [ChromeEarlGrey clearBrowsingHistory];
-}
-
-// Tests that a signed-in user can open "Settings" screen from the NTP.
-- (void)testOpenManageSyncSettingsFromNTP {
-  // Sign in to Chrome.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
-
-  // Select the identity disc particle.
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString(
-                                   IDS_ACCNAME_PARTICLE_DISC))]
-      performAction:grey_tap()];
-
-  // Ensure the Settings menu is displayed.
-  [[EarlGrey selectElementWithMatcher:SettingsCollectionView()]
-      assertWithMatcher:grey_sufficientlyVisible()];
-}
-
-// Tests that opening the sign-in screen from the Settings and signing in works
-// correctly when there is already an identity on the device.
-- (void)testSignInFromSettingsMenu {
-  // Set up a fake identity.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
-
-  // Check |fakeIdentity| is signed-in.
-  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-
-  // Check the Settings Menu labels for sync state.
-  [ChromeEarlGreyUI openSettingsMenu];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(
-                                   grey_accessibilityValue(
-                                       l10n_util::GetNSString(
-                                           IDS_IOS_SETTING_ON)),
-                                   grey_accessibilityID(
-                                       kSettingsGoogleSyncAndServicesCellId),
-                                   nil)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                          kSettingsGoogleServicesCellId)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
-      assertWithMatcher:grey_sufficientlyVisible()];
-}
-
-// Tests that opening the sign-in screen from the Sync Off tab and signin in
-// will turn Sync On.
-- (void)testSignInFromSyncOffLink {
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  // Check Sync Off label is visible and user is signed in.
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(
-                                   grey_accessibilityValue(
-                                       l10n_util::GetNSString(
-                                           IDS_IOS_SETTING_OFF)),
-                                   grey_accessibilityID(
-                                       kSettingsGoogleSyncAndServicesCellId),
-                                   nil)] performAction:grey_tap()];
-
-  [SigninEarlGreyUI tapSigninConfirmationDialog];
-
-  // Check Sync On label is visible and user is signed in.
-  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(
-                                   grey_accessibilityValue(
-                                       l10n_util::GetNSString(
-                                           IDS_IOS_SETTING_ON)),
-                                   grey_accessibilityID(
-                                       kSettingsGoogleSyncAndServicesCellId),
-                                   nil)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
-      performAction:grey_tap()];
-  [ChromeEarlGreyUI waitForToolbarVisible:YES];
-}
-
-// Tests that the sign-in promo for no identities is displayed in Settings when
-// the user is signed out and has not added any identities to the device.
-- (void)testSigninPromoWithNoIdentitiesOnDevice {
-  [ChromeEarlGreyUI openSettingsMenu];
-
-  [SigninEarlGrey verifySignedOut];
-  [SigninEarlGreyUI
-      verifySigninPromoVisibleWithMode:SigninPromoViewModeNoAccounts];
-}
-
-// Tests that the sign-in promo with user name is displayed in Settings when the
-// user is signed out.
-- (void)testSigninPromoWhenSignedOut {
-  // Add identity to the device.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-
-  [SigninEarlGrey verifySignedOut];
-  [SigninEarlGreyUI
-      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
-}
-
-// Tests that the sign-in promo is removed from Settings when the user
-// is signed out and has closed the sign-in promo with user name.
-- (void)testSigninPromoClosedWhenSignedOut {
-  // Add identity to the device.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  [SigninEarlGreyUI
-      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount
-                           closeButton:YES];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
-                                              kSigninPromoCloseButtonId),
-                                          grey_sufficientlyVisible(), nil)]
-      performAction:grey_tap()];
-
-  [SigninEarlGrey verifySignedOut];
-  [SigninEarlGreyUI verifySigninPromoNotVisible];
-}
-
-// Tests that the sign-in promo for Sync is displayed when the user is signed in
-// with Sync off.
-- (void)testSigninPromoWhenSyncOff {
-  // Add identity to the device.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI
-      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
-}
-
-// Tests that no sign-in promo for Sync is displayed when the user is signed in
-// with Sync off and has closed the sign-in promo for Sync.
-- (void)testSigninPromoClosedWhenSyncOff {
-  // Add identity to the device.
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  [SigninEarlGreyUI
-      verifySigninPromoVisibleWithMode:SigninPromoViewModeSigninWithAccount];
-  // Tap on dismiss button.
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
-                                              kSigninPromoCloseButtonId),
-                                          grey_sufficientlyVisible(), nil)]
-      performAction:grey_tap()];
-
-  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI verifySigninPromoNotVisible];
-}
-
-// Tests that a user in the |ConsentLevel::kSignin| state will be signed out
-// after clearing their browsing history.
-- (void)testUserSignedOutWhenClearingBrowsingData {
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()];
-  [ChromeEarlGreyUI
-      tapPrivacyMenuButton:ButtonWithAccessibilityLabelId(
-                               IDS_IOS_CLEAR_BROWSING_DATA_TITLE)];
-  [ChromeEarlGreyUI tapClearBrowsingDataMenuButton:ClearBrowsingDataButton()];
-  [[EarlGrey selectElementWithMatcher:ConfirmClearBrowsingDataButton()]
-      performAction:grey_tap()];
-
-  [SigninEarlGrey verifySignedOut];
-}
-
-// Tests that Sync is on when introducing passphrase from settings, after
-// logging in.
-- (void)testSyncOnWhenPassphraseIntroducedAfterSignIn {
-  [ChromeEarlGrey addBookmarkWithSyncPassphrase:kPassphrase];
-  FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-
-  [ChromeEarlGreyUI openSettingsMenu];
-  [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()];
-  [SigninEarlGreyUI tapSigninConfirmationDialog];
-
-  // Give the Sync state a chance to finish UI updates.
-  [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
-                      GoogleServicesSettingsButton()];
-  [[EarlGrey
-      selectElementWithMatcher:
-          grey_allOf(grey_accessibilityValue(l10n_util::GetNSString(
-                         IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION)),
-                     grey_accessibilityID(kSettingsGoogleSyncAndServicesCellId),
-                     nil)] performAction:grey_tap()];
-
-  // Scroll to bottom of Manage Sync Settings, if necessary.
-  [[EarlGrey selectElementWithMatcher:
-                 grey_allOf(grey_accessibilityID(
-                                kManageSyncTableViewAccessibilityIdentifier),
-                            grey_sufficientlyVisible(), nil)]
-      performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)];
-
-  // Select Encryption item.
-  [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
-                                          IDS_IOS_MANAGE_SYNC_ENCRYPTION)]
-      performAction:grey_tap()];
-
-  // Type and submit the sync passphrase.
-  [SigninEarlGreyUI submitSyncPassphrase:kPassphrase];
-
-  [ChromeEarlGrey
-      waitForSufficientlyVisibleElementWithMatcher:SettingsDoneButton()];
-  [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
-      performAction:grey_tap()];
-  [ChromeEarlGreyUI openSettingsMenu];
-
-  // Check Sync On label is visible.
-  [SigninEarlGrey verifySyncUIEnabled:YES];
-}
-@end
diff --git a/ios/chrome/common/credential_provider/user_defaults_credential_store.h b/ios/chrome/common/credential_provider/user_defaults_credential_store.h
index fa34c8e..6f9e767 100644
--- a/ios/chrome/common/credential_provider/user_defaults_credential_store.h
+++ b/ios/chrome/common/credential_provider/user_defaults_credential_store.h
@@ -18,7 +18,7 @@
 
 // Initializes the store. |userDefaults| is where the store will be persisted.
 - (instancetype)initWithUserDefaults:(NSUserDefaults*)userDefaults
-                                 key:(NSString*)keyNS_DESIGNATED_INITIALIZER;
+                                 key:(NSString*)key NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
 @end
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
index c1744a3..afa7b0a3 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">Nome de usuario</translation>
 <translation id="8518521100965196752">Para usar os contrasinais, en primeiro lugar debes definir un contrasinal no teu dispositivo.</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648">Para <ph name="URL" /></translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
index df01e13..b9d307c 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">Օգտանուն</translation>
 <translation id="8518521100965196752">Գաղտնաբառերն օգտագործելու համար նախ պետք է ձեր սարքում անցակոդ սահմանեք։</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648"><ph name="URL" /> կայքի համար</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
index 0a7603b..9569c9af 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">მომხმარებლის სახელი</translation>
 <translation id="8518521100965196752">პაროლების გამოსაყენებლად, პირველ რიგში, საჭიროა საიდუმლო კოდის დაყენება თქვენს მოწყობილობაზე.</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648"><ph name="URL" />-ისთვის</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
index 45e6bde..ce11bace 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">Lietotājvārds</translation>
 <translation id="8518521100965196752">Lai izmantotu paroles, vispirms ierīcei ir jāiestata piekļuves kods.</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648">Vietnei <ph name="URL" /></translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
index 65d5603..e8acd2a 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">Emri i përdoruesit</translation>
 <translation id="8518521100965196752">Për të përdorur fjalëkalimet, duhet të vendosësh në fillim një kod në pajisjen tënde.</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648">Për <ph name="URL" /></translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
index fb523dd..20af0b8 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">Tên người dùng</translation>
 <translation id="8518521100965196752">Để sử dụng mật khẩu, trước tiên, bạn phải đặt mật mã trên thiết bị của mình.</translation>
 <translation id="8877181643142698531">URL</translation>
+<translation id="9069288651897538648">Đối với <ph name="URL" /></translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
index 96154db..645eba4 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
@@ -39,4 +39,5 @@
 <translation id="8503813439785031346">使用者名稱</translation>
 <translation id="8518521100965196752">你必須先在裝置上設定螢幕解鎖密碼才能使用密碼。</translation>
 <translation id="8877181643142698531">網址</translation>
+<translation id="9069288651897538648">適用於 <ph name="URL" /></translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index 3d967bc..6c52c3f 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-f7740b329a1554c83d8cc4ffb551b23f893001e6
\ No newline at end of file
+9a9f74880a2673f2adcbf874637370f6b15e9ab8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index 09c8716..0567c112 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-b38cdf41a3f93e1e2844095e7ca9e9d6ccdf246f
\ No newline at end of file
+815b75edb192863fb0f94956d83962a873b9951b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
index 7133a93..a1e569c 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-a9d96b3e936aa648d92653578e2567fb853acf33
\ No newline at end of file
+88f38c115879d393d90904581a28ee6e47152975
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
index 6ba03a8..57b77ef6 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-8240edab429489165e3388add0bb77940cd7582b
\ No newline at end of file
+5fc70e66b5642178753c755dfa60f52a1b70b70e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index 3ee109d..8e64914 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-40e645a83b7e689009b67836d72919389bad1b16
\ No newline at end of file
+34a0fa8ab7394c030fd6b404ea1d1c3b64aaa807
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index db61856..ea35b648 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-09edb2624ed8cce11bdee17f72b09b82086c3f9d
\ No newline at end of file
+f5d981de4b713bcec6ff469bbe3a2186e3539fb7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 4dfbbaf..278f5ae3 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-307e3dc66125067d044deb0431e37e467c5ab52e
\ No newline at end of file
+98834484c74c544c05556db15520cb5a754eeb7e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index 9beb0dd..9d0155c0 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-ae5ffc4bacad995363d8e4447a8af7d477ceb673
\ No newline at end of file
+53fbf94a5dfb26cfd048f592583557db9b5b883b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index 0838d72..354a16c 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-fd2473e852d7a594f2bc14b5692c683a2ed545b6
\ No newline at end of file
+93e6df7123197059d167a787e9fe1395b522539d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index e0e53d43..e6dbfd0d 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-c75f890f7753d19d247437334e691123aaf01997
\ No newline at end of file
+67abcf725ff62ddd00b2f8a3ed1bd793f169226d
\ No newline at end of file
diff --git a/ios/web/text_fragments/resources/text_fragments.js b/ios/web/text_fragments/resources/text_fragments.js
index 26340ea7..ac290c9 100644
--- a/ios/web/text_fragments/resources/text_fragments.js
+++ b/ios/web/text_fragments/resources/text_fragments.js
@@ -48,10 +48,23 @@
     }
   };
 
-  __gCrWeb.textFragments.removeHighlights = function() {
+  __gCrWeb.textFragments.removeHighlights = function(new_url) {
     utils.removeMarks(marks);
     document.removeEventListener("click", handleClick,
                                  /*useCapture=*/true);
+    if (new_url) {
+      try {
+        history.replaceState(
+            history.state,  // Don't overwrite any existing state object
+            "",  // Title param is required but unused
+            new_url);
+      } catch (err) {
+        // history.replaceState throws an exception if the origin of the new URL
+        // is different from the current one. This shouldn't happen, but if it
+        // does, we don't want the exception to bubble up and cause
+        // side-effects.
+      }
+    }
   };
 
   /**
diff --git a/ios/web/text_fragments/text_fragments_java_script_feature.h b/ios/web/text_fragments/text_fragments_java_script_feature.h
index a4279cd..0afe00d 100644
--- a/ios/web/text_fragments/text_fragments_java_script_feature.h
+++ b/ios/web/text_fragments/text_fragments_java_script_feature.h
@@ -11,6 +11,7 @@
 #include "base/values.h"
 #import "ios/web/public/js_messaging/java_script_feature.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
 
 namespace web {
 
@@ -31,8 +32,8 @@
                                     std::string foreground_color_hex_rgb);
 
   // Removes all highlights that are currently being displayed on the page as a
-  // result of invoking ProcessTextFragments.
-  virtual void RemoveHighlights(WebState* web_state);
+  // result of invoking ProcessTextFragments. Updates the page URL to |new_url|.
+  virtual void RemoveHighlights(WebState* web_state, const GURL& new_url);
 
  protected:
   // JavaScriptFeature:
diff --git a/ios/web/text_fragments/text_fragments_java_script_feature.mm b/ios/web/text_fragments/text_fragments_java_script_feature.mm
index d7b001ae..5a2ffbd 100644
--- a/ios/web/text_fragments/text_fragments_java_script_feature.mm
+++ b/ios/web/text_fragments/text_fragments_java_script_feature.mm
@@ -69,11 +69,14 @@
   CallJavaScriptFunction(frame, kHandleFragmentsScript, parameters);
 }
 
-void TextFragmentsJavaScriptFeature::RemoveHighlights(WebState* web_state) {
+void TextFragmentsJavaScriptFeature::RemoveHighlights(WebState* web_state,
+                                                      const GURL& new_url) {
   DCHECK(web_state);
   auto* frame = web::GetMainFrame(web_state);
   DCHECK(frame);
-  CallJavaScriptFunction(frame, kRemoveHighlightsScript, {});
+  std::vector<base::Value> parameters;
+  parameters.emplace_back(new_url.is_valid() ? new_url.spec() : "");
+  CallJavaScriptFunction(frame, kRemoveHighlightsScript, parameters);
 }
 
 void TextFragmentsJavaScriptFeature::ScriptMessageReceived(
diff --git a/ios/web/text_fragments/text_fragments_manager_impl.mm b/ios/web/text_fragments/text_fragments_manager_impl.mm
index a43ffe2..197a83a9 100644
--- a/ios/web/text_fragments/text_fragments_manager_impl.mm
+++ b/ios/web/text_fragments/text_fragments_manager_impl.mm
@@ -29,8 +29,8 @@
 // Returns a rgb hexadecimal color, suitable for processing in JavaScript
 std::string ToHexStringRGB(int color) {
   std::stringstream sstream;
-  sstream << "'" << std::setfill('0') << std::setw(6) << std::hex
-          << (color & 0x00FFFFFF) << "'";
+  sstream << std::setfill('0') << std::setw(6) << std::hex
+          << (color & 0x00FFFFFF);
   return sstream.str();
 }
 
@@ -79,8 +79,10 @@
 }
 
 void TextFragmentsManagerImpl::OnClick() {
-  // TODO(crbug.com/1230576): Update URL to no longer display text fragment
-  GetJSFeature()->RemoveHighlights(web_state_);
+  // Remove the fragments that are visible on the page and update the URL.
+  GetJSFeature()->RemoveHighlights(web_state_,
+                                   shared_highlighting::RemoveTextFragments(
+                                       web_state_->GetLastCommittedURL()));
 }
 
 void TextFragmentsManagerImpl::DidFinishNavigation(
diff --git a/ios/web/text_fragments/text_fragments_manager_impl_unittest.mm b/ios/web/text_fragments/text_fragments_manager_impl_unittest.mm
index d5bfb117..8c4bb2f 100644
--- a/ios/web/text_fragments/text_fragments_manager_impl_unittest.mm
+++ b/ios/web/text_fragments/text_fragments_manager_impl_unittest.mm
@@ -44,6 +44,7 @@
 const char kSingleFragmentURL[] = "https://chromium.org#:~:text=text";
 const char kTwoFragmentsURL[] =
     "https://chromium.org#:~:text=text&text=other%20text";
+const char kFragmentsRemovedURL[] = "https://chromium.org#";
 
 const char kSearchEngineURL[] = "https://google.com";
 const char kNonSearchEngineURL[] = "https://notasearchengine.com";
@@ -60,7 +61,10 @@
                std::string background_color_hex_rgb,
                std::string foreground_color_hex_rgb),
               (override));
-  MOCK_METHOD(void, RemoveHighlights, (web::WebState * web_state), (override));
+  MOCK_METHOD(void,
+              RemoveHighlights,
+              (web::WebState * web_state, const GURL& new_url),
+              (override));
 };
 
 base::Value ValueForTestURL() {
@@ -215,7 +219,7 @@
 
   base::Value expected = ValueForTestURL();
   EXPECT_CALL(feature_, ProcessTextFragments(web_state_, Eq(std::ref(expected)),
-                                             "'e9d2fd'", "'000000'"));
+                                             "e9d2fd", "000000"));
 
   TextFragmentsManagerImpl* manager =
       CreateManager(/*has_opener=*/false,
@@ -411,8 +415,10 @@
 }
 
 TEST_F(TextFragmentsManagerImplTest, ClickRemovesHighlights) {
+  SetLastURL(GURL(kSingleFragmentURL));
   TextFragmentsManagerImpl* manager = CreateDefaultManager();
-  EXPECT_CALL(feature_, RemoveHighlights(_));
+  GURL fragments_removed_gurl(kFragmentsRemovedURL);
+  EXPECT_CALL(feature_, RemoveHighlights(_, fragments_removed_gurl));
   manager->OnClick();
 }
 
diff --git a/media/audio/audio_opus_encoder.cc b/media/audio/audio_opus_encoder.cc
index 817fcc57..22d1cff 100644
--- a/media/audio/audio_opus_encoder.cc
+++ b/media/audio/audio_opus_encoder.cc
@@ -279,9 +279,15 @@
       desc = PrepareExtraData();
       need_to_emit_extra_data_ = false;
     }
+
     auto ts = base::TimeTicks() + timestamp_tracker_->GetTimestamp();
-    EncodedAudioBuffer encoded_buffer(
-        converted_params_, std::move(encoded_data), encoded_data_size, ts);
+
+    auto duration = timestamp_tracker_->GetFrameDuration(
+        converted_params_.frames_per_buffer());
+
+    EncodedAudioBuffer encoded_buffer(converted_params_,
+                                      std::move(encoded_data),
+                                      encoded_data_size, ts, duration);
     output_cb_.Run(std::move(encoded_buffer), desc);
   }
   timestamp_tracker_->AddFrames(converted_params_.frames_per_buffer());
diff --git a/media/base/audio_encoder.cc b/media/base/audio_encoder.cc
index 8e0b81c..ad54b8f5 100644
--- a/media/base/audio_encoder.cc
+++ b/media/base/audio_encoder.cc
@@ -18,11 +18,13 @@
 EncodedAudioBuffer::EncodedAudioBuffer(const AudioParameters& params,
                                        std::unique_ptr<uint8_t[]> data,
                                        size_t size,
-                                       base::TimeTicks timestamp)
+                                       base::TimeTicks timestamp,
+                                       base::TimeDelta duration)
     : params(params),
       encoded_data(std::move(data)),
       encoded_data_size(size),
-      timestamp(timestamp) {}
+      timestamp(timestamp),
+      duration(duration) {}
 
 EncodedAudioBuffer::EncodedAudioBuffer(EncodedAudioBuffer&&) = default;
 
diff --git a/media/base/audio_encoder.h b/media/base/audio_encoder.h
index e7a47e7..1ee27aa 100644
--- a/media/base/audio_encoder.h
+++ b/media/base/audio_encoder.h
@@ -15,6 +15,7 @@
 #include "media/base/audio_parameters.h"
 #include "media/base/media_export.h"
 #include "media/base/status.h"
+#include "media/base/timestamp_constants.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace media {
@@ -24,7 +25,8 @@
   EncodedAudioBuffer(const AudioParameters& params,
                      std::unique_ptr<uint8_t[]> data,
                      size_t size,
-                     base::TimeTicks timestamp);
+                     base::TimeTicks timestamp,
+                     base::TimeDelta duration = media::kNoTimestamp);
   EncodedAudioBuffer(EncodedAudioBuffer&&);
   ~EncodedAudioBuffer();
 
@@ -46,6 +48,11 @@
   // The capture time of the first sample of the current AudioBus, or a previous
   // AudioBus If this output was generated because of a call to Flush().
   const base::TimeTicks timestamp;
+
+  // The duration of the encoded samples, if they were decoded and played out.
+  // A duration of media::kNoTimestamp means we don't know the duration or don't
+  // care about it.
+  const base::TimeDelta duration;
 };
 
 // Defines an interface for audio encoders.
diff --git a/media/gpu/chromeos/image_processor.cc b/media/gpu/chromeos/image_processor.cc
index b3408b24..6c40df02 100644
--- a/media/gpu/chromeos/image_processor.cc
+++ b/media/gpu/chromeos/image_processor.cc
@@ -39,6 +39,7 @@
     return false;
   }
 
+  // TODO(b/195351653): Add visible_rect check here.
   return true;
 }
 
diff --git a/media/gpu/chromeos/libyuv_image_processor_backend.cc b/media/gpu/chromeos/libyuv_image_processor_backend.cc
index 15cc6fc..1cec987 100644
--- a/media/gpu/chromeos/libyuv_image_processor_backend.cc
+++ b/media/gpu/chromeos/libyuv_image_processor_backend.cc
@@ -193,6 +193,31 @@
     return nullptr;
   }
 
+  if (relative_rotation != VIDEO_ROTATION_0) {
+    if (input_config.fourcc.ToVideoPixelFormat() != PIXEL_FORMAT_NV12 ||
+        output_config.fourcc.ToVideoPixelFormat() != PIXEL_FORMAT_NV12) {
+      VLOGF(2) << "Rotation is supported for NV12->NV12 only";
+      return nullptr;
+    }
+
+    const gfx::Size& input_size = input_config.visible_rect.size();
+    const gfx::Size& output_size = output_config.visible_rect.size();
+    bool size_mismatch = false;
+    if (relative_rotation == VIDEO_ROTATION_180) {
+      size_mismatch = input_size.width() != output_size.width() ||
+                      input_size.height() != output_size.height();
+    } else {  // For VIDEO_ROTATION_90 and 270.
+      size_mismatch = input_size.width() != output_size.height() ||
+                      input_size.height() != output_size.width();
+    }
+    if (size_mismatch) {
+      VLOGF(1) << "input and output resolution mismatch: "
+               << "input=" << input_size.ToString()
+               << ", output=" << output_size.ToString();
+      return nullptr;
+    }
+  }
+
   if (input_config.fourcc.ToVideoPixelFormat() ==
       output_config.fourcc.ToVideoPixelFormat()) {
     if (output_config.visible_rect.origin() != gfx::Point(0, 0)) {
@@ -349,8 +374,9 @@
         // Rotation mode.
         if (relative_rotation_ != VIDEO_ROTATION_0) {
           // The size of |tmp_buffer| of NV12Rotate() should be
-          // output_visible_rect().GetArea() / 2, which used to store temporary
-          // U and V planes for I420 data. Although
+          // 2 * ceil(|output_visible_rect_.width()| / 2) *
+          // ceil(|output_visible_rect_.height()| / 2), which used to store
+          // temporary U and V planes for I420 data. Although
           // |intermediate_frame_->data(0)| is much larger than the required
           // size, we use the frame to simplify the code.
           return NV12Rotate(
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.cc b/media/mojo/clients/win/media_foundation_renderer_client.cc
index 9a97981..dbd0e59 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client.cc
+++ b/media/mojo/clients/win/media_foundation_renderer_client.cc
@@ -10,33 +10,32 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "media/base/win/mf_helpers.h"
+#include "mojo/public/cpp/bindings/callback_helpers.h"
 
 namespace media {
 
 MediaFoundationRendererClient::MediaFoundationRendererClient(
-    mojo::PendingRemote<RendererExtension> renderer_extension_remote,
     scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
-    std::unique_ptr<media::MojoRenderer> mojo_renderer,
+    std::unique_ptr<MojoRenderer> mojo_renderer,
+    mojo::PendingRemote<RendererExtension> pending_renderer_extension,
     std::unique_ptr<DCOMPTextureWrapper> dcomp_texture_wrapper,
-    media::VideoRendererSink* sink)
-    : mojo_renderer_(std::move(mojo_renderer)),
+    VideoRendererSink* sink)
+    : media_task_runner_(std::move(media_task_runner)),
+      mojo_renderer_(std::move(mojo_renderer)),
+      pending_renderer_extension_(std::move(pending_renderer_extension)),
       dcomp_texture_wrapper_(std::move(dcomp_texture_wrapper)),
-      sink_(sink),
-      media_task_runner_(std::move(media_task_runner)),
-      compositor_task_runner_(std::move(compositor_task_runner)),
-      delayed_bind_renderer_extension_remote_(
-          std::move(renderer_extension_remote)) {
+      sink_(sink) {
   DVLOG_FUNC(1);
 }
 
 MediaFoundationRendererClient::~MediaFoundationRendererClient() {
   DVLOG_FUNC(1);
-  if (video_rendering_started_) {
-    sink_->Stop();
-  }
 }
 
+// TODO(xhwang): Reorder method definitions to match the header file.
+
+// Renderer implementation.
+
 void MediaFoundationRendererClient::Initialize(MediaResource* media_resource,
                                                RendererClient* client,
                                                PipelineStatusCallback init_cb) {
@@ -46,22 +45,21 @@
 
   // Consume and bind the delayed PendingRemote now that we
   // are on |media_task_runner_|.
-  renderer_extension_remote_.Bind(
-      std::move(delayed_bind_renderer_extension_remote_), media_task_runner_);
+  renderer_extension_.Bind(std::move(pending_renderer_extension_),
+                           media_task_runner_);
 
   // Handle unexpected mojo pipe disconnection such as "mf_cdm" utility process
   // crashed or killed in Browser task manager.
-  renderer_extension_remote_.set_disconnect_handler(
+  renderer_extension_.set_disconnect_handler(
       base::BindOnce(&MediaFoundationRendererClient::OnConnectionError,
                      base::Unretained(this)));
 
   client_ = client;
   init_cb_ = std::move(init_cb);
 
-  const std::vector<media::DemuxerStream*> media_streams =
-      media_resource->GetAllStreams();
-  for (const media::DemuxerStream* stream : media_streams) {
-    if (stream->type() == media::DemuxerStream::Type::VIDEO) {
+  auto media_streams = media_resource->GetAllStreams();
+  for (const DemuxerStream* stream : media_streams) {
+    if (stream->type() == DemuxerStream::Type::VIDEO) {
       has_video_ = true;
       break;
     }
@@ -77,6 +75,8 @@
 void MediaFoundationRendererClient::OnConnectionError() {
   DVLOG_FUNC(1);
   DCHECK(media_task_runner_->BelongsToCurrentThread());
+
+  OnError(PIPELINE_ERROR_DECODE);
 }
 
 void MediaFoundationRendererClient::OnRemoteRendererInitialized(
@@ -85,7 +85,7 @@
   DCHECK(media_task_runner_->BelongsToCurrentThread());
   DCHECK(!init_cb_.is_null());
 
-  if (status != media::PipelineStatus::PIPELINE_OK) {
+  if (status != PipelineStatus::PIPELINE_OK) {
     std::move(init_cb_).Run(status);
     return;
   }
@@ -105,17 +105,10 @@
   std::move(init_cb_).Run(status);
 }
 
+// TODO(xhwang): Rename this method to be consistent across the stack.
 void MediaFoundationRendererClient::OnDCOMPSurfaceHandleCreated(bool success) {
-  if (!media_task_runner_->BelongsToCurrentThread()) {
-    media_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &MediaFoundationRendererClient::OnDCOMPSurfaceHandleCreated,
-            weak_factory_.GetWeakPtr(), success));
-    return;
-  }
-
   DVLOG_FUNC(1);
+  DCHECK(media_task_runner_->BelongsToCurrentThread());
   DCHECK(has_video_);
 
   dcomp_texture_wrapper_->CreateVideoFrame(
@@ -123,7 +116,7 @@
                      weak_factory_.GetWeakPtr()));
 }
 
-void MediaFoundationRendererClient::OnReceivedRemoteDCOMPSurface(
+void MediaFoundationRendererClient::OnDCOMPSurfaceReceived(
     const absl::optional<base::UnguessableToken>& token) {
   DVLOG_FUNC(1);
   DCHECK(has_video_);
@@ -158,7 +151,7 @@
 }
 
 void MediaFoundationRendererClient::OnVideoFrameCreated(
-    scoped_refptr<media::VideoFrame> video_frame) {
+    scoped_refptr<VideoFrame> video_frame) {
   DVLOG_FUNC(1);
   DCHECK(media_task_runner_->BelongsToCurrentThread());
   DCHECK(has_video_);
@@ -166,60 +159,43 @@
   video_frame->metadata().protected_video = true;
   video_frame->metadata().allow_overlay = true;
 
-  dcomp_frame_ = video_frame;
-
-  sink_->PaintSingleFrame(dcomp_frame_, true);
+  dcomp_video_frame_ = video_frame;
+  sink_->PaintSingleFrame(dcomp_video_frame_, true);
 }
-
 void MediaFoundationRendererClient::OnCompositionParamsReceived(
     gfx::Rect output_rect) {
   DVLOG_FUNC(1) << "output_rect=" << output_rect.ToString();
   DCHECK(media_task_runner_->BelongsToCurrentThread());
   DCHECK(has_video_);
 
-  renderer_extension_remote_->SetOutputParams(output_rect);
-  return;
+  renderer_extension_->SetOutputParams(output_rect);
 }
 
-bool MediaFoundationRendererClient::MojoSetDCOMPMode(bool enabled) {
-  DVLOG_FUNC(1) << "enabled=" << enabled;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
-  DCHECK(renderer_extension_remote_.is_bound());
-
-  bool success = false;
-  if (!renderer_extension_remote_->SetDCOMPMode(enabled, &success)) {
-    return false;
-  }
-  return success;
-}
-
-void MediaFoundationRendererClient::MojoGetDCOMPSurface() {
-  DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
-  DCHECK(renderer_extension_remote_.is_bound());
-
-  renderer_extension_remote_->GetDCOMPSurface(base::BindOnce(
-      &MediaFoundationRendererClient::OnReceivedRemoteDCOMPSurface,
-      weak_factory_.GetWeakPtr()));
-}
-
-void MediaFoundationRendererClient::InitializeDCOMPRendering() {
+void MediaFoundationRendererClient::InitializeDCOMPRenderingIfNeeded() {
   DVLOG_FUNC(1);
   DCHECK(has_video_);
 
-  if (dcomp_rendering_initialized_) {
+  if (dcomp_rendering_initialized_)
     return;
-  }
-
-  if (!MojoSetDCOMPMode(true)) {
-    DLOG(ERROR) << "Failed to initialize DCOMP mode on remote renderer. this="
-                << this;
-    return;
-  }
-  MojoGetDCOMPSurface();
 
   dcomp_rendering_initialized_ = true;
-  return;
+
+  // Set DirectComposition mode in MediaFoundationRenderer.
+  bool success = false;
+  if (!renderer_extension_->SetDCOMPMode(/*enabled=*/true, &success) ||
+      !success) {
+    DLOG(ERROR) << "Failed to initialize DCOMP mode on remote renderer";
+    OnError(PIPELINE_ERROR_COULD_NOT_RENDER);
+    return;
+  }
+
+  // Get DirectComposition surface from MediaFoundationRenderer.
+  // TODO(xhwang): Merge SetDCOMPMode() and GetDCOMPSurface().
+  renderer_extension_->GetDCOMPSurface(
+      mojo::WrapCallbackWithDefaultInvokeIfNotRun(
+          base::BindOnce(&MediaFoundationRendererClient::OnDCOMPSurfaceReceived,
+                         weak_factory_.GetWeakPtr()),
+          absl::nullopt));
 }
 
 void MediaFoundationRendererClient::SetCdm(CdmContext* cdm_context,
@@ -228,7 +204,7 @@
   DCHECK(cdm_context);
 
   if (cdm_context_) {
-    DLOG(ERROR) << "Switching CDM not supported. this=" << this;
+    DLOG(ERROR) << "Switching CDM not supported";
     std::move(cdm_attached_cb).Run(false);
     return;
   }
@@ -273,14 +249,16 @@
 }
 
 void MediaFoundationRendererClient::OnSelectedVideoTracksChanged(
-    const std::vector<media::DemuxerStream*>& enabled_tracks,
+    const std::vector<DemuxerStream*>& enabled_tracks,
     base::OnceClosure change_completed_cb) {
   bool video_track_selected = (enabled_tracks.size() > 0);
   DVLOG_FUNC(1) << "video_track_selected=" << video_track_selected;
-  renderer_extension_remote_->SetVideoStreamEnabled(video_track_selected);
+  renderer_extension_->SetVideoStreamEnabled(video_track_selected);
   std::move(change_completed_cb).Run();
 }
 
+// RendererClient implementation.
+
 void MediaFoundationRendererClient::OnError(PipelineStatus status) {
   DVLOG_FUNC(1) << "status=" << status;
   client_->OnError(status);
@@ -291,13 +269,13 @@
 }
 
 void MediaFoundationRendererClient::OnStatisticsUpdate(
-    const media::PipelineStatistics& stats) {
+    const PipelineStatistics& stats) {
   client_->OnStatisticsUpdate(stats);
 }
 
 void MediaFoundationRendererClient::OnBufferingStateChange(
-    media::BufferingState state,
-    media::BufferingStateChangeReason reason) {
+    BufferingState state,
+    BufferingStateChangeReason reason) {
   client_->OnBufferingStateChange(state, reason);
 }
 
@@ -306,11 +284,11 @@
 }
 
 void MediaFoundationRendererClient::OnAudioConfigChange(
-    const media::AudioDecoderConfig& config) {
+    const AudioDecoderConfig& config) {
   client_->OnAudioConfigChange(config);
 }
 void MediaFoundationRendererClient::OnVideoConfigChange(
-    const media::VideoDecoderConfig& config) {
+    const VideoDecoderConfig& config) {
   client_->OnVideoConfigChange(config);
 }
 
@@ -326,10 +304,10 @@
   // initialized with size of 1x1.
   auto texture_size = natural_size_.IsEmpty() ? gfx::Size(1, 1) : natural_size_;
   dcomp_texture_wrapper_->UpdateTextureSize(texture_size);
-  InitializeDCOMPRendering();
+  InitializeDCOMPRenderingIfNeeded();
 
-  if (dcomp_frame_)
-    sink_->PaintSingleFrame(dcomp_frame_, true);
+  if (dcomp_video_frame_)
+    sink_->PaintSingleFrame(dcomp_video_frame_, true);
 
   client_->OnVideoNaturalSizeChange(natural_size_);
 }
@@ -347,22 +325,4 @@
   client_->OnVideoFrameRateChange(fps);
 }
 
-scoped_refptr<media::VideoFrame> MediaFoundationRendererClient::Render(
-    base::TimeTicks deadline_min,
-    base::TimeTicks deadline_max,
-    RenderingMode mode) {
-  // Returns no video frame as it is rendered independently by Windows Direct
-  // Composition.
-  return nullptr;
-}
-
-void MediaFoundationRendererClient::OnFrameDropped() {
-  return;
-}
-
-base::TimeDelta MediaFoundationRendererClient::GetPreferredRenderInterval() {
-  // TODO(frankli): use 'viz::BeginFrameArgs::MinInterval()'.
-  return base::TimeDelta::FromSeconds(0);
-}
-
 }  // namespace media
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.h b/media/mojo/clients/win/media_foundation_renderer_client.h
index b35fbe3..ff03f69 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client.h
+++ b/media/mojo/clients/win/media_foundation_renderer_client.h
@@ -22,39 +22,27 @@
 
 namespace media {
 
-// MediaFoundationRendererClient lives in Renderer process and mirrors a
-// MediaFoundationRenderer living in the MF_CDM LPAC Utility process.
+// MediaFoundationRendererClient lives in Renderer process talks to the
+// MediaFoundationRenderer living in the MediaFoundationService (utility)
+// process, using `mojo_renderer_` and `renderer_extension_`.
 //
-// It is responsible for forwarding media::Renderer calls from WMPI to the
-// MediaFoundationRenderer, using |mojo_renderer|. It also manages a
-// DCOMPTexture, (via |dcomp_texture_wrapper_|) and notifies the
-// VideoRendererSink when new frames are available.
-//
-// This class handles all calls on |media_task_runner_|, except for
-// OnFrameAvailable(), which is called on |compositor_task_runner_|.
-//
-// N.B: This class implements media::RendererClient, in order to intercept
-// OnVideoNaturalSizeChange() events, to update DCOMPTextureWrapper. All events
-// (including OnVideoNaturalSizeChange()) are bubbled up to |client_|.
-//
-class MediaFoundationRendererClient
-    : public media::Renderer,
-      public media::RendererClient,
-      public media::VideoRendererSink::RenderCallback {
+// It also manages a DCOMPTexture living in the GPU process via
+// `dcomp_texture_wrapper_` and notifies the VideoRendererSink when new frames
+// are available.
+class MediaFoundationRendererClient : public Renderer, public RendererClient {
  public:
-  using RendererExtension = media::mojom::MediaFoundationRendererExtension;
+  using RendererExtension = mojom::MediaFoundationRendererExtension;
 
   MediaFoundationRendererClient(
-      mojo::PendingRemote<RendererExtension> renderer_extension_remote,
       scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
-      std::unique_ptr<media::MojoRenderer> mojo_renderer,
+      std::unique_ptr<MojoRenderer> mojo_renderer,
+      mojo::PendingRemote<RendererExtension> pending_renderer_extension,
       std::unique_ptr<DCOMPTextureWrapper> dcomp_texture_wrapper,
-      media::VideoRendererSink* sink);
+      VideoRendererSink* sink);
 
   ~MediaFoundationRendererClient() override;
 
-  // media::Renderer implementation.
+  // Renderer implementation.
   void Initialize(MediaResource* media_resource,
                   RendererClient* client,
                   PipelineStatusCallback init_cb) override;
@@ -66,80 +54,57 @@
   void SetVolume(float volume) override;
   base::TimeDelta GetMediaTime() override;
   void OnSelectedVideoTracksChanged(
-      const std::vector<media::DemuxerStream*>& enabled_tracks,
+      const std::vector<DemuxerStream*>& enabled_tracks,
       base::OnceClosure change_completed_cb) override;
 
-  // media::RendererClient implementation.
+  // RendererClient implementation.
   void OnError(PipelineStatus status) override;
   void OnEnded() override;
-  void OnStatisticsUpdate(const media::PipelineStatistics& stats) override;
-  void OnBufferingStateChange(media::BufferingState state,
-                              media::BufferingStateChangeReason) override;
-  void OnWaiting(media::WaitingReason reason) override;
-  void OnAudioConfigChange(const media::AudioDecoderConfig& config) override;
-  void OnVideoConfigChange(const media::VideoDecoderConfig& config) override;
+  void OnStatisticsUpdate(const PipelineStatistics& stats) override;
+  void OnBufferingStateChange(BufferingState state,
+                              BufferingStateChangeReason) override;
+  void OnWaiting(WaitingReason reason) override;
+  void OnAudioConfigChange(const AudioDecoderConfig& config) override;
+  void OnVideoConfigChange(const VideoDecoderConfig& config) override;
   void OnVideoNaturalSizeChange(const gfx::Size& size) override;
   void OnVideoOpacityChange(bool opaque) override;
   void OnVideoFrameRateChange(absl::optional<int>) override;
 
-  // media::VideoRendererSink::RenderCallback implementation.
-  scoped_refptr<media::VideoFrame> Render(
-      base::TimeTicks deadline_min,
-      base::TimeTicks deadline_max,
-      RenderingMode rendering_mode) override;
-  void OnFrameDropped() override;
-  base::TimeDelta GetPreferredRenderInterval() override;
-
  private:
-  void OnConnectionError();
-  void OnRemoteRendererInitialized(media::PipelineStatus status);
-  void OnVideoFrameCreated(scoped_refptr<media::VideoFrame> video_frame);
+  void OnRemoteRendererInitialized(PipelineStatus status);
   void OnDCOMPTextureInitialized(bool success);
-  void OnDCOMPSurfaceHandleCreated(bool success);
-  void OnReceivedRemoteDCOMPSurface(
+  void InitializeDCOMPRenderingIfNeeded();
+  void OnDCOMPSurfaceReceived(
       const absl::optional<base::UnguessableToken>& token);
+  void OnDCOMPSurfaceHandleCreated(bool success);
+  void OnVideoFrameCreated(scoped_refptr<VideoFrame> video_frame);
   void OnCompositionParamsReceived(gfx::Rect output_rect);
 
-  void InitializeDCOMPRendering();
   void OnCdmAttached(bool success);
-  void InitializeMojoCdmTelemetryPtrServer();
-  void OnCDMTelemetryPtrConnectionError();
+  void OnConnectionError();
 
-  bool MojoSetDCOMPMode(bool enabled);
-  void MojoGetDCOMPSurface();
-
-  // Used to forward calls to the MediaFoundationRenderer living in the MF_CDM
-  // LPAC Utility process.
-  std::unique_ptr<media::MojoRenderer> mojo_renderer_;
-
+  // This class is constructed on the main thread and used exclusively on the
+  // media thread. Hence we store PendingRemotes so we can bind the Remotes
+  // on the media task runner during/after Initialize().
+  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  std::unique_ptr<MojoRenderer> mojo_renderer_;
+  mojo::PendingRemote<RendererExtension> pending_renderer_extension_;
   std::unique_ptr<DCOMPTextureWrapper> dcomp_texture_wrapper_;
+  VideoRendererSink* sink_;
+
+  mojo::Remote<RendererExtension> renderer_extension_;
 
   RendererClient* client_ = nullptr;
-
-  VideoRendererSink* sink_;
-  bool video_rendering_started_ = false;
   bool dcomp_rendering_initialized_ = false;
-  // video's native size.
-  gfx::Size natural_size_;
+  gfx::Size natural_size_;  // video's native size.
 
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
-  scoped_refptr<media::VideoFrame> dcomp_frame_;
   bool has_video_ = false;
+  scoped_refptr<VideoFrame> dcomp_video_frame_;
 
   PipelineStatusCallback init_cb_;
   CdmContext* cdm_context_ = nullptr;
   CdmAttachedCB cdm_attached_cb_;
 
-  // Used temporarily, to delay binding to |renderer_extension_remote_| until we
-  // are on the right sequence, when Initialize() is called.
-  mojo::PendingRemote<RendererExtension>
-      delayed_bind_renderer_extension_remote_;
-
-  // Used to call methods on the MediaFoundationRenderer in the MF_CMD LPAC
-  // Utility process.
-  mojo::Remote<RendererExtension> renderer_extension_remote_;
-
   // NOTE: Weak pointers must be invalidated before all other member variables.
   base::WeakPtrFactory<MediaFoundationRendererClient> weak_factory_{this};
 
diff --git a/media/mojo/clients/win/media_foundation_renderer_client_factory.cc b/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
index 355b20b5..1203658 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
+++ b/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
@@ -14,11 +14,9 @@
 namespace media {
 
 MediaFoundationRendererClientFactory::MediaFoundationRendererClientFactory(
-    scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     GetDCOMPTextureWrapperCB get_dcomp_texture_cb,
     std::unique_ptr<media::MojoRendererFactory> mojo_renderer_factory)
-    : compositor_task_runner_(std::move(compositor_task_runner)),
-      get_dcomp_texture_cb_(get_dcomp_texture_cb),
+    : get_dcomp_texture_cb_(std::move(get_dcomp_texture_cb)),
       mojo_renderer_factory_(std::move(mojo_renderer_factory)) {
   DVLOG_FUNC(1);
 }
@@ -55,9 +53,9 @@
 
   // mojo_renderer's ownership is passed to MediaFoundationRendererClient.
   return std::make_unique<MediaFoundationRendererClient>(
-      std::move(renderer_extension_remote), media_task_runner,
-      compositor_task_runner_, std::move(mojo_renderer),
-      std::move(dcomp_texture), video_renderer_sink);
+      media_task_runner, std::move(mojo_renderer),
+      std::move(renderer_extension_remote), std::move(dcomp_texture),
+      video_renderer_sink);
 }
 
 media::MediaResource::Type
diff --git a/media/mojo/clients/win/media_foundation_renderer_client_factory.h b/media/mojo/clients/win/media_foundation_renderer_client_factory.h
index 4ae025c..1ca6c79 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client_factory.h
+++ b/media/mojo/clients/win/media_foundation_renderer_client_factory.h
@@ -23,7 +23,6 @@
       base::RepeatingCallback<std::unique_ptr<DCOMPTextureWrapper>()>;
 
   MediaFoundationRendererClientFactory(
-      scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       GetDCOMPTextureWrapperCB get_dcomp_texture_cb,
       std::unique_ptr<media::MojoRendererFactory> mojo_renderer_factory);
   ~MediaFoundationRendererClientFactory() override;
@@ -40,7 +39,6 @@
   media::MediaResource::Type GetRequiredMediaResourceType() override;
 
  private:
-  scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
   GetDCOMPTextureWrapperCB get_dcomp_texture_cb_;
   std::unique_ptr<media::MojoRendererFactory> mojo_renderer_factory_;
 };
diff --git a/media/mojo/mojom/dcomp_surface_registry.mojom b/media/mojo/mojom/dcomp_surface_registry.mojom
index b1d561c7..6ddb20e 100644
--- a/media/mojo/mojom/dcomp_surface_registry.mojom
+++ b/media/mojo/mojom/dcomp_surface_registry.mojom
@@ -19,4 +19,10 @@
   // surface in GLImageDCOMPSurface. Null token will be returned upon failure.
   RegisterDCOMPSurfaceHandle(handle<platform> surface_handle)
       => (mojo_base.mojom.UnguessableToken? token);
+
+  // Unregisters the DCOMP surface handle associated with `token`. This is to
+  // avoid handle leak in case the handle is not taken during a playback, e.g.
+  // user closes tab immediately after playback start. No-op if the handle has
+  // already been taken.
+  UnregisterDCOMPSurfaceHandle(mojo_base.mojom.UnguessableToken token);
 };
diff --git a/media/mojo/services/media_foundation_renderer_wrapper.cc b/media/mojo/services/media_foundation_renderer_wrapper.cc
index 5470d33..165cb2b9 100644
--- a/media/mojo/services/media_foundation_renderer_wrapper.cc
+++ b/media/mojo/services/media_foundation_renderer_wrapper.cc
@@ -47,6 +47,8 @@
 
 MediaFoundationRendererWrapper::~MediaFoundationRendererWrapper() {
   DVLOG_FUNC(1);
+  if (!dcomp_surface_token_.is_empty())
+    dcomp_surface_registry_->UnregisterDCOMPSurfaceHandle(dcomp_surface_token_);
 }
 
 void MediaFoundationRendererWrapper::Initialize(
@@ -100,6 +102,12 @@
 
 void MediaFoundationRendererWrapper::GetDCOMPSurface(
     GetDCOMPSurfaceCallback callback) {
+  if (has_get_dcomp_surface_called_) {
+    mojo::ReportBadMessage("GetDCOMPSurface should only be called once!");
+    return;
+  }
+
+  has_get_dcomp_surface_called_ = true;
   renderer_->GetDCompSurface(
       base::BindOnce(&MediaFoundationRendererWrapper::OnReceiveDCOMPSurface,
                      weak_factory_.GetWeakPtr(), std::move(callback)));
@@ -150,6 +158,11 @@
 void MediaFoundationRendererWrapper::OnDCOMPSurfaceHandleRegistered(
     GetDCOMPSurfaceCallback callback,
     const absl::optional<base::UnguessableToken>& token) {
+  if (token) {
+    DCHECK(dcomp_surface_token_.is_empty());
+    dcomp_surface_token_ = token.value();
+  }
+
   std::move(callback).Run(token);
 }
 
diff --git a/media/mojo/services/media_foundation_renderer_wrapper.h b/media/mojo/services/media_foundation_renderer_wrapper.h
index e4aaadd..c0ebc31 100644
--- a/media/mojo/services/media_foundation_renderer_wrapper.h
+++ b/media/mojo/services/media_foundation_renderer_wrapper.h
@@ -72,10 +72,14 @@
   std::unique_ptr<MediaFoundationRenderer> renderer_;
   mojo::Receiver<MediaFoundationRendererExtension> renderer_extension_receiver_;
   mojo::Receiver<mojom::MuteStateObserver> site_mute_observer_;
-  mojo::Remote<mojom::DCOMPSurfaceRegistry> dcomp_surface_registry_;
+
   float volume_ = 1.0;
   bool muted_ = false;  // Whether the site (WebContents) is muted.
 
+  bool has_get_dcomp_surface_called_ = false;
+  mojo::Remote<mojom::DCOMPSurfaceRegistry> dcomp_surface_registry_;
+  base::UnguessableToken dcomp_surface_token_;
+
   base::WeakPtrFactory<MediaFoundationRendererWrapper> weak_factory_{this};
 };
 
diff --git a/net/BUILD.gn b/net/BUILD.gn
index f2b67ef..d5d72fbb 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -722,6 +722,7 @@
     "proxy_resolution/pac_file_data.h",
     "proxy_resolution/pac_file_decider.cc",
     "proxy_resolution/pac_file_decider.h",
+    "proxy_resolution/pac_file_fetcher.cc",
     "proxy_resolution/pac_file_fetcher.h",
     "proxy_resolution/pac_file_fetcher_impl.cc",
     "proxy_resolution/pac_file_fetcher_impl.h",
diff --git a/net/proxy_resolution/pac_file_decider.cc b/net/proxy_resolution/pac_file_decider.cc
index 73711b3..4a4bfbd 100644
--- a/net/proxy_resolution/pac_file_decider.cc
+++ b/net/proxy_resolution/pac_file_decider.cc
@@ -18,8 +18,8 @@
 #include "base/values.h"
 #include "net/base/completion_repeating_callback.h"
 #include "net/base/host_port_pair.h"
+#include "net/base/isolation_info.h"
 #include "net/base/net_errors.h"
-#include "net/base/network_isolation_key.h"
 #include "net/base/request_priority.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_event_type.h"
@@ -286,12 +286,10 @@
 
   HostResolver* host_resolver =
       pac_file_fetcher_->GetRequestContext()->host_resolver();
-  // It's safe to use an empty NetworkIsolationKey() here, since this is only
-  // for fetching the PAC script, so can't usefully leak data to web-initiated
-  // requests (Which can't use an empty NIK for resolving IPs other than that of
-  // the proxy).
   resolve_request_ = host_resolver->CreateRequest(
-      HostPortPair(host, 80), NetworkIsolationKey(), net_log_, parameters);
+      HostPortPair(host, 80),
+      pac_file_fetcher_->isolation_info().network_isolation_key(), net_log_,
+      parameters);
 
   CompletionRepeatingCallback callback = base::BindRepeating(
       &PacFileDecider::OnIOCompletion, base::Unretained(this));
diff --git a/net/proxy_resolution/pac_file_decider_unittest.cc b/net/proxy_resolution/pac_file_decider_unittest.cc
index 8f27311..621ebfa7 100644
--- a/net/proxy_resolution/pac_file_decider_unittest.cc
+++ b/net/proxy_resolution/pac_file_decider_unittest.cc
@@ -93,15 +93,6 @@
     return rules_[0];
   }
 
-  const Rule& GetRuleByText(const std::u16string& text) const {
-    for (auto it = rules_.begin(); it != rules_.end(); ++it) {
-      if (it->text() == text)
-        return *it;
-    }
-    LOG(FATAL) << "Rule not found for " << text;
-    return rules_[0];
-  }
-
  private:
   typedef std::vector<Rule> RuleList;
   RuleList rules_;
@@ -393,6 +384,14 @@
 
   EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
   ASSERT_TRUE(resolver_.has_pending_requests());
+
+  // The DNS lookup should be pending, and be using the same NetworkIsolationKey
+  // as the PacFileFetcher, so wpad fetches can reuse the DNS lookup result from
+  // the wpad quick check, if it succeeds.
+  ASSERT_EQ(1u, resolver_.last_id());
+  EXPECT_EQ(fetcher_.isolation_info().network_isolation_key(),
+            resolver_.request_network_isolation_key(1));
+
   resolver_.ResolveAllPending();
   callback_.WaitForResult();
   EXPECT_FALSE(resolver_.has_pending_requests());
@@ -410,6 +409,14 @@
       "wpad", HOST_RESOLVER_AVOID_MULTICAST);
   EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
   ASSERT_TRUE(resolver_.has_pending_requests());
+
+  // The DNS lookup should be pending, and be using the same NetworkIsolationKey
+  // as the PacFileFetcher, so wpad fetches can reuse the DNS lookup result from
+  // the wpad quick check, if it succeeds.
+  ASSERT_EQ(1u, resolver_.last_id());
+  EXPECT_EQ(fetcher_.isolation_info().network_isolation_key(),
+            resolver_.request_network_isolation_key(1));
+
   resolver_.ResolveAllPending();
   callback_.WaitForResult();
   EXPECT_FALSE(decider_->effective_config().value().has_pac_url());
diff --git a/net/proxy_resolution/pac_file_fetcher.cc b/net/proxy_resolution/pac_file_fetcher.cc
new file mode 100644
index 0000000..d21e48de
--- /dev/null
+++ b/net/proxy_resolution/pac_file_fetcher.cc
@@ -0,0 +1,12 @@
+// 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 "net/proxy_resolution/pac_file_fetcher.h"
+
+namespace net {
+
+PacFileFetcher::PacFileFetcher() = default;
+PacFileFetcher::~PacFileFetcher() = default;
+
+}  // namespace net
diff --git a/net/proxy_resolution/pac_file_fetcher.h b/net/proxy_resolution/pac_file_fetcher.h
index 6aa91aa..6faf8d7 100644
--- a/net/proxy_resolution/pac_file_fetcher.h
+++ b/net/proxy_resolution/pac_file_fetcher.h
@@ -12,6 +12,7 @@
 #include <string>
 
 #include "net/base/completion_once_callback.h"
+#include "net/base/isolation_info.h"
 #include "net/base/net_export.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
@@ -25,8 +26,12 @@
 // timeouts, maximum size constraints, content encoding, etc..
 class NET_EXPORT_PRIVATE PacFileFetcher {
  public:
+  PacFileFetcher();
+  PacFileFetcher(const PacFileFetcher&) = delete;
+  PacFileFetcher& operator=(const PacFileFetcher&) = delete;
+
   // Destruction should cancel any outstanding requests.
-  virtual ~PacFileFetcher() {}
+  virtual ~PacFileFetcher();
 
   // Downloads the given PAC URL, and invokes |callback| on completion.
   // Returns OK on success, otherwise the error code. If the return code is
@@ -63,6 +68,15 @@
   // called.  Must be called before the URLRequestContext the fetcher was
   // created with is torn down.
   virtual void OnShutdown() = 0;
+
+  const IsolationInfo& isolation_info() const { return isolation_info_; }
+
+ private:
+  // Transient IsolationInfo used to fetch PAC scripts and resolve hostnames.
+  // Safe to reuse because delays for WPAD fetches don't provide information
+  // to the web platform useful to attackers, and WPAD fetches uniformly
+  // block all network requests.
+  const IsolationInfo isolation_info_ = IsolationInfo::CreateTransient();
 };
 
 }  // namespace net
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.cc b/net/proxy_resolution/pac_file_fetcher_impl.cc
index 273800a..821a5fd1 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl.cc
@@ -175,7 +175,7 @@
   cur_request_ = url_request_context_->CreateRequest(url, MAXIMUM_PRIORITY,
                                                      this, traffic_annotation);
 
-  cur_request_->set_isolation_info(isolation_info_);
+  cur_request_->set_isolation_info(isolation_info());
 
   // Make sure that the PAC script is downloaded using a direct connection,
   // to avoid circular dependencies (fetching is a part of proxy resolution).
@@ -318,7 +318,6 @@
 
 PacFileFetcherImpl::PacFileFetcherImpl(URLRequestContext* url_request_context)
     : url_request_context_(url_request_context),
-      isolation_info_(IsolationInfo::CreateTransient()),
       buf_(base::MakeRefCounted<IOBuffer>(kBufSize)),
       next_id_(0),
       cur_request_id_(0),
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.h b/net/proxy_resolution/pac_file_fetcher_impl.h
index 1b306a1..f11c4af2 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.h
+++ b/net/proxy_resolution/pac_file_fetcher_impl.h
@@ -16,7 +16,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "net/base/completion_once_callback.h"
-#include "net/base/isolation_info.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/pac_file_fetcher.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -80,8 +79,6 @@
   void OnResponseStarted(URLRequest* request, int net_error) override;
   void OnReadCompleted(URLRequest* request, int num_bytes) override;
 
-  const IsolationInfo& isolation_info_for_testing() { return isolation_info_; }
-
  private:
   enum { kBufSize = 4096 };
 
@@ -112,9 +109,6 @@
   // OnShutdown.
   URLRequestContext* url_request_context_;
 
-  // Transient IsolationInfo used to fetch PAC scripts.
-  const IsolationInfo isolation_info_;
-
   // Buffer that URLRequest writes into.
   scoped_refptr<IOBuffer> buf_;
 
diff --git a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
index 0a90a81..72113d0 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
@@ -307,8 +307,7 @@
   params.source = net::HostResolverSource::LOCAL_ONLY;
   std::unique_ptr<net::HostResolver::ResolveHostRequest> host_request =
       context_.host_resolver()->CreateRequest(
-          kHostPortPair,
-          pac_fetcher->isolation_info_for_testing().network_isolation_key(),
+          kHostPortPair, pac_fetcher->isolation_info().network_isolation_key(),
           net::NetLogWithSource(), params);
   net::TestCompletionCallback callback2;
   result = host_request->Start(callback2.callback());
diff --git a/net/socket/connect_job_factory.cc b/net/socket/connect_job_factory.cc
index 5379c60..d7e231fd1c 100644
--- a/net/socket/connect_job_factory.cc
+++ b/net/socket/connect_job_factory.cc
@@ -162,13 +162,9 @@
   scoped_refptr<SOCKSSocketParams> socks_params;
 
   if (!proxy_server.is_direct()) {
-    // No need to use a NetworkIsolationKey for looking up the proxy's IP
-    // address. Cached proxy IP addresses doesn't really expose useful
-    // information to destination sites, and not caching them has a performance
-    // cost.
     auto proxy_tcp_params = base::MakeRefCounted<TransportSocketParams>(
-        proxy_server.host_port_pair(), NetworkIsolationKey(), secure_dns_policy,
-        resolution_callback);
+        proxy_server.host_port_pair(), proxy_dns_network_isolation_key_,
+        secure_dns_policy, resolution_callback);
 
     if (proxy_server.is_http_like()) {
       scoped_refptr<SSLSocketParams> ssl_params;
diff --git a/net/socket/connect_job_factory.h b/net/socket/connect_job_factory.h
index 523b9c2..98979a1 100644
--- a/net/socket/connect_job_factory.h
+++ b/net/socket/connect_job_factory.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "net/base/host_port_pair.h"
+#include "net/base/network_isolation_key.h"
 #include "net/base/privacy_mode.h"
 #include "net/base/request_priority.h"
 #include "net/dns/public/secure_dns_policy.h"
@@ -122,6 +123,13 @@
   std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory_;
   std::unique_ptr<WebSocketTransportConnectJob::Factory>
       websocket_transport_connect_job_factory_;
+
+  // Use a single NetworkIsolationKey for looking up proxy hostnames. Proxies
+  // are typically used across sites, but cached proxy IP addresses don't
+  // really expose useful information to destination sites, and not caching
+  // them has a performance cost.
+  net::NetworkIsolationKey proxy_dns_network_isolation_key_ =
+      net::NetworkIsolationKey::CreateTransient();
 };
 
 }  // namespace net
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index bab561b..62ab35e 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -1687,10 +1687,14 @@
             session_deps_.host_resolver->request_network_isolation_key(1));
 }
 
-// Test that, in the case of an HTTP proxy, the NetworkIsolationKey is not used.
+// Test that, in the case of an HTTP proxy, the same transient
+// NetworkIsolationKey is reused for resolving the proxy's host, regardless of
+// input NIK.
 TEST_F(TransportClientSocketPoolTest, NetworkIsolationKeyHttpProxy) {
-  const SchemefulSite kSite(GURL("https://foo.test/"));
-  const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
+  const SchemefulSite kSite1(GURL("https://foo.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
+  const SchemefulSite kSite2(GURL("https://bar.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
   const char kHost[] = "bar.test";
   const ProxyServer kProxyServer = ProxyServer::FromURI(
       "http://proxy.test", ProxyServer::SCHEME_HTTP /* default_scheme */);
@@ -1709,35 +1713,59 @@
       kMaxSockets, kMaxSocketsPerGroup, kUnusedIdleSocketTimeout, kProxyServer,
       false /* is_for_websockets */, tagging_common_connect_job_params_.get());
 
-  TransportClientSocketPool::GroupId group_id(
+  TransportClientSocketPool::GroupId group_id1(
       url::SchemeHostPort(url::kHttpScheme, kHost, 80),
-      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey,
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey1,
       SecureDnsPolicy::kAllow);
-  ClientSocketHandle handle;
-  TestCompletionCallback callback;
+  ClientSocketHandle handle1;
+  TestCompletionCallback callback1;
   EXPECT_THAT(
-      handle.Init(group_id,
-                  base::MakeRefCounted<ClientSocketPool::SocketParams>(
-                      nullptr /* ssl_config_for_origin */,
-                      nullptr /* ssl_config_for_proxy */),
-                  TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
-                  ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
-                  ClientSocketPool::ProxyAuthCallback(), &proxy_pool,
-                  NetLogWithSource()),
+      handle1.Init(group_id1,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
       IsError(ERR_IO_PENDING));
 
-  ASSERT_EQ(1u, session_deps_.host_resolver->last_id());
+  TransportClientSocketPool::GroupId group_id2(
+      url::SchemeHostPort(url::kHttpScheme, kHost, 80),
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey2,
+      SecureDnsPolicy::kAllow);
+  ClientSocketHandle handle2;
+  TestCompletionCallback callback2;
+  EXPECT_THAT(
+      handle2.Init(group_id2,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
+      IsError(ERR_IO_PENDING));
+
+  ASSERT_EQ(2u, session_deps_.host_resolver->last_id());
   EXPECT_EQ(kProxyServer.host_port_pair().host(),
             session_deps_.host_resolver->request_host(1));
-  EXPECT_EQ(NetworkIsolationKey(),
-            session_deps_.host_resolver->request_network_isolation_key(1));
+  EXPECT_EQ(kProxyServer.host_port_pair().host(),
+            session_deps_.host_resolver->request_host(2));
+  EXPECT_TRUE(session_deps_.host_resolver->request_network_isolation_key(1)
+                  .IsTransient());
+  EXPECT_EQ(session_deps_.host_resolver->request_network_isolation_key(1),
+            session_deps_.host_resolver->request_network_isolation_key(2));
 }
 
-// Test that, in the case of an HTTPS proxy, the NetworkIsolationKey is not
-// used.
+// Test that, in the case of an HTTPS proxy, the same transient
+// NetworkIsolationKey is reused for resolving the proxy's host, regardless of
+// input NIK.
 TEST_F(TransportClientSocketPoolTest, NetworkIsolationKeyHttpsProxy) {
-  const SchemefulSite kSite(GURL("https://foo.test/"));
-  const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
+  const SchemefulSite kSite1(GURL("https://foo.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
+  const SchemefulSite kSite2(GURL("https://bar.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
   const char kHost[] = "bar.test";
   const ProxyServer kProxyServer = ProxyServer::FromURI(
       "https://proxy.test", ProxyServer::SCHEME_HTTP /* default_scheme */);
@@ -1756,35 +1784,60 @@
       kMaxSockets, kMaxSocketsPerGroup, kUnusedIdleSocketTimeout, kProxyServer,
       false /* is_for_websockets */, tagging_common_connect_job_params_.get());
 
-  TransportClientSocketPool::GroupId group_id(
+  TransportClientSocketPool::GroupId group_id1(
       url::SchemeHostPort(url::kHttpScheme, kHost, 80),
-      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey,
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey1,
       SecureDnsPolicy::kAllow);
-  ClientSocketHandle handle;
-  TestCompletionCallback callback;
-  EXPECT_THAT(
-      handle.Init(group_id,
+  ClientSocketHandle handle1;
+  TestCompletionCallback callback1;
+  EXPECT_THAT(handle1.Init(
+                  group_id1,
                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
                       nullptr /* ssl_config_for_origin */,
                       std::make_unique<SSLConfig>() /* ssl_config_for_proxy */),
                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
-                  ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
-                  ClientSocketPool::ProxyAuthCallback(), &proxy_pool,
-                  NetLogWithSource()),
-      IsError(ERR_IO_PENDING));
+                  ClientSocketPool::RespectLimits::ENABLED,
+                  callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+                  &proxy_pool, NetLogWithSource()),
+              IsError(ERR_IO_PENDING));
 
-  ASSERT_EQ(1u, session_deps_.host_resolver->last_id());
+  TransportClientSocketPool::GroupId group_id2(
+      url::SchemeHostPort(url::kHttpScheme, kHost, 80),
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey2,
+      SecureDnsPolicy::kAllow);
+  ClientSocketHandle handle2;
+  TestCompletionCallback callback2;
+  EXPECT_THAT(handle2.Init(
+                  group_id2,
+                  base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                      nullptr /* ssl_config_for_origin */,
+                      std::make_unique<SSLConfig>() /* ssl_config_for_proxy */),
+                  TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                  ClientSocketPool::RespectLimits::ENABLED,
+                  callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
+                  &proxy_pool, NetLogWithSource()),
+              IsError(ERR_IO_PENDING));
+
+  ASSERT_EQ(2u, session_deps_.host_resolver->last_id());
   EXPECT_EQ(kProxyServer.host_port_pair().host(),
             session_deps_.host_resolver->request_host(1));
-  EXPECT_EQ(NetworkIsolationKey(),
-            session_deps_.host_resolver->request_network_isolation_key(1));
+  EXPECT_EQ(kProxyServer.host_port_pair().host(),
+            session_deps_.host_resolver->request_host(2));
+  EXPECT_TRUE(session_deps_.host_resolver->request_network_isolation_key(1)
+                  .IsTransient());
+  EXPECT_EQ(session_deps_.host_resolver->request_network_isolation_key(1),
+            session_deps_.host_resolver->request_network_isolation_key(2));
 }
 
-// Test that, in the case of a SOCKS5 proxy, the NetworkIsolationKey is only
-// used for the destination DNS lookup, not the proxy DNS lookup.
+// Test that, in the case of a SOCKS5 proxy, the passed in NetworkIsolationKey
+// is used for the destination DNS lookup, and the same transient
+// NetworkIsolationKey is reused for resolving the proxy's host, regardless of
+// input NIK.
 TEST_F(TransportClientSocketPoolTest, NetworkIsolationKeySocks4Proxy) {
-  const SchemefulSite kSite(GURL("https://foo.test/"));
-  const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
+  const SchemefulSite kSite1(GURL("https://foo.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
+  const SchemefulSite kSite2(GURL("https://bar.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
   const char kHost[] = "bar.test";
   const ProxyServer kProxyServer = ProxyServer::FromURI(
       "socks4://proxy.test", ProxyServer::SCHEME_HTTP /* default_scheme */);
@@ -1799,54 +1852,86 @@
 
   session_deps_.host_resolver->set_ondemand_mode(true);
 
-  // Test will establish a connection, but never use it to transfer data, since
-  // it stalls at the second DNS lookup.
-  StaticSocketDataProvider data;
-  data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
-  tagging_client_socket_factory_.AddSocketDataProvider(&data);
+  // Test will establish two connections, but never use them to transfer data,
+  // since thet stall on the followup DNS lookups.
+  StaticSocketDataProvider data1;
+  data1.set_connect_data(MockConnect(SYNCHRONOUS, OK));
+  tagging_client_socket_factory_.AddSocketDataProvider(&data1);
+  StaticSocketDataProvider data2;
+  data2.set_connect_data(MockConnect(SYNCHRONOUS, OK));
+  tagging_client_socket_factory_.AddSocketDataProvider(&data2);
 
   TransportClientSocketPool proxy_pool(
       kMaxSockets, kMaxSocketsPerGroup, kUnusedIdleSocketTimeout, kProxyServer,
       false /* is_for_websockets */, tagging_common_connect_job_params_.get());
 
-  TransportClientSocketPool::GroupId group_id(
+  TransportClientSocketPool::GroupId group_id1(
       url::SchemeHostPort(url::kHttpScheme, kHost, 80),
-      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey,
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey1,
       SecureDnsPolicy::kAllow);
-  ClientSocketHandle handle;
-  TestCompletionCallback callback;
+  ClientSocketHandle handle1;
+  TestCompletionCallback callback1;
   EXPECT_THAT(
-      handle.Init(group_id,
-                  base::MakeRefCounted<ClientSocketPool::SocketParams>(
-                      nullptr /* ssl_config_for_origin */,
-                      nullptr /* ssl_config_for_proxy */),
-                  TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
-                  ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
-                  ClientSocketPool::ProxyAuthCallback(), &proxy_pool,
-                  NetLogWithSource()),
+      handle1.Init(group_id1,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
       IsError(ERR_IO_PENDING));
 
-  // First lookup is for the proxy's hostname, and should not use the NIK.
-  ASSERT_EQ(1u, session_deps_.host_resolver->last_id());
+  TransportClientSocketPool::GroupId group_id2(
+      url::SchemeHostPort(url::kHttpScheme, kHost, 80),
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey2,
+      SecureDnsPolicy::kAllow);
+  ClientSocketHandle handle2;
+  TestCompletionCallback callback2;
+  EXPECT_THAT(
+      handle2.Init(group_id2,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
+      IsError(ERR_IO_PENDING));
+
+  // First two lookups are for the proxy's hostname, and should use the same
+  // transient NIK.
+  ASSERT_EQ(2u, session_deps_.host_resolver->last_id());
   EXPECT_EQ(kProxyServer.host_port_pair().host(),
             session_deps_.host_resolver->request_host(1));
-  EXPECT_EQ(NetworkIsolationKey(),
-            session_deps_.host_resolver->request_network_isolation_key(1));
-
-  // First lookup completes, starting the second one. The second lookup is for
-  // the destination's hostname, and should use the NIK.
-  session_deps_.host_resolver->ResolveOnlyRequestNow();
-  ASSERT_EQ(2u, session_deps_.host_resolver->last_id());
-  EXPECT_EQ(kHost, session_deps_.host_resolver->request_host(2));
-  EXPECT_EQ(kNetworkIsolationKey,
+  EXPECT_EQ(kProxyServer.host_port_pair().host(),
+            session_deps_.host_resolver->request_host(2));
+  EXPECT_TRUE(session_deps_.host_resolver->request_network_isolation_key(1)
+                  .IsTransient());
+  EXPECT_EQ(session_deps_.host_resolver->request_network_isolation_key(1),
             session_deps_.host_resolver->request_network_isolation_key(2));
+
+  // First two lookups completes, starting the next two, which should be for the
+  // destination's hostname, and should use the passed in NIKs.
+  session_deps_.host_resolver->ResolveNow(1);
+  session_deps_.host_resolver->ResolveNow(2);
+  ASSERT_EQ(4u, session_deps_.host_resolver->last_id());
+  EXPECT_EQ(kHost, session_deps_.host_resolver->request_host(3));
+  EXPECT_EQ(kNetworkIsolationKey1,
+            session_deps_.host_resolver->request_network_isolation_key(3));
+  EXPECT_EQ(kHost, session_deps_.host_resolver->request_host(4));
+  EXPECT_EQ(kNetworkIsolationKey2,
+            session_deps_.host_resolver->request_network_isolation_key(4));
 }
 
-// Test that, in the case of a SOCKS5 proxy, the NetworkIsolationKey is not
-// used.
+// Test that, in the case of a SOCKS5 proxy, the same transient
+// NetworkIsolationKey is reused for resolving the proxy's host, regardless of
+// input NIK.
 TEST_F(TransportClientSocketPoolTest, NetworkIsolationKeySocks5Proxy) {
-  const SchemefulSite kSite(GURL("https://foo.test/"));
-  const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
+  const SchemefulSite kSite1(GURL("https://foo.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
+  const SchemefulSite kSite2(GURL("https://bar.test/"));
+  const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
   const char kHost[] = "bar.test";
   const ProxyServer kProxyServer = ProxyServer::FromURI(
       "socks5://proxy.test", ProxyServer::SCHEME_HTTP /* default_scheme */);
@@ -1865,28 +1950,49 @@
       kMaxSockets, kMaxSocketsPerGroup, kUnusedIdleSocketTimeout, kProxyServer,
       false /* is_for_websockets */, tagging_common_connect_job_params_.get());
 
-  TransportClientSocketPool::GroupId group_id(
+  TransportClientSocketPool::GroupId group_id1(
       url::SchemeHostPort(url::kHttpScheme, kHost, 80),
-      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey,
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey1,
       SecureDnsPolicy::kAllow);
-  ClientSocketHandle handle;
-  TestCompletionCallback callback;
+  ClientSocketHandle handle1;
+  TestCompletionCallback callback1;
   EXPECT_THAT(
-      handle.Init(group_id,
-                  base::MakeRefCounted<ClientSocketPool::SocketParams>(
-                      nullptr /* ssl_config_for_origin */,
-                      nullptr /* ssl_config_for_proxy */),
-                  TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
-                  ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
-                  ClientSocketPool::ProxyAuthCallback(), &proxy_pool,
-                  NetLogWithSource()),
+      handle1.Init(group_id1,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
       IsError(ERR_IO_PENDING));
 
-  ASSERT_EQ(1u, session_deps_.host_resolver->last_id());
+  TransportClientSocketPool::GroupId group_id2(
+      url::SchemeHostPort(url::kHttpScheme, kHost, 80),
+      PrivacyMode::PRIVACY_MODE_DISABLED, kNetworkIsolationKey2,
+      SecureDnsPolicy::kAllow);
+  ClientSocketHandle handle2;
+  TestCompletionCallback callback2;
+  EXPECT_THAT(
+      handle2.Init(group_id2,
+                   base::MakeRefCounted<ClientSocketPool::SocketParams>(
+                       nullptr /* ssl_config_for_origin */,
+                       nullptr /* ssl_config_for_proxy */),
+                   TRAFFIC_ANNOTATION_FOR_TESTS, LOW, SocketTag(),
+                   ClientSocketPool::RespectLimits::ENABLED,
+                   callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
+                   &proxy_pool, NetLogWithSource()),
+      IsError(ERR_IO_PENDING));
+
+  ASSERT_EQ(2u, session_deps_.host_resolver->last_id());
   EXPECT_EQ(kProxyServer.host_port_pair().host(),
             session_deps_.host_resolver->request_host(1));
-  EXPECT_EQ(NetworkIsolationKey(),
-            session_deps_.host_resolver->request_network_isolation_key(1));
+  EXPECT_EQ(kProxyServer.host_port_pair().host(),
+            session_deps_.host_resolver->request_host(2));
+  EXPECT_TRUE(session_deps_.host_resolver->request_network_isolation_key(1)
+                  .IsTransient());
+  EXPECT_EQ(session_deps_.host_resolver->request_network_isolation_key(1),
+            session_deps_.host_resolver->request_network_isolation_key(2));
 }
 
 // Test that SocketTag passed into TransportClientSocketPool is applied to
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 7b4a3578..73d20c0 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -86,6 +86,7 @@
     "//remoting/host/linux:remoting_native_messaging_host",
     "//remoting/host/mac:remoting_native_messaging_host",
     "//remoting/host/mac:remoting_native_messaging_host_executable",
+    "//remoting/host/security_key:main",
     "//remoting/host/win:remoting_console",
     "//remoting/host/win:remoting_core",
     "//remoting/host/win:remoting_desktop",
@@ -98,7 +99,11 @@
 }
 
 source_set("common_headers") {
-  visibility = [ ":base" ]
+  visibility = [
+    ":base",
+    "//remoting/host/security_key:security_key",
+    "//remoting/host/security_key:test_support",
+  ]
   sources = [
     "action_executor.h",
     "audio_capturer.h",
diff --git a/remoting/host/security_key/BUILD.gn b/remoting/host/security_key/BUILD.gn
index 57adea1..99c97be 100644
--- a/remoting/host/security_key/BUILD.gn
+++ b/remoting/host/security_key/BUILD.gn
@@ -39,6 +39,7 @@
     "//mojo/public/cpp/system",
     "//net:net",
     "//net/traffic_annotation:traffic_annotation",
+    "//remoting/host:common_headers",
     "//remoting/host:host_extension",
     "//remoting/proto",
     "//remoting/protocol:protocol",
@@ -71,6 +72,7 @@
     "//mojo/core/embedder",
     "//remoting/host:base",
     "//remoting/host:common",
+    "//remoting/host:host_main_headers",
   ]
 }
 
@@ -82,6 +84,7 @@
         host_predefines + [ "REMOTING_HOST_BINARY=BINARY_REMOTE_SECURITY_KEY" ]
 
     deps = [
+      ":main",
       "//build/win:default_exe_manifest",
       "//remoting/host/win:remoting_core",
       "//remoting/host/win:remoting_windows_resources",
@@ -147,6 +150,7 @@
     ":security_key",
     "//ipc",
     "//remoting/host:common",
+    "//remoting/host:common_headers",
     "//remoting/proto",
     "//testing/gtest",
   ]
diff --git a/remoting/host/token_validator_base_unittest.cc b/remoting/host/token_validator_base_unittest.cc
index c82bbaf3..152749d 100644
--- a/remoting/host/token_validator_base_unittest.cc
+++ b/remoting/host/token_validator_base_unittest.cc
@@ -11,6 +11,7 @@
 #include "crypto/rsa_private_key.h"
 #include "net/cert/x509_util.h"
 #include "net/ssl/client_cert_identity_test_util.h"
+#include "net/ssl/ssl_private_key.h"
 #include "net/ssl/test_ssl_private_key.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/remoting/resources/remoting_strings_gl.xtb b/remoting/resources/remoting_strings_gl.xtb
index 873e7b5..424da93 100644
--- a/remoting/resources/remoting_strings_gl.xtb
+++ b/remoting/resources/remoting_strings_gl.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">As conexións co ordenador remoto bloqueáronse temporalmente debido a que alguén estaba tentando conectarse a el cun PIN non válido. Téntao de novo máis tarde.</translation>
 <translation id="6965382102122355670">Aceptar</translation>
 <translation id="6985691951107243942">Estás seguro de que queres desactivar as conexións remotas con <ph name="HOSTNAME" />? Se cambias de opinión, necesitarás acceder a ese ordenador para volver activar as conexións.</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> solicitou acceso para ver e controlar o teu ordenador. Se non coñeces esta persoa ou se precisas facer algún cambio antes de compartir o acceso con ela, preme <ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />.  En caso contrario, selecciona <ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" /> para permitir que se conecte.</translation>
 <translation id="7019153418965365059">Erro do host non recoñecido: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Asistencia remota</translation>
 <translation id="7026930240735156896">Sigue as instrucións e configura o ordenador para o acceso remoto</translation>
diff --git a/remoting/resources/remoting_strings_hy.xtb b/remoting/resources/remoting_strings_hy.xtb
index 2457e4db..943e3b02e 100644
--- a/remoting/resources/remoting_strings_hy.xtb
+++ b/remoting/resources/remoting_strings_hy.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">Հեռակա համակարգչի հետ կապակցումները ժամանակավորապես արգելափակված են, քանի որ ինչ-որ մեկը փորձել է կապակցվել սխալ PIN կոդով: Փորձեք ավելի ուշ:</translation>
 <translation id="6965382102122355670">Եղավ</translation>
 <translation id="6985691951107243942">Անջատե՞լ <ph name="HOSTNAME" />-ի հեռակա կապակցումները: Եթե մտափոխվեք, կապակցումը նորից միացնելու համար պետք է մտնեք այդ համակարգիչ:</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> օգտատերը ձեր համակարգչի տվյալները տեսնելու և կառավարելու թույլտվություն է խնդրել։ Եթե դուք չեք ճանաչում նրան կամ նախքան համակարգիչը հասանելի դարձնելը պետք է որոշ փոփոխություններ կատարեք, սեղմեք «<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />»։  Միացումը թույլատրելու համար սեղմեք «<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />»։</translation>
 <translation id="7019153418965365059">Հանգույցի անհայտ սխալ՝ <ph name="HOST_OFFLINE_REASON" />:</translation>
 <translation id="701976023053394610">Հեռակա աջակցում</translation>
 <translation id="7026930240735156896">Հետևեք ցուցումներին՝ ձեր համակարգիչը հեռակա մուտքի համար կարգավորելու համար</translation>
diff --git a/remoting/resources/remoting_strings_ka.xtb b/remoting/resources/remoting_strings_ka.xtb
index 48453aa..2cd267af 100644
--- a/remoting/resources/remoting_strings_ka.xtb
+++ b/remoting/resources/remoting_strings_ka.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">დისტანციურ კომპიუტერთან კავშირები დროებით დაბლოკილია, რადგან ვიღაც ცდილობდა დაკავშირებას არასწორი PIN-კოდით. გთხოვთ, ცადოთ მოგვიანებით.</translation>
 <translation id="6965382102122355670">კარგი</translation>
 <translation id="6985691951107243942">ნამდვილად გსურთ გამორთოთ დისტანციური კავშირები <ph name="HOSTNAME" />-თან? თუ გადაიფიქრებთ, უნდა შეხვიდეთ კომპიუტერის სისტემაში და ხელახლა ჩართოთ კავშირი.</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> ითხოვს წვდომას თქვენი კომპიუტერის სანახავად და სამართავად. თუ ამ პიროვნებას არ იცნობთ, ან გაზიარებამდე გარკვეული ცვლილებების შეტანა გსურთ, აირჩიეთ „<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />“.  სხვა შემთხვევაში არჩიეთ „<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />“ და დაუშვით დაკავშირება.</translation>
 <translation id="7019153418965365059">მასპინძლის ამოუცნობი შეცდომა: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">დისტანციური დახმარება</translation>
 <translation id="7026930240735156896">მიჰყევით ინსტრუქციას და დააყენეთ თქვენი კომპიუტერი დისტანციური წვდომისთვის</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb
index bdd3f1c..8d6aaf1 100644
--- a/remoting/resources/remoting_strings_lv.xtb
+++ b/remoting/resources/remoting_strings_lv.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">Savienojumi ar attālo datoru īslaicīgi ir bloķēti, jo kāda persona mēģināja izveidot savienojumu, izmantojot nederīgu PIN. Lūdzu, vēlāk mēģiniet vēlreiz.</translation>
 <translation id="6965382102122355670">Labi</translation>
 <translation id="6985691951107243942">Vai tiešām vēlaties atspējot attālos savienojumus ar saimniekdatoru <ph name="HOSTNAME" />? Ja pārdomāsiet, savienojumus ar šo datoru varēsiet iespējot tikai klātienē.</translation>
+<translation id="6998890551706945177">Lietotājs <ph name="CLIENT_USERNAME" /> ir pieprasījis piekļuvi, lai skatītu un pārvaldītu jūsu datoru. Nospiediet “<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />”, ja nezināt šo personu vai pirms kopīgošanas ir nepieciešams veikt izmaiņas.  Pretējā gadījumā atlasiet “<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />”, lai atļautu savienojumu.</translation>
 <translation id="7019153418965365059">Neatpazīta saimniekdatora kļūda: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Attālā palīdzība</translation>
 <translation id="7026930240735156896">Sekojiet norādījumiem, lai iestatītu datoru attālai piekļuvei</translation>
diff --git a/remoting/resources/remoting_strings_sq.xtb b/remoting/resources/remoting_strings_sq.xtb
index c16abc5..2b94e5b 100644
--- a/remoting/resources/remoting_strings_sq.xtb
+++ b/remoting/resources/remoting_strings_sq.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">Lidhjet me kompjuterin në largësi janë të bllokuara përkohësisht sepse dikush po përpiqej të lidhej me të nëpërmjet një kodi PIN të pavlefshëm. Provo përsëri më vonë.</translation>
 <translation id="6965382102122355670">Në rregull</translation>
 <translation id="6985691951107243942">Je i sigurt se dëshiron të çaktivizosh lidhjet në distancë me <ph name="HOSTNAME" />? Nëse ndryshon mendje, do të të duhet të shkosh te ai kompjuter dhe të riaktivizosh lidhjet.</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> ka kërkuar qasje për të parë dhe kontrolluar kompjuterin tënd. Shtyp ''<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />'' nëse nuk e njeh këtë person ose nëse duhet të bësh ndonjë ndryshim përpara shpërndarjes.  Përndryshe zgjidh ''<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />'' për të lejuar lidhjen.</translation>
 <translation id="7019153418965365059">Gabim i panjohur i strehuesit: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Ndihma në largësi</translation>
 <translation id="7026930240735156896">Ndiq udhëzimet për konfigurimin e kompjuterit për qasje në distancë</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb
index 48a7e12..9f56fac 100644
--- a/remoting/resources/remoting_strings_vi.xtb
+++ b/remoting/resources/remoting_strings_vi.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">Kết nối với máy tính từ xa tạm thời bị chặn vì ai đó đang cố gắng kết nối với máy tính đó bằng mã PIN không hợp lệ. Vui lòng thử lại sau.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Bạn có chắc chắn muốn tắt kết nối từ xa với <ph name="HOSTNAME" /> không? Nếu bạn thay đổi ý định, bạn cần truy cập vào máy tính đó để bật lại kết nối.</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> đã yêu cầu quyền truy cập để xem và điều khiển máy tính của bạn. Hãy nhấn ''<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />'' nếu bạn không biết người này hoặc nếu bạn cần thực hiện bất kỳ thay đổi nào trước khi chia sẻ.  Nếu không, hãy chọn ''<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />'' để cho phép kết nối.</translation>
 <translation id="7019153418965365059">Lỗi máy chủ không xác định: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Hỗ trợ từ xa</translation>
 <translation id="7026930240735156896">Hãy làm theo hướng dẫn thiết lập máy tính của bạn để truy cập từ xa</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb
index 98a3180..d3fee19 100644
--- a/remoting/resources/remoting_strings_zh-TW.xtb
+++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -130,6 +130,7 @@
 <translation id="6963936880795878952">有人嘗試使用無效的 PIN 連線至遠端電腦,因此您的連線暫時遭到封鎖。請稍後再試。</translation>
 <translation id="6965382102122355670">確定</translation>
 <translation id="6985691951107243942">你是否確定要停用與 <ph name="HOSTNAME" /> 之間的遠端連線?如果之後改變心意的話,你必須親身前往該電腦所在位置並修改設定後,才能重新啟用連線。</translation>
+<translation id="6998890551706945177"><ph name="CLIENT_USERNAME" /> 要求你授予電腦的瀏覽及控制權限。如果你不認識對方,或是需要在授予權限前進行變更,請按下 [<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />],否則請選取 [<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />] 允許連線。</translation>
 <translation id="7019153418965365059">不明主機錯誤:<ph name="HOST_OFFLINE_REASON" />。</translation>
 <translation id="701976023053394610">遠端協助</translation>
 <translation id="7026930240735156896">請按照操作說明設定電腦,以便執行遠端存取作業</translation>
diff --git a/services/viz/privileged/mojom/gl/gpu_service.mojom b/services/viz/privileged/mojom/gl/gpu_service.mojom
index bcf85cb..dd24181b 100644
--- a/services/viz/privileged/mojom/gl/gpu_service.mojom
+++ b/services/viz/privileged/mojom/gl/gpu_service.mojom
@@ -90,14 +90,21 @@
   CreateJpegEncodeAccelerator(
       pending_receiver<chromeos_camera.mojom.JpegEncodeAccelerator> jea);
 
-  // Registers a DirectComposition (DCOMP) surface handle and returns the
-  // corresponding token. Returns nullopt upon failure. See
-  // media/mojo/mojom/dcomp_surface_registry.mojom for details on why this is
-  // needed and how the returned token is used.
+  // Registers a DCOMP surface handle and returns a token. The token will then
+  // be used by MediaFoundationRendererClient to call DCOMPTexture to set the
+  // surface in GLImageDCOMPSurface. Null token will be returned upon failure.
+  // Also see media/mojo/mojom/dcomp_surface_registry.mojom.
   [EnableIf=is_win]
   RegisterDCOMPSurfaceHandle(handle<platform> surface_handle)
       => (mojo_base.mojom.UnguessableToken? token);
 
+  // Unregisters the DCOMP surface handle associated with `token`. This is to
+  // avoid handle leak in case the handle is not taken during a playback, e.g.
+  // user closes tab immediately after playback start. No-op if the handle has
+  // already been taken. Also see media/mojo/mojom/dcomp_surface_registry.mojom.
+  [EnableIf=is_win]
+  UnregisterDCOMPSurfaceHandle(mojo_base.mojom.UnguessableToken token);
+
   // Creates a VideoEncodeAcceleratorProvider and binds it to |vea_provider|.
   CreateVideoEncodeAcceleratorProvider(
       pending_receiver<media.mojom.VideoEncodeAcceleratorProvider>
diff --git a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
index 632bc6a43..988daa1e 100644
--- a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
+++ b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
@@ -30,7 +30,7 @@
 using GetFileInfoCallback =
     base::OnceCallback<void(base::File::Error, const base::File::Info&)>;
 
-FileErrorOr<base::File::Info> DoGetFileInfo(
+base::FileErrorOr<base::File::Info> DoGetFileInfo(
     const base::FilePath& path,
     scoped_refptr<FilesystemProxyFileStreamReader::SharedFilesystemProxy>
         shared_filesystem_proxy) {
@@ -47,7 +47,7 @@
   return std::move(*info);
 }
 
-FileErrorOr<base::File> DoOpenFile(
+base::FileErrorOr<base::File> DoOpenFile(
     const base::FilePath& path,
     scoped_refptr<FilesystemProxyFileStreamReader::SharedFilesystemProxy>
         shared_filesystem_proxy) {
@@ -158,7 +158,7 @@
 }
 
 void FilesystemProxyFileStreamReader::DidOpenFile(
-    FileErrorOr<base::File> open_result) {
+    base::FileErrorOr<base::File> open_result) {
   if (open_result.is_error()) {
     std::move(callback_).Run(open_result.error());
     return;
@@ -212,7 +212,7 @@
 
 void FilesystemProxyFileStreamReader::DidGetFileInfoForGetLength(
     net::Int64CompletionOnceCallback callback,
-    FileErrorOr<base::File::Info> result) {
+    base::FileErrorOr<base::File::Info> result) {
   // TODO(enne): track rate of missing blobs for http://crbug.com/1131151
   if (emit_metrics_) {
     bool file_was_found = !result.is_error() ||
diff --git a/storage/browser/file_system/filesystem_proxy_file_stream_reader.h b/storage/browser/file_system/filesystem_proxy_file_stream_reader.h
index 10222e0d..440909b 100644
--- a/storage/browser/file_system/filesystem_proxy_file_stream_reader.h
+++ b/storage/browser/file_system/filesystem_proxy_file_stream_reader.h
@@ -60,7 +60,7 @@
   // Callbacks that are chained from Open for Read.
   void DidVerifyForOpen(net::CompletionOnceCallback callback,
                         int64_t get_length_result);
-  void DidOpenFile(FileErrorOr<base::File> result);
+  void DidOpenFile(base::FileErrorOr<base::File> result);
 
   void DidSeekFileStream(int64_t seek_result);
   void DidOpenForRead(net::IOBuffer* buf,
@@ -70,7 +70,7 @@
   void OnRead(int read_result);
 
   void DidGetFileInfoForGetLength(net::Int64CompletionOnceCallback callback,
-                                  FileErrorOr<base::File::Info> result);
+                                  base::FileErrorOr<base::File::Info> result);
 
   net::CompletionOnceCallback callback_;
   scoped_refptr<base::TaskRunner> task_runner_;
diff --git a/storage/browser/file_system/local_file_stream_reader.cc b/storage/browser/file_system/local_file_stream_reader.cc
index 89db58c..8ede6af 100644
--- a/storage/browser/file_system/local_file_stream_reader.cc
+++ b/storage/browser/file_system/local_file_stream_reader.cc
@@ -27,7 +27,7 @@
 const int kOpenFlagsForRead =
     base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC;
 
-FileErrorOr<base::File::Info> DoGetFileInfo(const base::FilePath& path) {
+base::FileErrorOr<base::File::Info> DoGetFileInfo(const base::FilePath& path) {
   if (!base::PathExists(path))
     return base::File::FILE_ERROR_NOT_FOUND;
 
@@ -167,7 +167,7 @@
 
 void LocalFileStreamReader::DidGetFileInfoForGetLength(
     net::Int64CompletionOnceCallback callback,
-    FileErrorOr<base::File::Info> result) {
+    base::FileErrorOr<base::File::Info> result) {
   if (result.is_error()) {
     std::move(callback).Run(net::FileErrorToNetError(result.error()));
     return;
diff --git a/storage/browser/file_system/local_file_stream_reader.h b/storage/browser/file_system/local_file_stream_reader.h
index e9f5866f..62e85305 100644
--- a/storage/browser/file_system/local_file_stream_reader.h
+++ b/storage/browser/file_system/local_file_stream_reader.h
@@ -63,7 +63,7 @@
   void OnRead(int read_result);
 
   void DidGetFileInfoForGetLength(net::Int64CompletionOnceCallback callback,
-                                  FileErrorOr<base::File::Info> result);
+                                  base::FileErrorOr<base::File::Info> result);
 
   net::CompletionOnceCallback callback_;
   scoped_refptr<base::TaskRunner> task_runner_;
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 23f1e2a..1c5ab77 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -5687,7 +5687,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -5948,7 +5948,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 96385346..bb0fb27 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -36784,6 +36784,77 @@
     "gtest_tests": [
       {
         "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
           "--test-launcher-batch-limit=1",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
@@ -36864,6 +36935,76 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
+            "android_webview_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
             "webkit_unit_tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -36929,6 +37070,76 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "breakpad_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "breakpad_unittests",
+        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.cc_unittests.filter"
         ],
@@ -37365,6 +37576,79 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.content_shell_test_apk.filter"
+        ],
+        "ci_only": true,
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_shell_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
         ],
         "merge": {
@@ -37573,6 +37857,219 @@
       },
       {
         "args": [
+          "--use-cmd-decoder=validating",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.gl_tests.filter"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_tests_validating"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "mojo_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
@@ -37653,6 +38150,76 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
+            "ui_android_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
             "unit_tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -37783,6 +38350,78 @@
         },
         "test": "viz_unittests",
         "test_id_prefix": "ninja://components/viz:viz_unittests/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
+        ],
+        "ci_only": true,
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_instrumentation_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android23",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_23_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android23"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 9
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
       }
     ],
     "isolated_scripts": [
@@ -37916,146 +38555,6 @@
       },
       {
         "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_webview_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_webview_unittests",
-        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
-      },
-      {
-        "args": [
           "angle_unittests",
           "-v",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
@@ -38602,76 +39101,6 @@
       },
       {
         "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "breakpad_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "breakpad_unittests",
-        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
-      },
-      {
-        "args": [
           "--gtest_filter=-*UsingRealWebcam*",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
@@ -39028,78 +39457,6 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.content_shell_test_apk.filter"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_shell_test_apk",
-        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
         ],
         "merge": {
@@ -39519,149 +39876,6 @@
       },
       {
         "args": [
-          "--use-cmd-decoder=validating",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.gl_tests.filter"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_tests_validating"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_tests_validating",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
@@ -40372,76 +40586,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "mojo_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_test_apk",
-        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "mojo_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -40934,76 +41078,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "ui_android_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_android_unittests",
-        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "ui_base_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -41424,77 +41498,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "webview_instrumentation_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "machine_type": "n1-standard-4|e2-standard-4",
-              "os": "Ubuntu-16.04|Ubuntu-18.04",
-              "pool": "chromium.tests.avd"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "avd_generic_android23"
-              }
-            ]
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 7
-        },
-        "test": "webview_instrumentation_test_apk",
-        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "wtf_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -55854,7 +55857,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -56118,7 +56121,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -56455,7 +56458,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -56716,7 +56719,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -57052,7 +57055,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -57313,7 +57316,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.144"
+              "revision": "version:92.0.4515.145"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 4ecf055..0f39a99 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -4938,220 +4938,6 @@
       "all"
     ]
   },
-  "linux-lacros-rel": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "gtest_tests": [
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.browser_tests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chromeos_unittests",
-        "test_id_prefix": "ninja://chromeos:chromeos_unittests/"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.components_unittests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-BluetoothShellApiTest.ApiSanityCheck:BluetoothSocketApiTest.Listen:BluetoothSocketApiTest.PermissionDenied"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_browsertests",
-        "test_id_prefix": "ninja://extensions:extensions_browsertests/"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.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-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests_run_in_series",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_unittests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_unittests/"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.sync_integration_tests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.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-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.unit_tests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      }
-    ]
-  },
   "linux-lacros-tester-rel": {
     "additional_compile_targets": [
       "chrome",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index a229f9c..8b34c64 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -94939,7 +94939,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index 4e23dcd..83bd865e 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -485,7 +485,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -508,7 +508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -529,7 +529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -554,7 +554,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -575,7 +575,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -593,7 +593,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -614,7 +614,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 03ff06bf..8f6df08 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -23,7 +23,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 84e4a40..5a4174fe 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1828,7 +1828,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-18363"
+              "os": "Windows-10-19042"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/filters/README.md b/testing/buildbot/filters/README.md
index 436e371..7695f75 100644
--- a/testing/buildbot/filters/README.md
+++ b/testing/buildbot/filters/README.md
@@ -71,16 +71,23 @@
 
 ### Multiple filter files
 
-We are in the process of unifying behavior across all test runners, but the
-current status is Work in Progress.
+We are in the process of unifying the way multiple filter files are passed
+across all test runners.
 
-#### Gtest and Android
+Though our standard for passing multiple filter files is to pass each one in its
+own flag, we still support ';' for passing multiple filter files on Android for
+legacy reasons and haven't implemented multiple filter flags in Gtest. Gtest's
+current problematic behavior leads to users passing 2 flags, but only the latter
+being respected.
+
+
+#### Gtest
 
 Multiple filter files should be separated by a ';', passed with one flag.
 
-#### Web tests
+#### Web tests and Android
 
-Multiple filter files should be passed with multiple flags.
+Multiple filter files should be passed with multiple filter flags.
 
 
 ## Applicability
@@ -108,4 +115,4 @@
     to the desired test suite(s) in `test_suites.pyl`.
 -   Run `testing/buildbot/generate_buildbot_json.py` to update .json files.
 
-[gtest_filter]: https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#running-a-subset-of-the-tests
+[gtest_filter]: https://github.com/google/googletest/blob/master/docs/advanced.md#running-a-subset-of-the-tests
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index b8dc587..7b8bfc00 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -1533,8 +1533,6 @@
         'Optional Mac Retina Release (NVIDIA)',
         'Optional Win10 x64 Release (Intel HD 630)',
         'Optional Win10 x64 Release (NVIDIA)',
-        # chromium.chromiumos
-        'linux-lacros-rel',
         # chromium.fyi
         'linux-blink-rel-dummy',
         'linux-blink-optional-highdpi-rel-dummy',
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 414adbe..e40e78ae 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -34,6 +34,11 @@
           'shards': 2,
         },
       },
+      'android-marshmallow-x86-rel': {
+        'swarming': {
+          'shards': 2,
+        },
+      },
       'android-pie-arm64-rel': {
         'args': [
           '--gtest_filter=-ImportantSitesUtilBrowserTest.DSENotConsideredImportantInRegularMode', # https://crbug.com/1034001
@@ -64,8 +69,6 @@
       # Remove from CQ bots due to capacity.
       'android-marshmallow-arm64-rel',
       'android-lollipop-arm-rel',
-
-      'android-marshmallow-x86-rel-non-cq', # runs on MM-x86-rel already
    ],
   },
   'android_webview_unittests': {
@@ -718,11 +721,6 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.browser_tests.filter',
         ],
       },
-      'linux-lacros-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.browser_tests.filter',
-        ],
-      },
       'linux-lacros-tester-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.browser_tests.filter',
@@ -1168,12 +1166,6 @@
         ],
       },
       # https://crbug.com/1111979,
-      'linux-lacros-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.components_unittests.filter',
-        ],
-      },
-      # https://crbug.com/1111979,
       'linux-lacros-tester-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.components_unittests.filter',
@@ -1399,10 +1391,12 @@
           '--timeout-scale=2.0',
         ],
       },
-      'android-marshmallow-x86-rel-non-cq': {
+      'android-marshmallow-x86-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.content_shell_test_apk.filter',
         ],
+        #TODO(crbug.com/1127110): Enable this on CQ
+        'ci_only': True,
       },
       'android-pie-x86-rel': {
         'args': [
@@ -1522,11 +1516,6 @@
           '--gtest_filter=-BluetoothShellApiTest.ApiSanityCheck:BluetoothSocketApiTest.Listen:BluetoothSocketApiTest.PermissionDenied',
         ],
       },
-      'linux-lacros-rel': {
-        'args': [
-          '--gtest_filter=-BluetoothShellApiTest.ApiSanityCheck:BluetoothSocketApiTest.Listen:BluetoothSocketApiTest.PermissionDenied',
-        ],
-      },
       'linux-lacros-tester-rel': {
         'args': [
           '--gtest_filter=-BluetoothShellApiTest.ApiSanityCheck:BluetoothSocketApiTest.Listen:BluetoothSocketApiTest.PermissionDenied',
@@ -1642,7 +1631,7 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_11.gl_tests.filter',
         ],
       },
-      'android-marshmallow-x86-rel-non-cq': {
+      'android-marshmallow-x86-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.gl_tests.filter',
         ],
@@ -1829,12 +1818,6 @@
         ],
       },
       # https://crbug.com/1111979
-      'linux-lacros-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter',
-        ],
-      },
-      # https://crbug.com/1111979
       'linux-lacros-tester-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter',
@@ -2664,11 +2647,6 @@
            '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.sync_integration_tests.filter',
         ]
       },
-      'linux-lacros-rel': {
-        'args': [
-           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.sync_integration_tests.filter',
-        ]
-      },
       'linux-lacros-tester-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.sync_integration_tests.filter',
@@ -2844,7 +2822,6 @@
       # There's no need to run unit_tests on both lollipop and marshmallow
       # on the CQ. https://crbug.com/1026487.
       'android-marshmallow-arm64-rel',
-      'android-marshmallow-x86-rel-non-cq', # runs on MM-x86-rel already
       'android-pie-arm64-rel',  # https://crbug.com/1010211
     ],
     'modifications': {
@@ -2911,12 +2888,6 @@
         ],
       },
       # https://crbug.com/1111979,
-      'linux-lacros-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.unit_tests.filter',
-        ],
-      },
-      # https://crbug.com/1111979,
       'linux-lacros-tester-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.unit_tests.filter',
@@ -3322,6 +3293,13 @@
           '--gtest_filter=-org.chromium.net.NetworkChangeNotifierTest.testNetworkChangeNotifierJavaObservers',
         ],
       },
+      'android-marshmallow-x86-rel': {
+        #TODO(crbug.com/1127110): Enable this on CQ
+        'ci_only': True,
+        'swarming': {
+          'shards': 9,
+        },
+      },
       'android-pie-arm64-rel': {
         'swarming': {
           'shards': 9,
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index c188944..04bcdf2 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -153,13 +153,6 @@
     # MM emulator CQ builder currently has limited capacity so some composition
     # test suites cannot be fullly enabled at once.
     'android_marshmallow_emulator_limited_capacity_gtests': {
-      # Tests from android_specific_chromium_gtests
-      'android_sync_integration_tests': {
-        'args': [
-          '--test-launcher-batch-limit=1',
-        ],
-      },
-
       # Tests from chromium_gtests
       'webkit_unit_tests':{
         'test': 'blink_unittests',
@@ -4338,28 +4331,6 @@
       'lacros_chrome_browsertests_run_in_series': { },
     },
 
-    'linux_lacros_cq_gtests': {
-      'browser_tests': {
-        'swarming': {
-          'shards': 10,
-        },
-      },
-      'chromeos_unittests': {},
-      'components_unittests': {},
-      'extensions_browsertests': {},
-      'interactive_ui_tests': {
-        'swarming': {
-          'shards': 3,
-        },
-      },
-      'lacros_chrome_browsertests': {},
-      'lacros_chrome_browsertests_run_in_series': {},
-      'lacros_chrome_unittests': {},
-      'sync_integration_tests': {},
-      'ui_base_unittests': {},
-      'unit_tests': {},
-    },
-
     'linux_lacros_specific_gtests': {
       'lacros_chrome_browsertests': {},
       'lacros_chrome_browsertests_run_in_series': {},
@@ -5725,7 +5696,7 @@
 
       'android_modern_smoke_tests',
       'android_smoke_tests',
-      #'android_specific_chromium_gtests',  # Already includes gl_gtests.
+      'android_specific_chromium_gtests',  # Already includes gl_gtests.
       'android_wpr_record_replay_tests',
       #'chromium_gtests',
       'chromium_gtests_for_devices_with_graphical_output',
@@ -5742,7 +5713,6 @@
     # android_marshmallow_emulator_gtests)
     # is android_wpr_record_replay_tests
     'android_marshmallow_emulator_non_cq_gtests': [
-      'android_specific_chromium_gtests',  # Already includes gl_gtests.
       'chromium_gtests',
       'weblayer_android_gtests',
       'weblayer_gtests',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 08eb142..84699dcf 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -373,7 +373,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.144',
+          'revision': 'version:92.0.4515.145',
         }
       ],
     },
@@ -445,7 +445,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.144',
+          'revision': 'version:92.0.4515.145',
         }
       ],
     },
@@ -517,7 +517,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.144',
+          'revision': 'version:92.0.4515.145',
         }
       ],
     },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index d6ea746..cd5693e 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1500,17 +1500,6 @@
           'all',
         ],
       },
-      'linux-lacros-rel': {
-        'mixins': [
-          'linux-bionic',
-        ],
-        'additional_compile_targets': [
-          'all',
-        ],
-        'test_suites': {
-          'gtest_tests': 'linux_lacros_cq_gtests',
-        },
-      },
       'linux-lacros-tester-rel': {
         'mixins': [
           'linux-bionic',
@@ -3491,7 +3480,7 @@
       },
       'win-pixel-tester-rel': {
         'mixins': [
-            'win10',
+            'win10-20h2',
         ],
         'test_suites': {
           'gtest_tests': 'pixel_browser_tests_gtests',
@@ -6063,7 +6052,7 @@
       'WebRTC Chromium FYI Win10 Tester': {
         'mixins': [
           'x86-64',
-          'win10',
+          'win10-20h2',
         ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_gtests',
@@ -6095,7 +6084,7 @@
     'machines': {
       'WebKit Win10': {
         'mixins': [
-            'win10',
+            'win10-20h2',
         ],
         'test_suites': {
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
@@ -6367,7 +6356,7 @@
       },
       'V8 Blink Win': {
         'mixins': [
-          'win10',
+          'win10-20h2',
         ],
         'additional_compile_targets': ['blink_tests'],
         'test_suites': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 3ed8673..47783da5 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -954,62 +954,20 @@
             ],
             "experiments": [
                 {
-                    "name": "AutofillFixFillableFieldTypes_2021-05-01",
-                    "enable_features": [
-                        "AutofillFixFillableFieldTypes"
-                    ],
-                    "disable_features": [
-                        "AutofillEnableDependentLocalityParsing",
-                        "AutofillEnableImportWhenMultiplePhoneNumbers",
-                        "AutofillSectionUponRedundantNameInfo",
-                        "AutofillUseAlternativeStateNameMap"
-                    ]
-                },
-                {
-                    "name": "EnableAutofillSectionUponRedundantNameInfo_2021-05-01",
-                    "enable_features": [
-                        "AutofillSectionUponRedundantNameInfo"
-                    ],
-                    "disable_features": [
-                        "AutofillEnableDependentLocalityParsing",
-                        "AutofillEnableImportWhenMultiplePhoneNumbers",
-                        "AutofillFixFillableFieldTypes",
-                        "AutofillUseAlternativeStateNameMap"
-                    ]
-                },
-                {
-                    "name": "AutofillUseAlternativeStateNameMap_2021-05-01",
+                    "name": "AutofillUseAlternativeStateNameMap",
                     "enable_features": [
                         "AutofillUseAlternativeStateNameMap"
                     ],
                     "disable_features": [
-                        "AutofillEnableDependentLocalityParsing",
-                        "AutofillEnableImportWhenMultiplePhoneNumbers",
-                        "AutofillFixFillableFieldTypes",
-                        "AutofillSectionUponRedundantNameInfo"
+                        "AutofillEnableImportWhenMultiplePhoneNumbers"
                     ]
                 },
                 {
-                    "name": "AutofillEnableImportWhenMultiplePhoneNumbers_2021-05-01",
+                    "name": "AutofillEnableImportWhenMultiplePhoneNumbers",
                     "enable_features": [
                         "AutofillEnableImportWhenMultiplePhoneNumbers"
                     ],
                     "disable_features": [
-                        "AutofillEnableDependentLocalityParsing",
-                        "AutofillFixFillableFieldTypes",
-                        "AutofillSectionUponRedundantNameInfo",
-                        "AutofillUseAlternativeStateNameMap"
-                    ]
-                },
-                {
-                    "name": "AutofillEnableDependentLocalityParsing_2021-05-01",
-                    "enable_features": [
-                        "AutofillEnableDependentLocalityParsing"
-                    ],
-                    "disable_features": [
-                        "AutofillEnableImportWhenMultiplePhoneNumbers",
-                        "AutofillFixFillableFieldTypes",
-                        "AutofillSectionUponRedundantNameInfo",
                         "AutofillUseAlternativeStateNameMap"
                     ]
                 }
@@ -1120,6 +1078,27 @@
             ]
         }
     ],
+    "AutofillFixFillableFieldTypes": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillFixFillableFieldTypes"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillIgnoreAutocompleteForImport": [
         {
             "platforms": [
@@ -2272,6 +2251,27 @@
             ]
         }
     ],
+    "CompositeBGColorAnimationExp4": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CompositeBGColorAnimation"
+                    ]
+                }
+            ]
+        }
+    ],
     "CompositingBasedThrottling": [
         {
             "platforms": [
@@ -4307,8 +4307,8 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled",
-                    "enable_features": [
+                    "name": "Disabled",
+                    "disable_features": [
                         "ScreenTimeIntegration"
                     ]
                 }
@@ -5432,7 +5432,6 @@
                         "OmniboxMaxZeroSuggestMatches",
                         "OmniboxRemoveSuggestionsFromClipboard",
                         "OmniboxRichAutocompletion",
-                        "OmniboxTrendingZeroPrefixSuggestionsOnNTP",
                         "OmniboxUIExperimentMaxAutocompleteMatches",
                         "SearchSuggestChips"
                     ]
@@ -7137,6 +7136,21 @@
             ]
         }
     ],
+    "RevertDSEAutomaticPermissions": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "RevertDSEAutomaticPermissions"
+                    ]
+                }
+            ]
+        }
+    ],
     "SCTAuditingPhase1": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index dcab2ce..fb6f0ba 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -17,7 +17,6 @@
     ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_NPEBD@Z
     ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__1@std@@W4SchedulingMode@01@A6AXXZ@Z
     ??$CastAndCallFunction@$$CBU?$atomic@_N@__1@std@@@Condition@absl@@CA_NPEBV01@@Z
-    ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z
     ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index cbeb5ce..86cc98c4 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -217,7 +217,6 @@
       base::FEATURE_DISABLED_BY_DEFAULT
 #endif
 };
-const char kPrerender2MemoryThresholdParamName[] = "memory_threshold_in_mb";
 
 bool IsPrerender2Enabled() {
   return base::FeatureList::IsEnabled(blink::features::kPrerender2);
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 9b87d84c..4f06624d 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -71,10 +71,7 @@
 
 // Prerender2:
 BLINK_COMMON_EXPORT extern const base::Feature kPrerender2;
-// A field trial param that controls how much physical memory is required on a
-// device to use Prerender2. If the device's physical memory does not exceed
-// this value, pages will not be prerendered even when kPrerender2 is enabled.
-BLINK_COMMON_EXPORT extern const char kPrerender2MemoryThresholdParamName[];
+
 // Returns true when Prerender2 feature is enabled.
 BLINK_COMMON_EXPORT bool IsPrerender2Enabled();
 
diff --git a/third_party/blink/public/mojom/payments/payment_request.mojom b/third_party/blink/public/mojom/payments/payment_request.mojom
index ec6711a..06437dd 100644
--- a/third_party/blink/public/mojom/payments/payment_request.mojom
+++ b/third_party/blink/public/mojom/payments/payment_request.mojom
@@ -52,6 +52,7 @@
   NOT_SUPPORTED_FOR_INVALID_ORIGIN_OR_SSL,
   ALREADY_SHOWING,
   INVALID_DATA_FROM_RENDERER,
+  NOT_ALLOWED_ERROR,
 };
 
 enum CanMakePaymentQueryResult {
diff --git a/third_party/blink/public/public_features.gni b/third_party/blink/public/public_features.gni
index b5cc81d..94d2e5e 100644
--- a/third_party/blink/public/public_features.gni
+++ b/third_party/blink/public/public_features.gni
@@ -12,7 +12,7 @@
   enable_blink_heap_young_generation = false
 
   # Enables Blink's heap to use V8's version of Oilpan.
-  enable_blink_heap_use_v8_oilpan = true
+  enable_blink_heap_use_v8_oilpan = false
 }
 
 declare_args() {
diff --git a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
index 0dce491..53f444e2 100644
--- a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
+++ b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
@@ -21,13 +21,47 @@
   kLength
 };
 
+// Omit storing base URL if it is same as ScriptOrigin::ResourceName().
+// Note: This improves chance of getting into a fast path in
+//       ReferrerScriptInfo::ToV8HostDefinedOptions.
+KURL GetStoredBaseUrl(const ReferrerScriptInfo& referrer_info,
+                      const KURL& script_origin_resource_name) {
+  if (referrer_info.BaseURL() == script_origin_resource_name)
+    return KURL();
+
+  // TODO(https://crbug.com/1235202): Currently when either `base_url_` is
+  // `script_origin_resource_name` or null URL, they both result in
+  // `script_origin_resource_name` in FromV8HostDefinedOptions(). Subsequent
+  // CLs will fix this issue.
+  if (referrer_info.BaseURL().IsNull())
+    return KURL();
+
+  return referrer_info.BaseURL();
+}
+
 }  // namespace
 
+bool ReferrerScriptInfo::IsDefaultValue(
+    const KURL& script_origin_resource_name) const {
+  // TODO(https://crbug.com/1235205): `referrer_policy_` should be checked.
+  return GetStoredBaseUrl(*this, script_origin_resource_name).IsNull() &&
+         credentials_mode_ == network::mojom::CredentialsMode::kSameOrigin &&
+         nonce_.IsEmpty() && parser_state_ == kNotParserInserted;
+}
+
 ReferrerScriptInfo ReferrerScriptInfo::FromV8HostDefinedOptions(
     v8::Local<v8::Context> context,
-    v8::Local<v8::PrimitiveArray> host_defined_options) {
+    v8::Local<v8::PrimitiveArray> host_defined_options,
+    const KURL& script_origin_resource_name) {
   if (host_defined_options.IsEmpty() || !host_defined_options->Length()) {
-    return ReferrerScriptInfo();
+    // Default value. As base URL is null, defer to
+    // `script_origin_resource_name`.
+    ReferrerScriptInfo referrer_info(
+        script_origin_resource_name,
+        network::mojom::CredentialsMode::kSameOrigin, String(),
+        kNotParserInserted, network::mojom::ReferrerPolicy::kDefault);
+    DCHECK(referrer_info.IsDefaultValue(script_origin_resource_name));
+    return referrer_info;
   }
 
   v8::Isolate* isolate = context->GetIsolate();
@@ -38,6 +72,10 @@
       ToCoreString(v8::Local<v8::String>::Cast(base_url_value));
   KURL base_url = base_url_string.IsEmpty() ? KURL() : KURL(base_url_string);
   DCHECK(base_url.IsNull() || base_url.IsValid());
+  if (base_url.IsNull()) {
+    // If base URL is null, defer to `script_origin_resource_name`.
+    base_url = script_origin_resource_name;
+  }
 
   v8::Local<v8::Primitive> credentials_mode_value =
       host_defined_options->Get(isolate, kCredentialsMode);
@@ -71,13 +109,17 @@
 }
 
 v8::Local<v8::PrimitiveArray> ReferrerScriptInfo::ToV8HostDefinedOptions(
-    v8::Isolate* isolate) const {
-  if (IsDefaultValue())
+    v8::Isolate* isolate,
+    const KURL& script_origin_resource_name) const {
+  if (IsDefaultValue(script_origin_resource_name))
     return v8::Local<v8::PrimitiveArray>();
 
   v8::Local<v8::PrimitiveArray> host_defined_options =
       v8::PrimitiveArray::New(isolate, HostDefinedOptionsIndex::kLength);
 
+  const KURL stored_base_url =
+      GetStoredBaseUrl(*this, script_origin_resource_name);
+
   v8::Local<v8::Primitive> base_url_value =
       V8String(isolate, base_url_.GetString());
   host_defined_options->Set(isolate, HostDefinedOptionsIndex::kBaseURL,
diff --git a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.h b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.h
index 84ed3667..b863516 100644
--- a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.h
+++ b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.h
@@ -43,8 +43,11 @@
 
   static ReferrerScriptInfo FromV8HostDefinedOptions(
       v8::Local<v8::Context>,
-      v8::Local<v8::PrimitiveArray>);
-  v8::Local<v8::PrimitiveArray> ToV8HostDefinedOptions(v8::Isolate*) const;
+      v8::Local<v8::PrimitiveArray>,
+      const KURL& script_origin_resource_name);
+  v8::Local<v8::PrimitiveArray> ToV8HostDefinedOptions(
+      v8::Isolate*,
+      const KURL& script_origin_resource_name) const;
 
   const KURL& BaseURL() const { return base_url_; }
   network::mojom::CredentialsMode CredentialsMode() const {
@@ -56,19 +59,11 @@
     return referrer_policy_;
   }
 
-  bool IsDefaultValue() const {
-    return base_url_.IsNull() &&
-           credentials_mode_ == network::mojom::CredentialsMode::kSameOrigin &&
-           nonce_.IsEmpty() && parser_state_ == kNotParserInserted;
-  }
+  bool IsDefaultValue(const KURL& script_origin_resource_name) const;
 
  private:
   // Spec: "referencing script's base URL"
   // https://html.spec.whatwg.org/C/#concept-script-base-url
-  //
-  // If base_url_.IsNull(), refer to ScriptOrigin::ResourceName() instead.
-  // Note: This improves the chance of getting into the fast path in
-  //       ToV8HostDefinedOptions().
   const KURL base_url_;
 
   // Spec: "referencing script's credentials mode"
diff --git a/third_party/blink/renderer/bindings/core/v8/referrer_script_info_test.cc b/third_party/blink/renderer/bindings/core/v8/referrer_script_info_test.cc
index 3387eb1..fe4050b 100644
--- a/third_party/blink/renderer/bindings/core/v8/referrer_script_info_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/referrer_script_info_test.cc
@@ -11,30 +11,91 @@
 namespace blink {
 
 TEST(ReferrerScriptInfo, IsDefaultValue) {
-  EXPECT_TRUE(ReferrerScriptInfo().IsDefaultValue());
+  const KURL script_origin_resource_name("http://example.org/script.js");
+
+  // TODO(https://crbug.com/1114993): There three cases should be distinguished.
+  EXPECT_TRUE(ReferrerScriptInfo().IsDefaultValue(script_origin_resource_name));
+  EXPECT_TRUE(
+      ReferrerScriptInfo(script_origin_resource_name, ScriptFetchOptions())
+          .IsDefaultValue(script_origin_resource_name));
+  EXPECT_TRUE(ReferrerScriptInfo(KURL(), ScriptFetchOptions())
+                  .IsDefaultValue(script_origin_resource_name));
+
+  EXPECT_FALSE(
+      ReferrerScriptInfo(KURL("http://example.com"), ScriptFetchOptions())
+          .IsDefaultValue(script_origin_resource_name));
   EXPECT_FALSE(ReferrerScriptInfo(KURL("http://example.com"),
                                   network::mojom::CredentialsMode::kInclude, "",
                                   kNotParserInserted,
                                   network::mojom::ReferrerPolicy::kDefault)
-                   .IsDefaultValue());
+                   .IsDefaultValue(script_origin_resource_name));
+}
+
+TEST(ReferrerScriptInfo, ToFromV8NoReferencingScript) {
+  V8TestingScope scope;
+  const KURL script_origin_resource_name("http://example.org/script.js");
+
+  v8::Local<v8::PrimitiveArray> v8_info =
+      ReferrerScriptInfo().ToV8HostDefinedOptions(scope.GetIsolate(),
+                                                  script_origin_resource_name);
+
+  EXPECT_TRUE(v8_info.IsEmpty());
+
+  ReferrerScriptInfo decoded = ReferrerScriptInfo::FromV8HostDefinedOptions(
+      scope.GetContext(), v8_info, script_origin_resource_name);
+
+  // TODO(https://crbug.com/1235202): This should be null URL.
+  EXPECT_EQ(script_origin_resource_name, decoded.BaseURL());
+}
+
+TEST(ReferrerScriptInfo, ToFromV8ScriptOriginBaseUrl) {
+  V8TestingScope scope;
+  const KURL script_origin_resource_name("http://example.org/script.js");
+
+  v8::Local<v8::PrimitiveArray> v8_info =
+      ReferrerScriptInfo(script_origin_resource_name, ScriptFetchOptions())
+          .ToV8HostDefinedOptions(scope.GetIsolate(),
+                                  script_origin_resource_name);
+
+  EXPECT_TRUE(v8_info.IsEmpty());
+
+  ReferrerScriptInfo decoded = ReferrerScriptInfo::FromV8HostDefinedOptions(
+      scope.GetContext(), v8_info, script_origin_resource_name);
+
+  EXPECT_EQ(script_origin_resource_name, decoded.BaseURL());
+}
+
+TEST(ReferrerScriptInfo, ToFromV8ScriptNullBaseUrl) {
+  V8TestingScope scope;
+  const KURL script_origin_resource_name("http://example.org/script.js");
+
+  v8::Local<v8::PrimitiveArray> v8_info =
+      ReferrerScriptInfo(KURL(), ScriptFetchOptions())
+          .ToV8HostDefinedOptions(scope.GetIsolate(),
+                                  script_origin_resource_name);
+
+  EXPECT_TRUE(v8_info.IsEmpty());
+
+  ReferrerScriptInfo decoded = ReferrerScriptInfo::FromV8HostDefinedOptions(
+      scope.GetContext(), v8_info, script_origin_resource_name);
+
+  // TODO(https://crbug.com/1235202): This should be null URL.
+  EXPECT_EQ(script_origin_resource_name, decoded.BaseURL());
 }
 
 TEST(ReferrerScriptInfo, ToFromV8) {
   V8TestingScope scope;
+  const KURL script_origin_resource_name("http://example.org/script.js");
   const KURL url("http://example.com");
 
-  EXPECT_TRUE(ReferrerScriptInfo()
-                  .ToV8HostDefinedOptions(scope.GetIsolate())
-                  .IsEmpty());
-
   ReferrerScriptInfo info(url, network::mojom::CredentialsMode::kInclude,
                           "foobar", kNotParserInserted,
                           network::mojom::ReferrerPolicy::kOrigin);
-  v8::Local<v8::PrimitiveArray> v8_info =
-      info.ToV8HostDefinedOptions(scope.GetIsolate());
+  v8::Local<v8::PrimitiveArray> v8_info = info.ToV8HostDefinedOptions(
+      scope.GetIsolate(), script_origin_resource_name);
 
-  ReferrerScriptInfo decoded =
-      ReferrerScriptInfo::FromV8HostDefinedOptions(scope.GetContext(), v8_info);
+  ReferrerScriptInfo decoded = ReferrerScriptInfo::FromV8HostDefinedOptions(
+      scope.GetContext(), v8_info, script_origin_resource_name);
   EXPECT_EQ(url, decoded.BaseURL());
   EXPECT_EQ(network::mojom::CredentialsMode::kInclude,
             decoded.CredentialsMode());
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
index e44fb6a..0b04fe61 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
@@ -315,9 +315,11 @@
 scoped_refptr<CachedMetadata> V8CodeCache::GenerateFullCodeCache(
     ScriptState* script_state,
     const String& script_string,
-    const String& file_name,
+    const KURL& source_url,
     const WTF::TextEncoding& encoding,
     OpaqueMode opaque_mode) {
+  const String file_name = source_url.GetString();
+
   constexpr const char* kTraceEventCategoryGroup = "v8,devtools.timeline";
   TRACE_EVENT_BEGIN1(kTraceEventCategoryGroup, "v8.compile", "fileName",
                      file_name.Utf8());
@@ -338,7 +340,7 @@
       opaque_mode == OpaqueMode::kOpaque,     // is_opaque
       false,                                  // is_wasm
       false,                                  // is_module
-      referrer_info.ToV8HostDefinedOptions(isolate));
+      referrer_info.ToV8HostDefinedOptions(isolate, source_url));
   v8::Local<v8::String> code(V8String(isolate, script_string));
   v8::ScriptCompiler::Source source(code, origin);
   scoped_refptr<CachedMetadata> cached_metadata;
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h
index d5d76f9..c71df6c 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h
+++ b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h
@@ -90,7 +90,7 @@
   static scoped_refptr<CachedMetadata> GenerateFullCodeCache(
       ScriptState*,
       const String& script_string,
-      const String& file_name,
+      const KURL& source_url,
       const WTF::TextEncoding&,
       OpaqueMode);
 };
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index 95edbfc..c98a621a 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -600,12 +600,11 @@
 
   ReferrerScriptInfo referrer_info =
       ReferrerScriptInfo::FromV8HostDefinedOptions(
-          context, v8_referrer->GetHostDefinedOptions());
+          context, v8_referrer->GetHostDefinedOptions(), referrer_resource_url);
 
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
-  modulator->ResolveDynamically(module_request, referrer_resource_url,
-                                referrer_info, resolver);
+  modulator->ResolveDynamically(module_request, referrer_info, resolver);
   return v8::Local<v8::Promise>::Cast(promise.V8Value());
 }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index cf089e89..67f0f5d 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -249,7 +249,7 @@
       sanitize_script_errors == SanitizeScriptErrors::kSanitize,
       false,  // is_wasm
       false,  // is_module
-      referrer_info.ToV8HostDefinedOptions(isolate));
+      referrer_info.ToV8HostDefinedOptions(isolate, source.Url()));
 
   if (!*TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(kTraceEventCategoryGroup)) {
     return CompileScriptInternal(isolate, script_state, source, origin,
@@ -284,16 +284,17 @@
 
   // |resource_is_shared_cross_origin| is always true and |resource_is_opaque|
   // is always false because CORS is enforced to module scripts.
-  v8::ScriptOrigin origin(isolate, V8String(isolate, file_name),
-                          start_position.line_.ZeroBasedInt(),
-                          start_position.column_.ZeroBasedInt(),
-                          true,  // resource_is_shared_cross_origin
-                          -1,    // script id
-                          v8::String::Empty(isolate),  // source_map_url
-                          false,                       // resource_is_opaque
-                          false,                       // is_wasm
-                          true,                        // is_module
-                          referrer_info.ToV8HostDefinedOptions(isolate));
+  v8::ScriptOrigin origin(
+      isolate, V8String(isolate, file_name),
+      start_position.line_.ZeroBasedInt(),
+      start_position.column_.ZeroBasedInt(),
+      true,                        // resource_is_shared_cross_origin
+      -1,                          // script id
+      v8::String::Empty(isolate),  // source_map_url
+      false,                       // resource_is_opaque
+      false,                       // is_wasm
+      true,                        // is_module
+      referrer_info.ToV8HostDefinedOptions(isolate, params.SourceURL()));
 
   v8::Local<v8::String> code = V8String(isolate, params.GetSourceText());
   inspector_compile_script_event::V8CacheResult cache_result;
@@ -471,13 +472,7 @@
       try_catch.SetVerbose(true);
     }
 
-    // Omit storing base URL if it is same as source URL.
-    // Note: This improves chance of getting into a fast path in
-    //       ReferrerScriptInfo::ToV8HostDefinedOptions.
-    const KURL base_url = classic_script->BaseURL();
-    KURL stored_base_url = (base_url == source.Url()) ? KURL() : base_url;
-
-    const ReferrerScriptInfo referrer_info(stored_base_url,
+    const ReferrerScriptInfo referrer_info(classic_script->BaseURL(),
                                            classic_script->FetchOptions());
 
     v8::Local<v8::Script> script;
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index ea5eb6e..dbd963f7 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -89,6 +89,10 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_navigate_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_navigation_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_navigation_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_reload_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_reload_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_update_current_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_app_history_update_current_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_application_cache_error_event_init.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_application_cache_error_event_init.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_assigned_nodes_options.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 6bca4f4..bccaa03 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -41,6 +41,8 @@
           "//third_party/blink/renderer/core/app_history/app_history_navigate_event_init.idl",
           "//third_party/blink/renderer/core/app_history/app_history_navigate_options.idl",
           "//third_party/blink/renderer/core/app_history/app_history_navigation_options.idl",
+          "//third_party/blink/renderer/core/app_history/app_history_reload_options.idl",
+          "//third_party/blink/renderer/core/app_history/app_history_update_current_options.idl",
           "//third_party/blink/renderer/core/app_history/window_app_history.idl",
           "//third_party/blink/renderer/core/clipboard/data_transfer.idl",
           "//third_party/blink/renderer/core/clipboard/data_transfer_item.idl",
diff --git a/third_party/blink/renderer/core/app_history/app_history.cc b/third_party/blink/renderer/core/app_history/app_history.cc
index e0a91a42..f555718 100644
--- a/third_party/blink/renderer/core/app_history/app_history.cc
+++ b/third_party/blink/renderer/core/app_history/app_history.cc
@@ -6,12 +6,15 @@
 
 #include <memory>
 
+#include "third_party/blink/public/web/web_frame_load_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_function.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_app_history_navigate_event_init.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_app_history_navigate_options.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_app_history_reload_options.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_app_history_update_current_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/app_history/app_history_destination.h"
 #include "third_party/blink/renderer/core/app_history/app_history_entry.h"
@@ -277,51 +280,99 @@
              : HeapVector<Member<AppHistoryEntry>>();
 }
 
+void AppHistory::updateCurrent(AppHistoryUpdateCurrentOptions* options,
+                               ExceptionState& exception_state) {
+  AppHistoryEntry* current_entry = current();
+
+  if (!current_entry) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidStateError,
+        "updateCurrent() cannot be called when on the initial about:blank "
+        "Document, or when the Window is detached.");
+    return;
+  }
+
+  scoped_refptr<SerializedScriptValue> serialized_state =
+      SerializeState(options->state(), exception_state);
+  if (exception_state.HadException())
+    return;
+
+  current_entry->GetItem()->SetAppHistoryState(std::move(serialized_state));
+}
+
 ScriptPromise AppHistory::navigate(ScriptState* script_state,
                                    const String& url,
                                    AppHistoryNavigateOptions* options,
                                    ExceptionState& exception_state) {
-  if (!GetSupplementable()->GetFrame()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "navigate() may not be called in a "
-                                      "detached window");
-    return ScriptPromise();
-  }
-  if (GetSupplementable()->document()->PageDismissalEventBeingDispatched()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "navigate() may not be called during "
-                                      "page dismissal");
-    return ScriptPromise();
-  }
-
   KURL completed_url(GetSupplementable()->Url(), url);
   if (!completed_url.IsValid()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kSyntaxError,
-                                      "Invalid url");
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kSyntaxError,
+        "Invalid URL '" + completed_url.GetString() + "'.");
     return ScriptPromise();
   }
 
-  to_be_set_serialized_state_ = nullptr;
+  PerformSharedNavigationChecks(exception_state, "navigate()");
+  if (exception_state.HadException())
+    return ScriptPromise();
+
+  scoped_refptr<SerializedScriptValue> serialized_state = nullptr;
   if (options->hasState()) {
-    to_be_set_serialized_state_ = SerializedScriptValue::Serialize(
-        GetSupplementable()->GetIsolate(), options->state().V8Value(),
-        SerializedScriptValue::SerializeOptions(
-            SerializedScriptValue::kForStorage),
-        exception_state);
+    serialized_state = SerializeState(options->state(), exception_state);
     if (exception_state.HadException())
       return ScriptPromise();
   }
 
+  WebFrameLoadType frame_load_type = options->replace()
+                                         ? WebFrameLoadType::kReplaceCurrentItem
+                                         : WebFrameLoadType::kStandard;
+
+  return PerformNonTraverseNavigation(script_state, completed_url,
+                                      std::move(serialized_state), options,
+                                      frame_load_type, exception_state);
+}
+
+ScriptPromise AppHistory::reload(ScriptState* script_state,
+                                 AppHistoryReloadOptions* options,
+                                 ExceptionState& exception_state) {
+  PerformSharedNavigationChecks(exception_state, "reload()");
+  if (exception_state.HadException())
+    return ScriptPromise();
+
+  scoped_refptr<SerializedScriptValue> serialized_state = nullptr;
+  if (options->hasState()) {
+    serialized_state = SerializeState(options->state(), exception_state);
+    if (exception_state.HadException())
+      return ScriptPromise();
+  } else if (AppHistoryEntry* current_entry = current()) {
+    serialized_state = current_entry->GetItem()->GetAppHistoryState();
+  }
+
+  return PerformNonTraverseNavigation(
+      script_state, GetSupplementable()->Url(), std::move(serialized_state),
+      options, WebFrameLoadType::kReload, exception_state);
+}
+
+ScriptPromise AppHistory::PerformNonTraverseNavigation(
+    ScriptState* script_state,
+    const KURL& url,
+    scoped_refptr<SerializedScriptValue> serialized_state,
+    AppHistoryNavigationOptions* options,
+    WebFrameLoadType frame_load_type,
+    ExceptionState& exception_state) {
+  DCHECK(frame_load_type == WebFrameLoadType::kReplaceCurrentItem ||
+         frame_load_type == WebFrameLoadType::kReload ||
+         frame_load_type == WebFrameLoadType::kStandard);
+
   AppHistoryApiNavigation* navigation =
       MakeGarbageCollected<AppHistoryApiNavigation>(script_state, options);
   upcoming_non_traversal_navigation_ = navigation;
 
-  WebFrameLoadType frame_load_type = options->replace()
-                                         ? WebFrameLoadType::kReplaceCurrentItem
-                                         : WebFrameLoadType::kStandard;
+  to_be_set_serialized_state_ = serialized_state;
+
   GetSupplementable()->GetFrame()->MaybeLogAdClickNavigation();
 
-  FrameLoadRequest request(GetSupplementable(), ResourceRequest(completed_url));
+  FrameLoadRequest request(GetSupplementable(), ResourceRequest(url));
   request.SetClientRedirectReason(ClientNavigationReason::kFrameNavigation);
   GetSupplementable()->GetFrame()->Navigate(request, frame_load_type);
 
@@ -359,33 +410,14 @@
   return navigation->returned_promise->Promise();
 }
 
-ScriptPromise AppHistory::navigate(ScriptState* script_state,
-                                   AppHistoryNavigateOptions* options,
-                                   ExceptionState& exception_state) {
-  if (!options->hasState() && !options->hasInfo()) {
-    exception_state.ThrowTypeError(
-        "Must pass at least one of url, state, or info to navigate()");
-    return ScriptPromise();
-  }
-  return navigate(script_state, GetSupplementable()->Url(), options,
-                  exception_state);
-}
-
 ScriptPromise AppHistory::goTo(ScriptState* script_state,
                                const String& key,
                                AppHistoryNavigationOptions* options,
                                ExceptionState& exception_state) {
-  if (!GetSupplementable()->GetFrame()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "Window is detached");
+  PerformSharedNavigationChecks(exception_state, "goTo()/back()/forward()");
+  if (exception_state.HadException())
     return ScriptPromise();
-  }
-  if (GetSupplementable()->document()->PageDismissalEventBeingDispatched()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "navigate() may not be called during "
-                                      "page dismissal");
-    return ScriptPromise();
-  }
+
   if (!keys_to_indices_.Contains(key)) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "Invalid key");
@@ -463,6 +495,33 @@
               exception_state);
 }
 
+void AppHistory::PerformSharedNavigationChecks(
+    ExceptionState& exception_state,
+    const String& method_name_for_error_message) {
+  if (!GetSupplementable()->GetFrame()) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidStateError,
+        method_name_for_error_message +
+            " cannot be called when the Window is detached.");
+  }
+  if (GetSupplementable()->document()->PageDismissalEventBeingDispatched()) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidStateError,
+        method_name_for_error_message +
+            " cannot be called during unload or beforeunload.");
+  }
+}
+
+scoped_refptr<SerializedScriptValue> AppHistory::SerializeState(
+    const ScriptValue& value,
+    ExceptionState& exception_state) {
+  return SerializedScriptValue::Serialize(
+      GetSupplementable()->GetIsolate(), value.V8Value(),
+      SerializedScriptValue::SerializeOptions(
+          SerializedScriptValue::kForStorage),
+      exception_state);
+}
+
 String DetermineNavigationType(WebFrameLoadType type) {
   switch (type) {
     case WebFrameLoadType::kStandard:
diff --git a/third_party/blink/renderer/core/app_history/app_history.h b/third_party/blink/renderer/core/app_history/app_history.h
index 7a00dd18..ad46596 100644
--- a/third_party/blink/renderer/core/app_history/app_history.h
+++ b/third_party/blink/renderer/core/app_history/app_history.h
@@ -5,11 +5,13 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_APP_HISTORY_APP_HISTORY_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_APP_HISTORY_APP_HISTORY_H_
 
+#include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/web/web_frame_load_type.h"
 #include "third_party/blink/public/web/web_history_item.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/supplementable.h"
@@ -18,9 +20,11 @@
 
 class AbortSignal;
 class AppHistoryApiNavigation;
+class AppHistoryUpdateCurrentOptions;
 class AppHistoryEntry;
 class AppHistoryNavigateEvent;
 class AppHistoryNavigateOptions;
+class AppHistoryReloadOptions;
 class AppHistoryNavigationOptions;
 class HTMLFormElement;
 class HistoryItem;
@@ -53,6 +57,7 @@
   // Web-exposed:
   AppHistoryEntry* current() const;
   HeapVector<Member<AppHistoryEntry>> entries();
+  void updateCurrent(AppHistoryUpdateCurrentOptions*, ExceptionState&);
 
   bool canGoBack() const;
   bool canGoForward() const;
@@ -61,9 +66,7 @@
                          const String& url,
                          AppHistoryNavigateOptions*,
                          ExceptionState&);
-  ScriptPromise navigate(ScriptState*,
-                         AppHistoryNavigateOptions*,
-                         ExceptionState&);
+  ScriptPromise reload(ScriptState*, AppHistoryReloadOptions*, ExceptionState&);
 
   ScriptPromise goTo(ScriptState*,
                      const String& key,
@@ -106,6 +109,21 @@
   void FinalizeWithAbortedNavigationError(ScriptState*,
                                           AppHistoryApiNavigation*);
 
+  ScriptPromise PerformNonTraverseNavigation(
+      ScriptState*,
+      const KURL&,
+      scoped_refptr<SerializedScriptValue>,
+      AppHistoryNavigationOptions*,
+      WebFrameLoadType,
+      ExceptionState&);
+
+  void PerformSharedNavigationChecks(
+      ExceptionState&,
+      const String& method_name_for_error_message);
+
+  scoped_refptr<SerializedScriptValue> SerializeState(const ScriptValue&,
+                                                      ExceptionState&);
+
   HeapVector<Member<AppHistoryEntry>> entries_;
   HashMap<String, int> keys_to_indices_;
   int current_index_ = -1;
diff --git a/third_party/blink/renderer/core/app_history/app_history.idl b/third_party/blink/renderer/core/app_history/app_history.idl
index 90dd595..1de99c5 100644
--- a/third_party/blink/renderer/core/app_history/app_history.idl
+++ b/third_party/blink/renderer/core/app_history/app_history.idl
@@ -9,12 +9,13 @@
 ] interface AppHistory : EventTarget {
   readonly attribute AppHistoryEntry current;
   sequence<AppHistoryEntry> entries();
+  [RaisesException] void updateCurrent(AppHistoryUpdateCurrentOptions options);
 
   readonly attribute boolean canGoBack;
   readonly attribute boolean canGoForward;
 
   [CallWith=ScriptState, RaisesException] Promise<void> navigate(USVString url, optional AppHistoryNavigateOptions options = {});
-  [CallWith=ScriptState, RaisesException] Promise<void> navigate(AppHistoryNavigateOptions options);
+  [CallWith=ScriptState, RaisesException] Promise<void> reload(optional AppHistoryReloadOptions options = {});
 
   [CallWith=ScriptState, RaisesException] Promise<void> goTo(DOMString key, optional AppHistoryNavigationOptions options = {});
   [CallWith=ScriptState, RaisesException] Promise<void> back(optional AppHistoryNavigationOptions options = {});
diff --git a/third_party/blink/renderer/core/app_history/app_history_reload_options.idl b/third_party/blink/renderer/core/app_history/app_history_reload_options.idl
new file mode 100644
index 0000000..e1103e3
--- /dev/null
+++ b/third_party/blink/renderer/core/app_history/app_history_reload_options.idl
@@ -0,0 +1,8 @@
+// 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.
+
+// https://github.com/WICG/app-history/
+dictionary AppHistoryReloadOptions : AppHistoryNavigationOptions {
+  any state;
+};
diff --git a/third_party/blink/renderer/core/app_history/app_history_update_current_options.idl b/third_party/blink/renderer/core/app_history/app_history_update_current_options.idl
new file mode 100644
index 0000000..e8a8005a
--- /dev/null
+++ b/third_party/blink/renderer/core/app_history/app_history_update_current_options.idl
@@ -0,0 +1,8 @@
+// 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.
+
+// https://github.com/WICG/app-history/
+dictionary AppHistoryUpdateCurrentOptions {
+  required any state;
+};
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc
index f55d2c1..007039f2 100644
--- a/third_party/blink/renderer/core/css/element_rule_collector.cc
+++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -275,7 +275,7 @@
         match_request.rule_set->IdRules(element.IdForStyleResolution()),
         match_request, checker);
   }
-  if (element.HasClass()) {
+  if (element.IsStyledElement() && element.HasClass()) {
     for (wtf_size_t i = 0; i < element.ClassNames().size(); ++i) {
       CollectMatchingRulesForList(
           match_request.rule_set->ClassRules(element.ClassNames()[i]),
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 5f6bcae8..d49d48d 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2432,7 +2432,10 @@
 
 void Element::UpdateClassList(const AtomicString& old_class_string,
                               const AtomicString& new_class_string) {
-  classList().DidUpdateAttributeValue(old_class_string, new_class_string);
+  if (!HasRareData())
+    return;
+  if (DOMTokenList* class_list = GetElementRareData()->GetClassList())
+    class_list->DidUpdateAttributeValue(old_class_string, new_class_string);
 }
 
 // Returns true if the given attribute is an event handler.
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index 5b7a3c1..b4786b5 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -372,7 +372,7 @@
     return;
   DCHECK(!markers_.IsEmpty());
 
-  MarkerLists* const src_markers = markers_.at(&src_node);
+  MarkerLists* const src_markers = markers_.DeprecatedAtOrEmptyValue(&src_node);
   if (!src_markers)
     return;
 
@@ -416,7 +416,7 @@
     return;
   DCHECK(!(markers_.IsEmpty()));
 
-  MarkerLists* const markers = markers_.at(&text);
+  MarkerLists* const markers = markers_.DeprecatedAtOrEmptyValue(&text);
   if (!markers)
     return;
 
@@ -902,7 +902,7 @@
 
 void DocumentMarkerController::InvalidateRectsForTextMatchMarkersInNode(
     const Text& node) {
-  MarkerLists* markers = markers_.at(&node);
+  MarkerLists* markers = markers_.DeprecatedAtOrEmptyValue(&node);
 
   const DocumentMarkerList* const marker_list =
       ListForType(markers, DocumentMarker::kTextMatch);
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 2d234ab..cf18885 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2739,6 +2739,18 @@
   if (AnyFrameIsPrintingOrPaintingPreview())
     return;
 
+  // Validate all HighlightMarkers of all non-throttled LocalFrameViews before
+  // the call to PaintTree() so they're updated during this lifecycle.
+  ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) {
+    if (LocalDOMWindow* window = frame_view.GetFrame().DomWindow()) {
+      if (HighlightRegistry* highlight_registry =
+              window->Supplementable<LocalDOMWindow>::RequireSupplement<
+                  HighlightRegistry>()) {
+        highlight_registry->ValidateHighlightMarkers();
+      }
+    }
+  });
+
   bool repainted = PaintTree(benchmark_mode);
 
   if (paint_artifact_compositor_ &&
@@ -2754,14 +2766,6 @@
   ForAllNonThrottledLocalFrameViews(
       [this, &needed_update,
        &total_animations_count](LocalFrameView& frame_view) {
-        if (LocalDOMWindow* window = frame_view.GetFrame().DomWindow()) {
-          if (HighlightRegistry* highlight_registry =
-                  window->Supplementable<LocalDOMWindow>::RequireSupplement<
-                      HighlightRegistry>()) {
-            highlight_registry->ValidateHighlightMarkers();
-          }
-        }
-
         if (auto* scrollable_area = frame_view.GetScrollableArea())
           scrollable_area->UpdateCompositorScrollAnimations();
         if (const auto* animating_scrollable_areas =
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc
index bcc9e5ef..5ab0e1f 100644
--- a/third_party/blink/renderer/core/frame/web_frame_test.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -7727,33 +7727,6 @@
   EXPECT_EQ(kWebBackForwardCommit, client.LastCommitType());
 }
 
-// Tests that the first navigation in an initially blank subframe will result in
-// a history entry being replaced and not a new one being added.
-TEST_F(WebFrameTest, FirstBlankSubframeNavigation) {
-  RegisterMockedHttpURLLoad("history.html");
-  RegisterMockedHttpURLLoad("find.html");
-
-  frame_test_helpers::WebViewHelper web_view_helper;
-  web_view_helper.InitializeAndLoad("about:blank");
-
-  WebLocalFrame* frame = web_view_helper.LocalMainFrame();
-
-  frame->ExecuteScript(WebScriptSource(WebString::FromUTF8(
-      "document.body.appendChild(document.createElement('iframe'))")));
-
-  auto* iframe = To<WebLocalFrameImpl>(frame->FirstChild());
-
-  std::string url1 = base_url_ + "history.html";
-  frame_test_helpers::LoadFrame(iframe, url1);
-  EXPECT_EQ(url1, iframe->GetDocument().Url().GetString().Utf8());
-  EXPECT_TRUE(iframe->GetDocumentLoader()->ReplacesCurrentHistoryItem());
-
-  std::string url2 = base_url_ + "find.html";
-  frame_test_helpers::LoadFrame(iframe, url2);
-  EXPECT_EQ(url2, iframe->GetDocument().Url().GetString().Utf8());
-  EXPECT_FALSE(iframe->GetDocumentLoader()->ReplacesCurrentHistoryItem());
-}
-
 // Tests that a navigation in a frame with a non-blank initial URL will create
 // a new history item, unlike the case above.
 TEST_F(WebFrameTest, FirstNonBlankSubframeNavigation) {
@@ -9657,29 +9630,6 @@
   absl::optional<WebHistoryCommitType> history_commit_type_;
 };
 
-// The commit type should be Initial if we are swapping a RemoteFrame to a
-// LocalFrame as it is first being created.  This happens when another frame
-// exists in the same process, such that we create the RemoteFrame before the
-// first navigation occurs.
-TEST_F(WebFrameSwapTest, HistoryCommitTypeAfterNewRemoteToLocalSwap) {
-  WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote();
-  WebFrame* target_frame = MainFrame()->FirstChild();
-  ASSERT_TRUE(target_frame);
-  target_frame->Swap(remote_frame);
-  ASSERT_TRUE(MainFrame()->FirstChild());
-  ASSERT_EQ(MainFrame()->FirstChild(), remote_frame);
-
-  RemoteToLocalSwapWebFrameClient client;
-  WebLocalFrame* local_frame =
-      web_view_helper_.CreateProvisional(*remote_frame, &client);
-  frame_test_helpers::LoadFrame(local_frame, base_url_ + "subframe-hello.html");
-  EXPECT_EQ(kWebHistoryInertCommit, client.HistoryCommitType());
-
-  // Manually reset to break WebViewHelper's dependency on the stack allocated
-  // TestWebFrameClient.
-  Reset();
-}
-
 // The commit type should be Standard if we are swapping a RemoteFrame to a
 // LocalFrame after commits have already happened in the frame.  The browser
 // process will inform us via setCommittedFirstRealLoad.
@@ -9922,24 +9872,6 @@
   WebHistoryCommitType history_commit_type_ = kWebHistoryInertCommit;
 };
 
-TEST_F(WebFrameTest, RemoteFrameInitialCommitType) {
-  frame_test_helpers::WebViewHelper helper;
-  helper.InitializeRemote(nullptr, SecurityOrigin::CreateFromString(
-                                       WebString::FromUTF8(base_url_)));
-
-  // If an iframe has a remote main frame, ensure the inital commit is correctly
-  // identified as kWebHistoryInertCommit.
-  CommitTypeWebFrameClient child_frame_client;
-  WebLocalFrame* child_frame = helper.CreateLocalChild(
-      *helper.RemoteMainFrame(), "frameName", WebFrameOwnerProperties(),
-      nullptr, &child_frame_client);
-  RegisterMockedHttpURLLoad("foo.html");
-  frame_test_helpers::LoadFrame(child_frame, base_url_ + "foo.html");
-  EXPECT_EQ(kWebHistoryInertCommit, child_frame_client.HistoryCommitType());
-
-  helper.Reset();
-}
-
 TEST_F(WebFrameTest, DetachRemoteFrame) {
   frame_test_helpers::WebViewHelper helper;
   helper.InitializeRemote();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
index 9a27993..982c01c 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
@@ -394,6 +394,40 @@
   EXPECT_EQ(12u, cursor.Current()->StartOffsetInContainer(cursor));
 }
 
+TEST_F(NGFragmentItemTest, EllipsizedAtomicInline) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    #container {
+      width: 100px;
+      white-space: pre;
+      text-overflow: ellipsis;
+      overflow: hidden;
+    }
+    #atomic {
+      display: inline-block;
+      width: 200px;
+    }
+    </style>
+    <div id="container"><span id="atomic"> </span>XXXXXX</div>
+  )HTML");
+  auto* container =
+      To<LayoutBlockFlow>(GetLayoutObjectByElementId("container"));
+  auto* atomic = GetLayoutObjectByElementId("atomic");
+  NGInlineCursor cursor(*container);
+  cursor.MoveToNext();
+  EXPECT_EQ(cursor.Current().GetLayoutObject(), atomic);
+  EXPECT_EQ(cursor.Current()->Type(), NGFragmentItem::kBox);
+  // When atomic inline is ellipsized, |IsLastForNode| should be set to the last
+  // |kBox| item, even if ellipses follow.
+  EXPECT_TRUE(cursor.Current()->IsLastForNode());
+  cursor.MoveToNext();
+  EXPECT_EQ(cursor.Current()->Type(), NGFragmentItem::kText);
+  cursor.MoveToNext();
+  EXPECT_EQ(cursor.Current().GetLayoutObject(), atomic);
+  EXPECT_EQ(cursor.Current()->Type(), NGFragmentItem::kGeneratedText);
+  EXPECT_TRUE(cursor.Current()->IsLastForNode());
+}
+
 // Various nodes/elements to test insertions.
 using CreateNode = Node* (*)(Document&);
 static CreateNode node_creators[] = {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc
index 914143d..34da34a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc
@@ -117,7 +117,9 @@
       DCHECK(layout_object->IsInLayoutNGInlineFormattingContext());
 
       item.SetDeltaToNextForSameLayoutObject(0);
-      if (UNLIKELY(layout_object->IsFloating() || !layout_object->IsInline())) {
+      const bool use_break_token =
+          layout_object->IsFloating() || !layout_object->IsInline();
+      if (UNLIKELY(use_break_token)) {
         // Fragments that aren't really on a line, such as floats, will have
         // block break tokens if they continue in a subsequent fragmentainer, so
         // just check that. Floats in particular will continue as regular box
@@ -155,7 +157,13 @@
       DCHECK_LT(last_index, fragment_items->EndItemIndex());
       DCHECK_LT(last_index, item_index);
       last_item->SetDeltaToNextForSameLayoutObject(item_index - last_index);
-      if (!layout_object->IsFloating())
+      // Because we found a following fragment, reset |IsLastForNode| for the
+      // last item except:
+      // a. |IsLastForNode| is computed from break token. The last item already
+      //    has the correct value.
+      // b. Ellipses for atomic inlines. |IsLastForNode| of the last box item
+      //    should be set to ease handling of this edge case.
+      if (!use_break_token && !(layout_object->IsBox() && item.IsEllipsis()))
         last_item->SetIsLastForNode(false);
 #if DCHECK_IS_ON()
       CheckIsLast(*last_item);
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 25260ce..f0e5b7e 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -458,22 +458,27 @@
   TakeObjectSnapshot();
 }
 
-WebFrameLoadType FrameLoader::DetermineFrameLoadType(
+WebFrameLoadType FrameLoader::HandleInitialEmptyDocumentReplacementIfNeeded(
     const KURL& url,
     WebFrameLoadType frame_load_type) {
-  // TODO(dgozman): this method is rewriting the load type, which makes it hard
-  // to reason about various navigations and their desired load type. We should
-  // untangle it and detect the load type at the proper place. See, for example,
-  // location.assign() block below.
-  // Achieving that is complicated due to similar conditions in many places
-  // both in the renderer and in the browser.
+  // Converts navigations from the initial empty document to do replacement if
+  // needed.
   if (frame_load_type == WebFrameLoadType::kStandard ||
       frame_load_type == WebFrameLoadType::kReplaceCurrentItem) {
     if (frame_->Tree().Parent() &&
         empty_document_status_ == EmptyDocumentStatus::kOnlyEmpty) {
+      // Subframe navigations from the initial empty document should always do
+      // replacement.
       return WebFrameLoadType::kReplaceCurrentItem;
     }
     if (!frame_->Tree().Parent() && !Client()->BackForwardLength()) {
+      // For main frames, currently only empty-URL navigations will be converted
+      // to do replacement. Note that this will cause the navigation to be
+      // ignored in the browser side, so no NavigationEntry will be added.
+      // TODO(https://crbug.com/1215096, https://crbug.com/524208): Make the
+      // main frame case follow the behavior of subframes (always replace when
+      // navigating from the initial empty document), and that a NavigationEntry
+      // will always be created.
       if (Opener() && url.IsEmpty())
         return WebFrameLoadType::kReplaceCurrentItem;
       return WebFrameLoadType::kStandard;
@@ -634,8 +639,8 @@
     return;
   }
 
-  frame_load_type =
-      DetermineFrameLoadType(resource_request.Url(), frame_load_type);
+  frame_load_type = HandleInitialEmptyDocumentReplacementIfNeeded(
+      resource_request.Url(), frame_load_type);
 
   bool same_document_navigation =
       request.GetNavigationPolicy() == kNavigationPolicyCurrentTab &&
@@ -948,9 +953,6 @@
   if (frame_owner)
     frame_owner->CancelPendingLazyLoad();
 
-  navigation_params->frame_load_type = DetermineFrameLoadType(
-      navigation_params->url, navigation_params->frame_load_type);
-
   // Note: we might actually classify this navigation as same document
   // right here in the following circumstances:
   // - the loader has already committed a navigation and notified the browser
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h
index 4c313f5..2320b8b 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.h
+++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -232,7 +232,9 @@
 
  private:
   bool AllowRequestForThisFrame(const FrameLoadRequest&);
-  WebFrameLoadType DetermineFrameLoadType(const KURL& url, WebFrameLoadType);
+  WebFrameLoadType HandleInitialEmptyDocumentReplacementIfNeeded(
+      const KURL& url,
+      WebFrameLoadType);
 
   bool ShouldPerformFragmentNavigation(bool is_form_submission,
                                        const String& http_method,
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
index 46910d2..24208668 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -406,12 +406,19 @@
 void MobileFriendlinessChecker::ComputeSmallTextRatio(
     const LayoutObject& object) {
   if (const auto* text = DynamicTo<LayoutText>(object)) {
-    const ComputedStyle* style = text->Style();
+    const auto& style = text->StyleRef();
 
-    if (style->Visibility() != EVisibility::kVisible)
+    // Ignore elements that users cannot see.
+    if (style.Visibility() != EVisibility::kVisible)
       return;
 
-    double actual_font_size = style->FontSize();
+    // Ignore elements intended only for screen readers.
+    if (style.HasOutOfFlowPosition() && style.ClipLeft().IsZero() &&
+        style.ClipRight().IsZero() && style.ClipTop().IsZero() &&
+        style.ClipBottom().IsZero())
+      return;
+
+    double actual_font_size = style.FontSize();
     double initial_scale = frame_view_->GetPage()
                                ->GetPageScaleConstraintsSet()
                                .FinalConstraints()
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
index ae28775..4c40f7e 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -342,6 +342,17 @@
   EXPECT_EQ(actual_mf.small_text_ratio, 100);
 }
 
+TEST_F(MobileFriendlinessCheckerTest, OnlySmallFontsClipped) {
+  MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
+<html>
+  <body style="font-size: 6px; clip: rect(0 0 0 0); position: absolute">
+    Small font text.
+  </body>
+</html>
+)");
+  EXPECT_EQ(actual_mf.small_text_ratio, 0);
+}
+
 TEST_F(MobileFriendlinessCheckerTest, TextNarrow) {
   MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
 <html>
diff --git a/third_party/blink/renderer/core/page/plugin_data.cc b/third_party/blink/renderer/core/page/plugin_data.cc
index bb4f801b..c5f0d9c 100644
--- a/third_party/blink/renderer/core/page/plugin_data.cc
+++ b/third_party/blink/renderer/core/page/plugin_data.cc
@@ -23,6 +23,7 @@
 
 #include "third_party/blink/renderer/core/page/plugin_data.h"
 
+#include "base/metrics/histogram_macros.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/plugins/plugin_registry.mojom-blink.h"
@@ -99,6 +100,7 @@
 }
 
 void PluginData::UpdatePluginList(const SecurityOrigin* main_frame_origin) {
+  SCOPED_UMA_HISTOGRAM_TIMER("Blink.Plugin.UpdateTime");
   ResetPluginData();
   main_frame_origin_ = main_frame_origin;
 
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.cc b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
index c744e2a5..8b1778b7 100644
--- a/third_party/blink/renderer/core/paint/cull_rect_updater.cc
+++ b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
@@ -92,13 +92,27 @@
   // This defines the scope of force_proactive_update_ (which may be set by
   // ComputeFragmentCullRect() and ComputeFragmentContentsCullRect()) to the
   // subtree.
-  base::AutoReset<bool> reset(&force_proactive_update_,
-                              force_proactive_update_);
+  base::AutoReset<bool> reset_force_update(&force_proactive_update_,
+                                           force_proactive_update_);
 
   if (force_update_self || should_proactively_update ||
       layer.NeedsCullRectUpdate())
     force_update_children |= UpdateForSelf(layer, parent_painting_layer);
 
+  absl::optional<base::AutoReset<bool>> reset_subtree_is_out_of_cull_rect;
+  if (!subtree_is_out_of_cull_rect_ && layer.KnownToClipSubtree() &&
+      !layer.GetLayoutObject().FirstFragment().NextFragment()) {
+    const auto* box = layer.GetLayoutBox();
+    DCHECK(box);
+    PhysicalRect overflow_rect = box->PhysicalSelfVisualOverflowRect();
+    overflow_rect.Move(box->FirstFragment().PaintOffset());
+    if (!box->FirstFragment().GetCullRect().Intersects(
+            EnclosingIntRect(overflow_rect))) {
+      reset_subtree_is_out_of_cull_rect.emplace(&subtree_is_out_of_cull_rect_,
+                                                true);
+    }
+  }
+
   if (force_update_children || layer.DescendantNeedsCullRectUpdate())
     UpdateForDescendants(layer, force_update_children);
 
@@ -189,30 +203,40 @@
       is_fragmented && parent_painting_layer.EnclosingPaginationLayer() ==
                            layer.EnclosingPaginationLayer();
   bool force_update_children = false;
+  bool should_use_infinite_cull_rect =
+      !subtree_is_out_of_cull_rect_ &&
+      PaintLayerPainter(layer).ShouldUseInfiniteCullRect();
 
   for (auto* fragment = &first_fragment; fragment;
        fragment = fragment->NextFragment()) {
-    const FragmentData* parent_fragment = nullptr;
-    if (should_match_fragments) {
-      for (parent_fragment = &first_parent_fragment; parent_fragment;
-           parent_fragment = parent_fragment->NextFragment()) {
-        if (parent_fragment->FragmentID() == fragment->FragmentID())
-          break;
-      }
-    } else {
-      parent_fragment = &first_parent_fragment;
-    }
-
     CullRect cull_rect;
     CullRect contents_cull_rect;
-    if (!parent_fragment ||
-        PaintLayerPainter(layer).ShouldUseInfiniteCullRect()) {
-      cull_rect = CullRect::Infinite();
-      contents_cull_rect = CullRect::Infinite();
+    if (subtree_is_out_of_cull_rect_) {
+      // PaintLayerPainter may skip the subtree including this layer, so we
+      // need to SetPreviousPaintResult() here.
+      layer.SetPreviousPaintResult(kMayBeClippedByCullRect);
     } else {
-      cull_rect = ComputeFragmentCullRect(layer, *fragment, *parent_fragment);
-      contents_cull_rect =
-          ComputeFragmentContentsCullRect(layer, *fragment, cull_rect);
+      const FragmentData* parent_fragment = nullptr;
+      if (!should_use_infinite_cull_rect) {
+        if (should_match_fragments) {
+          for (parent_fragment = &first_parent_fragment; parent_fragment;
+               parent_fragment = parent_fragment->NextFragment()) {
+            if (parent_fragment->FragmentID() == fragment->FragmentID())
+              break;
+          }
+        } else {
+          parent_fragment = &first_parent_fragment;
+        }
+      }
+
+      if (should_use_infinite_cull_rect || !parent_fragment) {
+        cull_rect = CullRect::Infinite();
+        contents_cull_rect = CullRect::Infinite();
+      } else {
+        cull_rect = ComputeFragmentCullRect(layer, *fragment, *parent_fragment);
+        contents_cull_rect =
+            ComputeFragmentContentsCullRect(layer, *fragment, cull_rect);
+      }
     }
 
     SetFragmentCullRect(layer, *fragment, cull_rect);
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.h b/third_party/blink/renderer/core/paint/cull_rect_updater.h
index 1ab2092..8789906 100644
--- a/third_party/blink/renderer/core/paint/cull_rect_updater.h
+++ b/third_party/blink/renderer/core/paint/cull_rect_updater.h
@@ -54,6 +54,7 @@
   PaintLayer& starting_layer_;
   PropertyTreeState root_state_ = PropertyTreeState::Uninitialized();
   bool force_proactive_update_ = false;
+  bool subtree_is_out_of_cull_rect_ = false;
 };
 
 // Used when painting with a custom top-level cull rect, e.g. when printing a
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index ed3f5f1..f2a33e8 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2899,19 +2899,11 @@
   if (!HasSelfPaintingLayerDescendant())
     return;
 
-  if (const auto* box = GetLayoutBox()) {
-    // If the layer clips overflow and all descendants are contained, then no
-    // need to expand for children. Not checking kIncludeAncestorClips because
-    // the clip of the current layer is always applied. The doesn't check
-    // whether the non-contained descendants are actual descendants of this
-    // layer in paint order because it's not easy.
-    if (box->ShouldClipOverflowAlongBothAxis() &&
-        !HasNonContainedAbsolutePositionDescendant() &&
-        !(HasFixedPositionDescendant() &&
-          !box->CanContainFixedPositionObjects())) {
-      return;
-    }
-  }
+  // If the layer is known to clip the whole subtree, then we don't need to
+  // expand for children. Not checking kIncludeAncestorClips because the clip of
+  // the current layer is always applied.
+  if (KnownToClipSubtree())
+    return;
 
   PaintLayerPaintOrderIterator iterator(*this, kAllChildren);
   while (PaintLayer* child_layer = iterator.Next()) {
@@ -2928,6 +2920,22 @@
   }
 }
 
+bool PaintLayer::KnownToClipSubtree() const {
+  if (const auto* box = GetLayoutBox()) {
+    if (!box->ShouldClipOverflowAlongBothAxis())
+      return false;
+    if (HasNonContainedAbsolutePositionDescendant())
+      return false;
+    if (HasFixedPositionDescendant() && !box->CanContainFixedPositionObjects())
+      return false;
+    // The root frame's clip is special at least in Android WebView.
+    if (is_root_layer_ && box->GetFrame()->IsLocalRoot())
+      return false;
+    return true;
+  }
+  return false;
+}
+
 PhysicalRect PaintLayer::BoundingBoxForCompositing() const {
   return BoundingBoxForCompositingInternal(
       *this, nullptr,
diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h
index 559f118..9214582 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.h
+++ b/third_party/blink/renderer/core/paint/paint_layer.h
@@ -1160,6 +1160,8 @@
     needs_paint_offset_translation_for_compositing_ = b;
   }
 
+  bool KnownToClipSubtree() const;
+
  private:
   PhysicalRect LocalBoundingBoxForCompositingOverlapTest() const;
   bool PaintsWithDirectReasonIntoOwnBacking(GlobalPaintFlags) const;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
index e9dc364..193ca61 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -452,8 +452,14 @@
         cull_rect_intersects_contents = cull_rect_intersects_self;
       }
 
-      if (!cull_rect_intersects_self && !cull_rect_intersects_contents)
+      if (!cull_rect_intersects_self && !cull_rect_intersects_contents) {
+        if (!is_painting_overflow_contents &&
+            paint_layer_.KnownToClipSubtree()) {
+          paint_layer_.SetPreviousPaintResult(kMayBeClippedByCullRect);
+          return kMayBeClippedByCullRect;
+        }
         should_paint_content = false;
+      }
 
       // The above doesn't consider clips on non-self-painting contents.
       // Will update in ScopedBoxContentsPaintState.
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
index b17d4d3..6fd5237 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -1093,28 +1093,25 @@
         fragment = nullptr;
         context.oof_container_candidate_fragment = nullptr;
       }
-    } else {
-      // There may be fragment-less objects, such as table columns or table
-      // column groups.
-      if (box->CanTraversePhysicalFragments() && box->PhysicalFragmentCount()) {
-        // Enter LayoutNGBoxFragment-accompanied child LayoutObject traversal.
-        // We'll stay in this mode for all descendants that support fragment
-        // traversal. We'll re-enter legacy traversal for descendants that don't
-        // support it. This only works correctly if we're not block-fragmented,
-        // though, so DCHECK for that.
-        //
-        // TODO(mstensho): Before shipping LayoutNGFragmentTraversal: Only enter
-        // this mode at block fragmentation roots (multicol containers), as
-        // LayoutNGBoxFragment-accompanied child LayoutObject traversal is more
-        // expensive than pure LayoutObject traversal: we need to search for
-        // each object among child fragments (NGLink) to find the offset, also
-        // when not fragmented at all. For now, though enter this mode as often
-        // as we can, for increased test coverage (when running with
-        // LayoutNGFragmentTraversal enabled).
-        DCHECK_EQ(box->PhysicalFragmentCount(), 1u);
-        fragment = To<NGPhysicalBoxFragment>(box->GetPhysicalFragment(0));
-        DCHECK(!fragment->BreakToken());
-      }
+    } else if (box->PhysicalFragmentCount()) {
+      // Enter LayoutNGBoxFragment-accompanied child LayoutObject traversal if
+      // we're at an NG fragmentation context root. While we in theory *could*
+      // enter this mode for any object that has a traversable fragment, without
+      // affecting correctness, we're better off with plain LayoutObject
+      // traversal when possible, as fragment-accompanied traversal has O(n^2)
+      // performance complexity (where n is the number of siblings).
+      //
+      // We'll stay in this mode for all descendants that support fragment
+      // traversal. We'll re-enter legacy traversal for descendants that don't
+      // support it. This only works correctly as long as there's no block
+      // fragmentation in the ancestry, though, so DCHECK for that.
+      DCHECK_EQ(box->PhysicalFragmentCount(), 1u);
+      const auto* first_fragment =
+          To<NGPhysicalBoxFragment>(box->GetPhysicalFragment(0));
+      DCHECK(!first_fragment->BreakToken());
+      if (first_fragment->IsFragmentationContextRoot() &&
+          box->CanTraversePhysicalFragments())
+        fragment = first_fragment;
     }
 
     // Inline-contained OOFs are placed in the containing block of the
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
index 99e7ff54..2089cb1 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
@@ -260,7 +260,6 @@
 // href="https://html.spec.whatwg.org/C/#hostimportmoduledynamically(referencingscriptormodule,-specifier,-promisecapability)">
 void DynamicModuleResolver::ResolveDynamically(
     const ModuleRequest& module_request,
-    const KURL& referrer_resource_url,
     const ReferrerScriptInfo& referrer_info,
     ScriptPromiseResolver* promise_resolver) {
   DCHECK(modulator_->GetScriptState()->GetIsolate()->InContext())
@@ -273,11 +272,6 @@
   // <spec step="4.3">Set base URL to referencing script's base URL.</spec>
   KURL base_url = referrer_info.BaseURL();
   if (base_url.IsNull()) {
-    // ReferrerScriptInfo::BaseURL returns null if it should defer to referrer
-    // resource url.
-    base_url = referrer_resource_url;
-  }
-  if (base_url.IsNull()) {
     // The case where "referencing script" doesn't exist.
     //
     // <spec step="1">Let settings object be the current settings object.</spec>
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver.h b/third_party/blink/renderer/core/script/dynamic_module_resolver.h
index 1c8bd2c..0a1c646d 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver.h
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver.h
@@ -32,7 +32,6 @@
   // Implements "HostImportModuleDynamically" semantics.
   // Should be called w/ a valid V8 context.
   void ResolveDynamically(const ModuleRequest& module_request,
-                          const KURL& referrer_resource_url,
                           const ReferrerScriptInfo& referrer_info,
                           ScriptPromiseResolver*);
 
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
index 42beb0e..ad590e0 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
@@ -39,6 +39,9 @@
 const KURL TestDependencyURLJSON() {
   return KURL(kTestDependencyURLJSON);
 }
+ReferrerScriptInfo TestReferrerScriptInfo() {
+  return ReferrerScriptInfo(TestReferrerURL(), ScriptFetchOptions());
+}
 
 class DynamicModuleResolverTestModulator final : public DummyModulator {
  public:
@@ -241,8 +244,8 @@
   ModuleRequest module_request("./dependency.js",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
   EXPECT_FALSE(capture->WasCalled());
@@ -277,8 +280,8 @@
       ImportAssertion("type", "json", TextPosition::MinimumPosition())};
   ModuleRequest module_request(
       "./dependency.json", TextPosition::MinimumPosition(), import_assertions);
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   // Instantiating and evaluating a JSON module requires a lot of
   // machinery not currently available in this unit test suite. For
@@ -308,8 +311,8 @@
   ModuleRequest module_request("invalid-specifier",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
   EXPECT_TRUE(capture->WasCalled());
@@ -338,8 +341,8 @@
       ImportAssertion("type", "notARealType", TextPosition::MinimumPosition())};
   ModuleRequest module_request(
       "./dependency.js", TextPosition::MinimumPosition(), import_assertions);
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
   EXPECT_TRUE(capture->WasCalled());
@@ -367,8 +370,8 @@
   ModuleRequest module_request("./dependency.js",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   EXPECT_FALSE(capture->WasCalled());
 
@@ -400,8 +403,8 @@
   ModuleRequest module_request("./dependency.js",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
-  resolver->ResolveDynamically(module_request, TestReferrerURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, TestReferrerScriptInfo(),
+                               promise_resolver);
 
   EXPECT_FALSE(capture->WasCalled());
 
@@ -442,8 +445,8 @@
   ModuleRequest module_request("./dependency.js",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
-  resolver->ResolveDynamically(module_request, /* null referrer */ KURL(),
-                               ReferrerScriptInfo(), promise_resolver);
+  resolver->ResolveDynamically(module_request, ReferrerScriptInfo(),
+                               promise_resolver);
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
   EXPECT_FALSE(capture->WasCalled());
@@ -475,13 +478,12 @@
   auto* promise_resolver =
       MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState());
   auto* resolver = MakeGarbageCollected<DynamicModuleResolver>(modulator);
-  KURL wrong_base_url("https://example.com/wrong/bar.js");
   KURL correct_base_url("https://example.com/correct/baz.js");
   ModuleRequest module_request("./dependency.js",
                                TextPosition::MinimumPosition(),
                                Vector<ImportAssertion>());
   resolver->ResolveDynamically(
-      module_request, wrong_base_url,
+      module_request,
       ReferrerScriptInfo(correct_base_url, ScriptFetchOptions()),
       promise_resolver);
 
diff --git a/third_party/blink/renderer/core/script/modulator.h b/third_party/blink/renderer/core/script/modulator.h
index 5341736..c4dd3de 100644
--- a/third_party/blink/renderer/core/script/modulator.h
+++ b/third_party/blink/renderer/core/script/modulator.h
@@ -174,7 +174,6 @@
 
   // https://tc39.github.io/proposal-dynamic-import/#sec-hostimportmoduledynamically
   virtual void ResolveDynamically(const ModuleRequest& module_request,
-                                  const KURL&,
                                   const ReferrerScriptInfo&,
                                   ScriptPromiseResolver*) = 0;
 
diff --git a/third_party/blink/renderer/core/script/modulator_impl_base.cc b/third_party/blink/renderer/core/script/modulator_impl_base.cc
index 3438b2d..315904e7 100644
--- a/third_party/blink/renderer/core/script/modulator_impl_base.cc
+++ b/third_party/blink/renderer/core/script/modulator_impl_base.cc
@@ -221,7 +221,6 @@
 
 void ModulatorImplBase::ResolveDynamically(
     const ModuleRequest& module_request,
-    const KURL& referrer_url,
     const ReferrerScriptInfo& referrer_info,
     ScriptPromiseResolver* resolver) {
   String reason;
@@ -232,8 +231,8 @@
   }
   UseCounter::Count(GetExecutionContext(),
                     WebFeature::kDynamicImportModuleScript);
-  dynamic_module_resolver_->ResolveDynamically(module_request, referrer_url,
-                                               referrer_info, resolver);
+  dynamic_module_resolver_->ResolveDynamically(module_request, referrer_info,
+                                               resolver);
 }
 
 // <specdef href="https://html.spec.whatwg.org/C/#hostgetimportmetaproperties">
diff --git a/third_party/blink/renderer/core/script/modulator_impl_base.h b/third_party/blink/renderer/core/script/modulator_impl_base.h
index 719166fe..a8c54af 100644
--- a/third_party/blink/renderer/core/script/modulator_impl_base.h
+++ b/third_party/blink/renderer/core/script/modulator_impl_base.h
@@ -76,7 +76,6 @@
                               const KURL& base_url,
                               String* failure_reason) final;
   void ResolveDynamically(const ModuleRequest& module_request,
-                          const KURL&,
                           const ReferrerScriptInfo&,
                           ScriptPromiseResolver*) override;
   const ImportMap* GetImportMapForTest() const final { return import_map_; }
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.cc b/third_party/blink/renderer/core/testing/dummy_modulator.cc
index 5e7988fc..e55a1961 100644
--- a/third_party/blink/renderer/core/testing/dummy_modulator.cc
+++ b/third_party/blink/renderer/core/testing/dummy_modulator.cc
@@ -115,7 +115,6 @@
 }
 
 void DummyModulator::ResolveDynamically(const ModuleRequest& module_request,
-                                        const KURL&,
                                         const ReferrerScriptInfo&,
                                         ScriptPromiseResolver*) {
   NOTREACHED();
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.h b/third_party/blink/renderer/core/testing/dummy_modulator.h
index c72a538..0800162 100644
--- a/third_party/blink/renderer/core/testing/dummy_modulator.h
+++ b/third_party/blink/renderer/core/testing/dummy_modulator.h
@@ -60,7 +60,6 @@
   KURL ResolveModuleSpecifier(const String&, const KURL&, String*) override;
   bool HasValidContext() override;
   void ResolveDynamically(const ModuleRequest& module_request,
-                          const KURL&,
                           const ReferrerScriptInfo&,
                           ScriptPromiseResolver*) override;
   ScriptValue CreateTypeError(const String& message) const override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 3ff05f3..3b721c7 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -30,6 +30,7 @@
 
 #include <math.h>
 #include <memory>
+#include <queue>
 
 #include <algorithm>
 
@@ -3510,13 +3511,13 @@
 //
 
 void AXNodeObject::LoadInlineTextBoxes() {
-  std::queue<Member<AXObject>> work_queue;
-  work_queue.push(this);
+  std::queue<AXID> work_queue;
+  work_queue.push(AXObjectID());
 
   while (!work_queue.empty()) {
-    AXObject* work_obj = work_queue.front();
+    AXObject* work_obj = AXObjectCache().ObjectFromAXID(work_queue.front());
     work_queue.pop();
-    if (!work_obj->AccessibilityIsIncludedInTree())
+    if (!work_obj || !work_obj->AccessibilityIsIncludedInTree())
       continue;
 
     if (ui::CanHaveInlineTextBoxChildren(work_obj->RoleValue())) {
@@ -3530,7 +3531,7 @@
       }
     } else {
       for (const auto& child : work_obj->ChildrenIncludingIgnored())
-        work_queue.push(child);
+        work_queue.push(child->AXObjectID());
     }
   }
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 487bb8e36..13ce764 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -2877,7 +2877,7 @@
     case ax::mojom::blink::Role::kColumnHeader:
     case ax::mojom::blink::Role::kRowHeader:
     case ax::mojom::blink::Role::kColumn:
-    case ax::mojom::blink::Role::kRow:
+    case ax::mojom::blink::Role::kRow: {
       // If it has an explicit ARIA role, it's a subwidget.
       //
       // Reasoning:
@@ -2896,13 +2896,14 @@
 
       // Otherwise it's only a subwidget if it's in a grid or treegrid,
       // not in a table.
-      return std::any_of(
+      AncestorsIterator ancestor = std::find_if(
           UnignoredAncestorsBegin(), UnignoredAncestorsEnd(),
-          [](const AXObject& ancestor) {
-            return ancestor.RoleValue() == ax::mojom::blink::Role::kGrid ||
-                   ancestor.RoleValue() == ax::mojom::blink::Role::kTreeGrid;
-          });
-
+          [](const AXObject& ancestor) { return ancestor.IsTableLikeRole(); });
+      return ancestor.current_ &&
+             (ancestor.current_->RoleValue() == ax::mojom::blink::Role::kGrid ||
+              ancestor.current_->RoleValue() ==
+                  ax::mojom::blink::Role::kTreeGrid);
+    }
     case ax::mojom::blink::Role::kListBoxOption:
     case ax::mojom::blink::Role::kMenuListOption:
     case ax::mojom::blink::Role::kTab:
@@ -2914,6 +2915,13 @@
 }
 
 bool AXObject::SupportsARIASetSizeAndPosInSet() const {
+  if (RoleValue() == ax::mojom::blink::Role::kRow) {
+    AncestorsIterator ancestor = std::find_if(
+        UnignoredAncestorsBegin(), UnignoredAncestorsEnd(),
+        [](const AXObject& ancestor) { return ancestor.IsTableLikeRole(); });
+    return ancestor.current_ &&
+           ancestor.current_->RoleValue() == ax::mojom::blink::Role::kTreeGrid;
+  }
   return ui::IsSetLike(RoleValue()) || ui::IsItemLike(RoleValue());
 }
 
@@ -5549,12 +5557,13 @@
 
   if (ui::IsCellOrTableHeader(RoleValue())) {
     // For cells and row/column headers, readonly is supported within a grid.
-    return std::any_of(
+    AncestorsIterator ancestor = std::find_if(
         UnignoredAncestorsBegin(), UnignoredAncestorsEnd(),
-        [](const AXObject& ancestor) {
-          return ancestor.RoleValue() == ax::mojom::blink::Role::kGrid ||
-                 ancestor.RoleValue() == ax::mojom::blink::Role::kTreeGrid;
-        });
+        [](const AXObject& ancestor) { return ancestor.IsTableLikeRole(); });
+    return ancestor.current_ &&
+           (ancestor.current_->RoleValue() == ax::mojom::blink::Role::kGrid ||
+            ancestor.current_->RoleValue() ==
+                ax::mojom::blink::Role::kTreeGrid);
   }
 
   return false;
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
index 27cbad1..57ecd929 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
@@ -558,7 +558,7 @@
     mojom::blink::WebBluetoothDevicePtr device_ptr,
     ExecutionContext* context) {
   String& id = device_ptr->id;
-  BluetoothDevice* device = device_instance_map_.at(id);
+  BluetoothDevice* device = device_instance_map_.DeprecatedAtOrEmptyValue(id);
   if (!device) {
     device = MakeGarbageCollected<BluetoothDevice>(context,
                                                    std::move(device_ptr), this);
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_pending_generator_registry.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_pending_generator_registry.cc
index 8bf6336..5ee216ff8 100644
--- a/third_party/blink/renderer/modules/csspaint/paint_worklet_pending_generator_registry.cc
+++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_pending_generator_registry.cc
@@ -10,7 +10,7 @@
 
 void PaintWorkletPendingGeneratorRegistry::NotifyGeneratorReady(
     const String& name) {
-  GeneratorHashSet* set = pending_generators_.at(name);
+  GeneratorHashSet* set = pending_generators_.DeprecatedAtOrEmptyValue(name);
   if (set) {
     for (const auto& generator : *set) {
       if (generator)
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h
index 6d5fc40..5b48175 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_file_delegate.h
@@ -55,11 +55,12 @@
   virtual void SetLength(int64_t length,
                          base::OnceCallback<void(bool)> callback) = 0;
 
-  // Instructs the filesystem to flush the file to disk.
-  virtual bool Flush() = 0;
+  // Asynchronously instructs the filesystem to flush the file to disk.
+  virtual void Flush(base::OnceCallback<void(bool)> callback) = 0;
 
-  // Close the file. Destroying this object will close the file automatically.
-  virtual void Close() = 0;
+  // Asynchronously close the file. Destroying this object will close the file
+  // automatically.
+  virtual void Close(base::OnceClosure callback) = 0;
 
   // Returns |true| if the file handle wrapped by this object is valid.
   virtual bool IsValid() const = 0;
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
index 0173f27..e1bf42c 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
@@ -179,15 +179,23 @@
   mojo_ptr_->SetLength(length, WTF::Bind(std::move(callback)));
 }
 
-bool FileSystemAccessIncognitoFileDelegate::Flush() {
-  // TODO(crbug.com/1225653): Implement this method.
-  NOTIMPLEMENTED();
-  return false;
+void FileSystemAccessIncognitoFileDelegate::Flush(
+    base::OnceCallback<void(bool)> callback) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  // Flush is a no-op for in-memory file systems. Even if the file delegate is
+  // used for other FS types, writes through the FileSystemOperationRunner are
+  // automatically flushed. If this proves to be too slow, we can consider
+  // changing the FileSystemAccessFileDelegateHostImpl to write with a
+  // FileStreamWriter and only flushing when this method is called.
+  task_runner_->PostTask(FROM_HERE,
+                         WTF::Bind(std::move(callback), /*success=*/true));
 }
 
-void FileSystemAccessIncognitoFileDelegate::Close() {
-  // TODO(crbug.com/1225653): Implement this method.
-  NOTIMPLEMENTED();
+void FileSystemAccessIncognitoFileDelegate::Close(base::OnceClosure callback) {
+  mojo_ptr_.reset();
+
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  task_runner_->PostTask(FROM_HERE, std::move(callback));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h
index f0caeef1..537c0833 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.h
@@ -42,8 +42,8 @@
       base::OnceCallback<void(FileErrorOr<int64_t>)> callback) override;
   void SetLength(int64_t length, base::OnceCallback<void(bool)>) override;
 
-  bool Flush() override;
-  void Close() override;
+  void Flush(base::OnceCallback<void(bool)> callback) override;
+  void Close(base::OnceClosure callback) override;
 
   bool IsValid() const override { return mojo_ptr_.is_bound(); }
 
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
index 2ce9b3fb..6329d84 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
@@ -122,12 +122,47 @@
       CrossThreadBindOnce(std::move(wrapped_callback), std::move(result)));
 }
 
-bool FileSystemAccessRegularFileDelegate::Flush() {
-  return backing_file_.Flush();
+void FileSystemAccessRegularFileDelegate::Flush(
+    base::OnceCallback<void(bool)> callback) {
+  auto wrapped_callback =
+      CrossThreadOnceFunction<void(bool)>(std::move(callback));
+
+  // Flush file on a worker thread and reply back to this sequence.
+  worker_pool::PostTask(
+      FROM_HERE, {base::MayBlock()},
+      CrossThreadBindOnce(&FileSystemAccessRegularFileDelegate::DoFlush,
+                          WrapCrossThreadPersistent(this),
+                          std::move(wrapped_callback), task_runner_));
 }
 
-void FileSystemAccessRegularFileDelegate::Close() {
-  backing_file_.Close();
+// static
+void FileSystemAccessRegularFileDelegate::DoFlush(
+    CrossThreadPersistent<FileSystemAccessRegularFileDelegate> delegate,
+    CrossThreadOnceFunction<void(bool)> wrapped_callback,
+    scoped_refptr<base::SequencedTaskRunner> task_runner) {
+  bool result = delegate->backing_file_.Flush();
+  PostCrossThreadTask(*task_runner, FROM_HERE,
+                      CrossThreadBindOnce(std::move(wrapped_callback), result));
+}
+
+void FileSystemAccessRegularFileDelegate::Close(base::OnceClosure callback) {
+  auto wrapped_callback = CrossThreadOnceClosure(std::move(callback));
+
+  // Close file on a worker thread and reply back to this sequence.
+  worker_pool::PostTask(
+      FROM_HERE, {base::MayBlock()},
+      CrossThreadBindOnce(&FileSystemAccessRegularFileDelegate::DoClose,
+                          WrapCrossThreadPersistent(this),
+                          std::move(wrapped_callback), task_runner_));
+}
+
+// static
+void FileSystemAccessRegularFileDelegate::DoClose(
+    CrossThreadPersistent<FileSystemAccessRegularFileDelegate> delegate,
+    CrossThreadOnceClosure wrapped_callback,
+    scoped_refptr<base::SequencedTaskRunner> task_runner) {
+  delegate->backing_file_.Close();
+  PostCrossThreadTask(*task_runner, FROM_HERE, std::move(wrapped_callback));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h
index 76152e43..15fdc45 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.h
@@ -41,8 +41,8 @@
   void SetLength(int64_t length,
                  base::OnceCallback<void(bool)> callback) override;
 
-  bool Flush() override;
-  void Close() override;
+  void Flush(base::OnceCallback<void(bool)> callback) override;
+  void Close(base::OnceClosure callback) override;
 
   bool IsValid() const override { return backing_file_.IsValid(); }
 
@@ -56,6 +56,14 @@
       CrossThreadOnceFunction<void(bool)> wrapped_callback,
       scoped_refptr<base::SequencedTaskRunner> task_runner,
       int64_t length);
+  static void DoFlush(
+      CrossThreadPersistent<FileSystemAccessRegularFileDelegate> delegate,
+      CrossThreadOnceFunction<void(bool)> wrapped_callback,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
+  static void DoClose(
+      CrossThreadPersistent<FileSystemAccessRegularFileDelegate> delegate,
+      CrossThreadOnceClosure wrapped_callback,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   // The file on disk backing the parent FileSystemFileHandle.
   base::File backing_file_;
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
index 2861bac..a8f2516 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
@@ -77,38 +77,24 @@
   ScriptPromiseResolver* resolver = queued_close_resolver_;
   queued_close_resolver_ = nullptr;
 
-  worker_pool::PostTask(
-      FROM_HERE, {base::MayBlock()},
-      CrossThreadBindOnce(&DoClose, WrapCrossThreadPersistent(this),
-                          WrapCrossThreadPersistent(resolver),
-                          resolver_task_runner_));
-}
-
-// static
-void FileSystemSyncAccessHandle::DoClose(
-    CrossThreadPersistent<FileSystemSyncAccessHandle> access_handle,
-    CrossThreadPersistent<ScriptPromiseResolver> resolver,
-    scoped_refptr<base::SequencedTaskRunner> resolver_task_runner) {
-  DCHECK(access_handle->file_delegate_->IsValid())
+  // Access file delegate directly rather than through accessor method, which
+  // checks `io_pending_`.
+  DCHECK(file_delegate_->IsValid())
       << "file I/O operation queued after file closed";
-  access_handle->file_delegate_->Close();
 
-  PostCrossThreadTask(
-      *resolver_task_runner, FROM_HERE,
-      CrossThreadBindOnce(&FileSystemSyncAccessHandle::DidClose,
-                          std::move(access_handle), std::move(resolver)));
-}
+  file_delegate_->Close(WTF::Bind(
+      [](ScriptPromiseResolver* resolver,
+         FileSystemSyncAccessHandle* access_handle) {
+        ScriptState* script_state = resolver->GetScriptState();
+        if (!script_state->ContextIsValid())
+          return;
+        ScriptState::Scope scope(script_state);
 
-void FileSystemSyncAccessHandle::DidClose(
-    CrossThreadPersistent<ScriptPromiseResolver> resolver) {
-  ScriptState* script_state = resolver->GetScriptState();
-  if (!script_state->ContextIsValid())
-    return;
-  ScriptState::Scope scope(script_state);
-
-  access_handle_remote_->Close(
-      WTF::Bind([](ScriptPromiseResolver* resolver) { resolver->Resolve(); },
-                std::move(resolver)));
+        access_handle->access_handle_remote_->Close(WTF::Bind(
+            [](ScriptPromiseResolver* resolver) { resolver->Resolve(); },
+            WrapPersistent(resolver)));
+      },
+      WrapPersistent(resolver), WrapPersistent(this)));
 }
 
 ScriptPromise FileSystemSyncAccessHandle::flush(
@@ -128,47 +114,31 @@
   }
 
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  worker_pool::PostTask(
-      FROM_HERE, {base::MayBlock()},
-      CrossThreadBindOnce(&DoFlush, WrapCrossThreadPersistent(this),
-                          WrapCrossThreadPersistent(resolver),
-                          resolver_task_runner_));
-  return resolver->Promise();
-}
+  ScriptPromise result = resolver->Promise();
 
-// static
-void FileSystemSyncAccessHandle::DoFlush(
-    CrossThreadPersistent<FileSystemSyncAccessHandle> access_handle,
-    CrossThreadPersistent<ScriptPromiseResolver> resolver,
-    scoped_refptr<base::SequencedTaskRunner> resolver_task_runner) {
-  DCHECK(!IsMainThread()) << "File I/O should not happen on the main thread";
-
-  DCHECK(access_handle->file_delegate()->IsValid())
+  DCHECK(file_delegate()->IsValid())
       << "file I/O operation queued after file closed";
-  bool success = access_handle->file_delegate()->Flush();
 
-  PostCrossThreadTask(*resolver_task_runner, FROM_HERE,
-                      CrossThreadBindOnce(&FileSystemSyncAccessHandle::DidFlush,
-                                          std::move(access_handle),
-                                          std::move(resolver), success));
-}
+  file_delegate()->Flush(WTF::Bind(WTF::Bind(
+      [](ScriptPromiseResolver* resolver,
+         FileSystemSyncAccessHandle* access_handle, bool success) {
+        ScriptState* script_state = resolver->GetScriptState();
+        if (!script_state->ContextIsValid())
+          return;
+        ScriptState::Scope scope(script_state);
 
-void FileSystemSyncAccessHandle::DidFlush(
-    CrossThreadPersistent<ScriptPromiseResolver> resolver,
-    bool success) {
-  ScriptState* script_state = resolver->GetScriptState();
-  if (!script_state->ContextIsValid())
-    return;
-  ScriptState::Scope scope(script_state);
+        access_handle->ExitOperation();
+        if (!success) {
+          resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+              script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError,
+              "flush failed"));
+          return;
+        }
+        resolver->Resolve();
+      },
+      WrapPersistent(resolver), WrapPersistent(this))));
 
-  ExitOperation();
-  if (!success) {
-    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-        script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError,
-        "Flush failed"));
-    return;
-  }
-  resolver->Resolve();
+  return result;
 }
 
 ScriptPromise FileSystemSyncAccessHandle::getSize(
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h
index 3c42bc0..46b6a4c 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.h
@@ -57,25 +57,6 @@
  private:
   void DispatchQueuedClose();
 
-  // Performs the file I/O part of close().
-  static void DoClose(
-      CrossThreadPersistent<FileSystemSyncAccessHandle> access_handle,
-      CrossThreadPersistent<ScriptPromiseResolver> resolver,
-      scoped_refptr<base::SequencedTaskRunner> file_task_runner);
-
-  // Performs the post file-I/O part of close(), on the foreground thread.
-  void DidClose(CrossThreadPersistent<ScriptPromiseResolver> resolver);
-
-  // Performs the file I/O part of flush().
-  static void DoFlush(
-      CrossThreadPersistent<FileSystemSyncAccessHandle> access_handle,
-      CrossThreadPersistent<ScriptPromiseResolver> resolver,
-      scoped_refptr<base::SequencedTaskRunner> file_task_runner);
-
-  // Performs the post file-I/O part of flush(), on the foreground thread.
-  void DidFlush(CrossThreadPersistent<ScriptPromiseResolver> resolver,
-                bool success);
-
   bool EnterOperation() {
     if (io_pending_)
       return false;
diff --git a/third_party/blink/renderer/modules/hid/hid.cc b/third_party/blink/renderer/modules/hid/hid.cc
index f5a0c171..cf608c8 100644
--- a/third_party/blink/renderer/modules/hid/hid.cc
+++ b/third_party/blink/renderer/modules/hid/hid.cc
@@ -153,7 +153,7 @@
 }
 
 void HID::DeviceChanged(device::mojom::blink::HidDeviceInfoPtr device_info) {
-  auto* device = device_cache_.at(device_info->guid);
+  auto* device = device_cache_.DeprecatedAtOrEmptyValue(device_info->guid);
   if (!device) {
     // If the GUID is not in the |device_cache_| then this is the first time we
     // have been notified for this device.
@@ -245,7 +245,7 @@
 
 HIDDevice* HID::GetOrCreateDevice(device::mojom::blink::HidDeviceInfoPtr info) {
   const String guid = info->guid;
-  HIDDevice* device = device_cache_.at(guid);
+  HIDDevice* device = device_cache_.DeprecatedAtOrEmptyValue(guid);
   if (!device) {
     device = MakeGarbageCollected<HIDDevice>(this, std::move(info),
                                              GetExecutionContext());
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc
index e753844..6ac4370 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -1553,6 +1553,10 @@
       not_supported_for_invalid_origin_or_ssl_error_ = error_message;
       break;
 
+    case PaymentErrorReason::NOT_ALLOWED_ERROR:
+      exception_code = DOMExceptionCode::kNotAllowedError;
+      break;
+
     case PaymentErrorReason::UNKNOWN:
       break;
   }
diff --git a/third_party/blink/renderer/modules/serial/serial.cc b/third_party/blink/renderer/modules/serial/serial.cc
index 5d9dfb8..038272c 100644
--- a/third_party/blink/renderer/modules/serial/serial.cc
+++ b/third_party/blink/renderer/modules/serial/serial.cc
@@ -246,7 +246,8 @@
 }
 
 SerialPort* Serial::GetOrCreatePort(mojom::blink::SerialPortInfoPtr info) {
-  SerialPort* port = port_cache_.at(TokenToString(info->token));
+  SerialPort* port =
+      port_cache_.DeprecatedAtOrEmptyValue(TokenToString(info->token));
   if (!port) {
     port = MakeGarbageCollected<SerialPort>(this, std::move(info));
     port_cache_.insert(TokenToString(port->token()), port);
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
index b035e94..0ef02bf 100644
--- a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
+++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
@@ -317,6 +317,7 @@
       std::move(encoded_buffer.encoded_data), encoded_buffer.encoded_data_size);
   buffer->set_timestamp(encoded_buffer.timestamp - base::TimeTicks());
   buffer->set_is_key_frame(true);
+  buffer->set_duration(encoded_buffer.duration);
   auto* chunk = MakeGarbageCollected<EncodedAudioChunk>(std::move(buffer));
 
   auto* metadata = MakeGarbageCollected<EncodedAudioChunkMetadata>();
diff --git a/third_party/blink/renderer/platform/PRESUBMIT.py b/third_party/blink/renderer/platform/PRESUBMIT.py
index c7a40afb..c583756 100644
--- a/third_party/blink/renderer/platform/PRESUBMIT.py
+++ b/third_party/blink/renderer/platform/PRESUBMIT.py
@@ -10,9 +10,42 @@
 import difflib
 import os
 import re
+import sys
 
 USE_PYTHON3 = True
 RUNTIMEENABLED_NAME = re.compile(r'\s*name\s*:\s*"([^"]*)"')
+CHROMEOS_STATUS = "ChromeOS"
+LACROS_STATUS = "Lacros"
+
+# The ignore list will be removed once existing features adopt parity across
+# Lacros and ChromeOS.
+LACROS_CHROMEOS_FEATURE_STATUS_PARITY_IGNORE_LIST = [
+    'BarcodeDetector',  # crbug.com/1235855
+    'DigitalGoods',  # crbug.com/1235859
+    'ForceTallerSelectPopup',  # crbug.com/1235860
+    'NetInfoDownlinkMax',  # crbug.com/1235864
+    'WebBluetooth',  # crbug.com/1235867
+    'WebBluetoothManufacturerDataFilter',  # crbug.com/1235869
+    'WebBluetoothRemoteCharacteristicNewWriteValue',  # crbug.com/235870
+]
+
+
+# pyright: reportMissingImports=false
+def RuntimeEnabledFeatures(input_api, filename):
+    """Returns the features present in the specified features JSON5 file."""
+
+    # We need to wait until we have an input_api object and use this
+    # roundabout construct to import json5 because this file is
+    # eval-ed and thus doesn't have __file__.
+    try:
+        json5_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
+                                            '..', '..', '..', 'pyjson5', 'src')
+        sys.path.append(json5_path)
+        import json5
+        return json5.load(open(filename, encoding='utf-8'))['data']
+    finally:
+        # Restore sys.path to what it was before.
+        sys.path.remove(json5_path)
 
 
 def RuntimeEnabledFeatureNames(filename):
@@ -50,10 +83,45 @@
     ]
 
 
+def _CheckLacrosChromeOSFeatureStatusParity(input_api, output_api):
+    """Check: runtime_enabled_features.json5 feature status parity across Lacros
+     and ChromeOS.
+    """
+
+    filename = os.path.join(input_api.PresubmitLocalPath(),
+                            'runtime_enabled_features.json5')
+    try:
+        features = RuntimeEnabledFeatures(input_api, filename)
+        # Check that all features with a status specified for ChromeOS have the
+        # same status specified for Lacros.
+        for feature in features:
+            if feature[
+                    'name'] in LACROS_CHROMEOS_FEATURE_STATUS_PARITY_IGNORE_LIST:
+                continue
+            if 'status' in feature and type(feature['status']) is dict:
+                status_dict = feature['status']
+                if (CHROMEOS_STATUS in status_dict
+                        or LACROS_STATUS in status_dict) and (
+                            status_dict.get(LACROS_STATUS) !=
+                            status_dict.get(CHROMEOS_STATUS)):
+                    return [output_api.PresubmitError('Feature {} does not have status parity '\
+                      'across Lacros and ChromeOS.'.format(feature['name']))]
+    except:
+        return [
+            output_api.PresubmitError(
+                'Failed to parse {} for checks'.format(filename))
+        ]
+
+    return []
+
+
 def _CommonChecks(input_api, output_api):
     """Checks common to both upload and commit."""
     results = []
     results.extend(_CheckRuntimeEnabledFeaturesSorted(input_api, output_api))
+    results.extend(
+        _CheckLacrosChromeOSFeatureStatusParity(input_api, output_api))
+
     return results
 
 
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index e5e2f4c..9d142c0 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -500,10 +500,6 @@
   RuntimeEnabledFeatures::SetAutoLazyLoadOnReloadsEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableExpensiveBackgroundTimerThrottling(bool enable) {
-  RuntimeEnabledFeatures::SetExpensiveBackgroundTimerThrottlingEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableTimerThrottlingForBackgroundTabs(bool enable) {
   RuntimeEnabledFeatures::SetTimerThrottlingForBackgroundTabsEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/fonts/glyph_metrics_map.h b/third_party/blink/renderer/platform/fonts/glyph_metrics_map.h
index d3c216f..a93c90c 100644
--- a/third_party/blink/renderer/platform/fonts/glyph_metrics_map.h
+++ b/third_party/blink/renderer/platform/fonts/glyph_metrics_map.h
@@ -119,7 +119,7 @@
     filled_primary_page_ = true;
   } else {
     if (pages_) {
-      page = pages_->at(page_number);
+      page = pages_->DeprecatedAtOrEmptyValue(page_number);
       if (page)
         return page;
     } else {
diff --git a/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.cc b/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.cc
index a8ac60b..b8e4fed 100644
--- a/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.cc
+++ b/third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.cc
@@ -284,7 +284,8 @@
     // For Y, try VORG first.
     if (use_vorg) {
       if (glyph) {
-        int16_t vert_origin_yf_unit = vert_origin_y_.at(glyph);
+        int16_t vert_origin_yf_unit =
+            vert_origin_y_.DeprecatedAtOrEmptyValue(glyph);
         if (vert_origin_yf_unit) {
           out_xy_array[1] = -vert_origin_yf_unit * size_per_unit_;
           continue;
diff --git a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
index 76eb913..4c3d5e9f 100644
--- a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
@@ -319,9 +319,11 @@
                                                 PaintInvalidationReason reason,
                                                 ClientIsOldOrNew old_or_new) {
   DCHECK(tracking_info_);
-  String debug_name = old_or_new == kClientIsOld
-                          ? tracking_info_->old_client_debug_names.at(&client)
-                          : client.DebugName();
+  String debug_name =
+      old_or_new == kClientIsOld
+          ? tracking_info_->old_client_debug_names.DeprecatedAtOrEmptyValue(
+                &client)
+          : client.DebugName();
   tracking_info_->tracking.AddInvalidation(&client, debug_name, rect, reason);
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
index 801c03c..6e08ed9 100644
--- a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
+++ b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
@@ -104,6 +104,11 @@
   auto* raster_context_provider = context_provider->RasterContextProvider();
   if (!raster_context_provider)
     return false;
+  // TODO(https://crbug.com/1206168): Move this functionality to the
+  // RasterInterface instead of using the GrContext (which may or may not
+  // exist).
+  if (!raster_context_provider->GrContext())
+    return false;
 
   scoped_refptr<media::VideoFrame> dst_frame =
       pool_->MaybeCreateVideoFrame(src_size);
diff --git a/third_party/blink/renderer/platform/heap/asm/SaveRegisters_arm64.S b/third_party/blink/renderer/platform/heap/asm/SaveRegisters_arm64.S
index 46466365..db13c5d 100644
--- a/third_party/blink/renderer/platform/heap/asm/SaveRegisters_arm64.S
+++ b/third_party/blink/renderer/platform/heap/asm/SaveRegisters_arm64.S
@@ -50,8 +50,54 @@
 #endif
 .endm
 
+#if defined(__ARM_FEATURE_PAC_DEFAULT) && __ARM_FEATURE_PAC_DEFAULT
+    // ENABLE_PAUTH must be defined to 1 since this value will be used in
+    // bitwise-shift later!
+    #define ENABLE_PAUTH 1
+
+    #if ((__ARM_FEATURE_PAC_DEFAULT&((1<<0)|(1<<1)))==0)
+        #error Pointer authentication defines no valid key!
+    #endif
+#else
+    #define ENABLE_PAUTH 0
+#endif
+
+#if defined(__ARM_FEATURE_BTI_DEFAULT) && (__ARM_FEATURE_BTI_DEFAULT==1)
+    // ENABLE_BTI must be defined to 1 since this value will be used in
+    // bitwise-shift later!
+    #define ENABLE_BTI 1
+#else
+    #define ENABLE_BTI 0
+#endif
+
+
+// Although Pointer Authentication and Branch Target Instructions are technically
+// seperate features they work together, i.e. the paciasp and pacibsp instructions
+// serve as BTI landing pads.
+// Therefore PA-instructions are enabled when PA _or_ BTI is enabled!
+#if ENABLE_PAUTH || ENABLE_BTI
+    // See section "Pointer Authentication" of
+    // https://developer.arm.com/documentation/101028/0012/5--Feature-test-macros
+    // for details how to interpret __ARM_FEATURE_PAC_DEFAULT
+    #if (__ARM_FEATURE_PAC_DEFAULT & (1<<0))
+        #define PAUTH_SIGN_SP paciasp
+        #define PAUTH_AUTH_SP autiasp
+    #else
+        #define PAUTH_SIGN_SP pacibsp
+        #define PAUTH_AUTH_SP autibsp
+    #endif
+#else
+    #define PAUTH_SIGN_SP
+    #define PAUTH_AUTH_SP
+#endif
+
+
+
 asm_function PushAllRegisters
         .p2align 2
+
+        PAUTH_SIGN_SP
+
         /* Save return address. */
         sub sp, sp, #96
         stp x19, x20, [sp, #80]
@@ -73,4 +119,23 @@
          * the callback didn't clobber them) and we didn't modify them either.
          */
         ldr x30, [sp], #96
+
+        PAUTH_AUTH_SP
+
         ret
+
+#if ENABLE_PAUTH || ENABLE_BTI
+// see
+// https://github.com/ARM-software/abi-aa/blob/main/aaelf64/aaelf64.rst#program-property
+.pushsection .note.gnu.property, "a";
+    .balign 8
+    .long 4
+    .long 0x10
+    .long 0x5
+    .asciz "GNU"
+    .long 0xc0000000 /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */
+    .long 4
+    .long ((ENABLE_PAUTH)<<1) | ((ENABLE_BTI)<<0) /* PAuth and BTI */
+    .long 0
+.popsection
+#endif
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h
index eea4c20..682a0b5 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h
@@ -70,6 +70,7 @@
 class PLATFORM_EXPORT ThreadState final {
  public:
   class NoAllocationScope;
+  class GCForbiddenScope;
 
   BLINK_HEAP_DECLARE_THREAD_LOCAL_GETTER(Current,
                                          ThreadState*,
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state_scopes.h b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state_scopes.h
index bec9605..82e71e9 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state_scopes.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state_scopes.h
@@ -26,6 +26,22 @@
   const cppgc::subtle::DisallowGarbageCollectionScope disallow_gc_;
 };
 
+// The GCForbiddenScope class is used to prevent GC finalization
+// when it is not safe to do so.
+class ThreadState::GCForbiddenScope final {
+  STACK_ALLOCATED();
+
+ public:
+  explicit GCForbiddenScope(ThreadState* state)
+      : no_gc_(state->cpp_heap().GetHeapHandle()) {}
+
+  GCForbiddenScope(const NoAllocationScope&) = delete;
+  GCForbiddenScope& operator=(const NoAllocationScope&) = delete;
+
+ private:
+  const cppgc::subtle::NoGarbageCollectionScope no_gc_;
+};
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_THREAD_STATE_SCOPES_H_
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
index 1d8f23a..f8175380 100644
--- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
+++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -714,6 +714,11 @@
     // Turn off libavif's 'clap' (clean aperture) property validation. (We
     // ignore the 'clap' property.)
     decoder_->strictFlags &= ~AVIF_STRICT_CLAP_VALID;
+    // Allow the PixelInformationProperty ('pixi') to be missing in AV1 image
+    // items. libheif v1.11.0 or older does not add the 'pixi' item property to
+    // AV1 image items. (This issue has been corrected in libheif v1.12.0.) See
+    // crbug.com/1198455.
+    decoder_->strictFlags &= ~AVIF_STRICT_PIXI_REQUIRED;
 
     avif_io_.destroy = nullptr;
     avif_io_.read = ReadFromSegmentReader;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index ca05187..afcf1dab6 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -33,7 +33,7 @@
     // shipped stable can have its runtime flag removed soon after.
     status: {
       valid_values: ["stable", "experimental", "test"],
-      valid_keys: ["Android", "Win", "ChromeOS", "Mac"]
+      valid_keys: ["Android", "Win", "ChromeOS", "Mac", "Lacros"]
     },
 
     // "implied_by" or "depends_on" specifies relationship to other features:
@@ -884,7 +884,7 @@
       name: "DocumentPolicyNegotiation",
       origin_trial_feature_name: "DocumentPolicyNegotiation",
       status: "experimental",
-      depends_on: ['DocumentPolicy']
+      depends_on: ["DocumentPolicy"],
     },
     // Enables the ability to use Document Policy header to control feature
     // SyncXHR.
@@ -897,7 +897,7 @@
       // Document transitions, including shared element transitions.
       // See https://github.com/WICG/shared-element-transitions
       name: "DocumentTransition",
-      origin_trial_feature_name: "DocumentTransition"
+      origin_trial_feature_name: "DocumentTransition",
     },
     {
       name: "DocumentWrite",
@@ -934,10 +934,6 @@
       status: "test",
     },
     {
-      name: "ExpensiveBackgroundTimerThrottling",
-      status: "stable",
-    },
-    {
       name: "ExperimentalContentSecurityPolicyFeatures",
       status: "experimental",
     },
@@ -1727,7 +1723,7 @@
     {
       name: "PointerLockOptions",
       origin_trial_feature_name: "PointerLockOptions",
-      status: 'stable',
+      status: "stable",
     },
     {
       name: "PointerRawUpdate",
@@ -1764,8 +1760,8 @@
       depends_on: ["ForcedColors"],
     },
     {
-      name: 'PrefersReducedData',
-      status: 'experimental',
+      name: "PrefersReducedData",
+      status: "experimental",
     },
     // This feature is deprecated and we are evangelizing affected sites.
     // See https://crbug.com/346236 for current status.
@@ -1945,7 +1941,7 @@
     {
       name: "ScrollTimeline",
       status: "experimental",
-      implied_by: ['AnimationWorklet', 'CSSScrollTimeline']
+      implied_by: ["AnimationWorklet", "CSSScrollTimeline"]
     },
     // Implements documentElement.scrollTop/Left and bodyElement.scrollTop/Left
     // as per the spec, matching other Web engines.
@@ -2274,12 +2270,12 @@
       // should work with both screen and system wake locks.
       name: "WakeLock",
       status: "stable",
-      implied_by: ['SystemWakeLock'],
+      implied_by: ["SystemWakeLock"],
     },
     {
       name: "WebAnimationsAPI",
       status: "stable",
-      implied_by: ['AnimationWorklet']
+      implied_by: ["AnimationWorklet"],
     },
     {
       name: "WebAnimationsSVG",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
index dc8baa7..08564b4 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -695,9 +695,6 @@
   if (cpu_time_budget_pool_)
     return;
 
-  if (!RuntimeEnabledFeatures::ExpensiveBackgroundTimerThrottlingEnabled())
-    return;
-
   cpu_time_budget_pool_ = std::make_unique<CPUTimeBudgetPool>(
       "background", &tracing_controller_, lazy_now->Now());
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
index 7f3a87b..e7252d2 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -1128,9 +1128,6 @@
 }  // namespace
 
 TEST_F(PageSchedulerImplTest, BackgroundTimerThrottling) {
-  ScopedExpensiveBackgroundTimerThrottlingForTest
-      budget_background_throttling_enabler(true);
-
   InitializeTrialParams();
   page_scheduler_ =
       CreatePageScheduler(nullptr, scheduler_.get(), *agent_group_scheduler_);
@@ -1192,9 +1189,6 @@
 }
 
 TEST_F(PageSchedulerImplTest, OpenWebSocketExemptsFromBudgetThrottling) {
-  ScopedExpensiveBackgroundTimerThrottlingForTest
-      budget_background_throttling_enabler(true);
-
   InitializeTrialParams();
   std::unique_ptr<PageSchedulerImpl> page_scheduler =
       CreatePageScheduler(nullptr, scheduler_.get(), *agent_group_scheduler_);
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index fb073475..fbdcec2 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -46,6 +46,7 @@
             'base::JobHandle',
             'base::PostJob',
             'base::File',
+            'base::FileErrorOr',
             'base::FilePath',
             'base::GetUniqueIdForProcess',
             "base::i18n::TextDirection",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 1caf253..fb5d3e8 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2668,16 +2668,10 @@
 crbug.com/626703 [ Mac10.14 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-paint-error.https.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-paint-error.https.html [ Failure ]
 crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/valid-image-after-load.https.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html [ Failure ]
-crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html [ Failure ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html [ Failure ]
 crbug.com/626703 [ Mac10.12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/no-op-animation.https.html [ Failure ]
 crbug.com/626703 [ Mac10.13 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/no-op-animation.https.html [ Failure ]
 crbug.com/626703 [ Mac10.14 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/no-op-animation.https.html [ Failure ]
 crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/no-op-animation.https.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html [ Failure ]
-crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html [ Failure ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/css/css-highlight-api/painting/custom-highlight-painting-staticrange-005.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/css/css-highlight-api/painting/custom-highlight-painting-staticrange-004.html [ Failure ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin-opener-policy/coop-navigate-same-origin-csp-sandbox.html [ Timeout ]
@@ -3019,7 +3013,6 @@
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-helper-test.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/candidate-exchange.https.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/bundle.https.html [ Timeout ]
-crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-svc/RTCRtpParameters-scalability.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-getStats.https.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video-frames.https.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/crypto-suite.https.html [ Timeout ]
@@ -4530,9 +4523,6 @@
 # Sheriff failures 2017-11-15
 crbug.com/785179 [ Debug Win7 ] http/tests/devtools/console/console-viewport-stick-to-bottom.js [ Skip ]
 
-# Sheriff failures 2017-11-16
-crbug.com/785980 [ Win ] http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Failure Pass ]
-
 # Sheriff failures 2017-12-04
 crbug.com/667560 http/tests/devtools/elements/styles-4/inline-style-sourcemap.js [ Failure Pass ]
 
@@ -5084,6 +5074,215 @@
 crbug.com/1207342 http/tests/devtools/sources/debugger-ui/snippet-edit-breakpoint.js [ Failure Pass ]
 crbug.com/1207342 http/tests/devtools/sources/debugger-ui/ui-source-code-display-name.js [ Failure Pass ]
 crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Failure Pass Timeout ]
+crbug.com/1207342 http/tests/devtools/device-mode/device-mode-responsive.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/device-mode/device-mode-toolbar.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/throttling/mobile-throttling.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-bottom-up-times.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-flame-chart-overview.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-profile-removal.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/cpu-profiler-stopped-removed-race.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-profiler-profiling.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-dom-groups-change.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-show-next.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-event-listeners.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-inspect-dom-wrapper.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-location.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-orphan-nodes.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-statistics.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-expand-collapse.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-retainers.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-search-by-id.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-search.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-show-all.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-show-next.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-show-ranges.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-sorting-fields.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-sorting-instances.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-summary-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-weak-dominator.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/elements/styles-3/spectrum.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/forced-layout-in-microtask.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/fragment.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/reveal-objects.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/storage-panel-dom-storage-update.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/storage-panel-dom-storage.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/user-agent-setting-major-version.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/main-flamechart-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/network-flamechart-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/panel-right-toolbar-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/panel-toolbar-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/settings-pane-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/a11y-axe-core/performance/timeline-overview-container-a11y-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/components/cookies-table.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/components/datagrid-autosize.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/components/datagrid.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/components/viewport-datagrid.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-format-table.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-table.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/elements/styles-4/styles-should-not-force-sync-style-recalc.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/isolated-code-cache/same-origin-module-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/isolated-code-cache/same-origin-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/isolated-code-cache/stale-revalidation-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/async-xhr-json-mime-type.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/cached-resource-destroyed-moved-to-storage.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/failed-request-preview.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/failed-request-response-mimetype.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/font-face.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/har-content.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/har-post.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/html-preview-encoding.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/load-resource-for-frontend.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-blocked-reason.js [ Failure Pass Timeout ]
+crbug.com/1207342 http/tests/devtools/network/network-cachedresources-with-same-urls.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-close-request-view.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-columns-sorted.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-columns-visible.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-cyrillic-xhr.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-disable-cache-memory.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-disable-cache-preloads.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-disable-cache-xhrs.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-disabling-check-no-memory-leak.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-document-initiator.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-domain-filter.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-empty-xhr.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-eventsource.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-fetch-post-payload.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-fetch.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-filmstrip-overview-showing.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-filter-http-requests.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-filters-internals.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-iframe-load-and-delete.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-image-404.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-initiator-from-console.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-initiator.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-log-service-worker-navigate.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-memory-cached-resource.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-not-modified-images-mime-type.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-request-parse-query-params.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-request-query-string.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-request-revision-content.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-request-type.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-status-non-http.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-timing.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-worker-fetch-parallel.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-worker-fetch.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-async-double.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-async-response-type-blob.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-async.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-binary-content.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-post-payload.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-redirect-body.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-redirect-method.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-replay.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xhr-sync.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/network-xsl-content.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/ping-response.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/ping.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/request-parameters-decoding.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/request-preview-uri-escaping.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/resource-priority.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/script-as-text-loading-long-url.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/script-as-text-loading-with-caret.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/subresource-integrity-number-of-requests-for-script.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/warning-for-long-cookie.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/network/waterfall-header-height-updates.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-show-all.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/service-workers/service-worker-network-fetch.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/sxg/sxg-cert-not-found.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/sxg/sxg-navigation-fail.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/sxg/sxg-navigation-redirect.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/sxg/sxg-navigation.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/sxg/sxg-transfer-size.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/anonymous-image-object.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/buffer-usage.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/category-filter.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/console-timeline.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/frame-model.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/generic-trace.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/hit-test.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-gpu-tasks.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-script-module.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-xhr-event.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-xhr-response-type-blob-event.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/trace-event-self-time.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/tracing-timeline-load.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/ui-devtools-not-generic-trace.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/worker-events.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/compile-script.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/cpu-profile-unsorted-timestamps.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-has-cpu-profile-events.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-injected-script-eval.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-js-callstacks.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-js-streamed-cpu-profile.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-microtasks.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-open-function-call.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-script-id.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-script-tag-1.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-js/timeline-script-tag-2.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-layout/timeline-layout-reason.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-layout/timeline-layout.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-aggregated-details.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-animation-frame.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-auto-zoom.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-crypto.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-filtering-self-time.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-filtering.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-load-event.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-model.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-node-reference.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-parse-html.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-range-stats.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-record-reload.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-search.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-trivial.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-network/timeline-network-resource-details.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-network/timeline-network-resource.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-paint/timeline-paint-image.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-paint/update-layer-tree.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-style/parse-author-style-sheet.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-time/timeline-time-stamp.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-time/timeline-time.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-time/timeline-timer.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/websocket/timeline-websocket-event.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/unit/datagrid-editable-longtext.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/unit/datagrid-items-attached-to-dom.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/unit/viewport-datagrid-items-attached-to-dom.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/websocket/har-websocket.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/websocket/network-preserve-selection-on-frame-receive.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console-cd-completions.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console-completions.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-big-array.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-edit-expanded-tree.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-log-object-with-getter.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-page-metrics.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/tracing/timeline-misc/timeline-user-timings.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/persistence/persistence-go-to-file-dialog.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/quick-open/command-menu.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/console/console-retain-autocomplete-on-typing.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-block-indent.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Failure Pass Timeout ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-formatter.js [ Failure Pass Timeout ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-goto-matching-bracket.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-home-button.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-smart-braces.js [ Failure Pass ]
+crbug.com/1207342 http/tests/devtools/editor/text-editor-word-jumps.js [ Failure Pass Timeout ]
 
 
 # First party DevTools issues only work in the first-party-sets virtual suite
@@ -5104,9 +5303,6 @@
 
 # Sheriff 2018-05-28
 # Merged failing devtools/editor tests.
-crbug.com/749738 http/tests/devtools/editor/text-editor-word-jumps.js [ Pass Timeout ]
-crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Pass Timeout ]
-crbug.com/846982 http/tests/devtools/editor/text-editor-formatter.js [ Pass Timeout ]
 ### See crbug.com/891427 comment near the top of this file:
 ###crbug.com/847114 [ Linux ] http/tests/devtools/tracing/decode-resize.js [ Pass Failure ]
 ###crbug.com/847114 [ Linux ] virtual/threaded/http/tests/devtools/tracing/decode-resize.js [ Pass Failure ]
@@ -5344,18 +5540,12 @@
 crbug.com/937811 [ Linux Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Failure Pass ]
 crbug.com/937811 [ Release Win ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Failure Pass Timeout ]
 
-# Sheriff 2019-03-05
-crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout ]
-
 # Caused a revert of a good change.
 crbug.com/931533 media/video-played-collapse.html [ Failure Pass ]
 
 # Sheriff 2019-03-14
 crbug.com/806357 virtual/threaded/fast/events/pointerevents/pinch/pointerevent_touch-action-pinch_zoom_touch.html [ Crash Failure Pass Timeout ]
 
-# Trooper 2019-03-19
-crbug.com/943388 [ Win ] http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Failure Pass ]
-
 # Sheriff 2019-03-20
 crbug.com/943969 [ Win ] inspector-protocol/css/css-get-media-queries.js [ Failure Pass ]
 
@@ -5631,7 +5821,6 @@
 
 # Sheriff 2019-11-15
 crbug.com/1025123 external/wpt/longtask-timing/longtask-in-sibling-iframe-crossorigin.html [ Failure Pass ]
-crbug.com/1025321 [ Win ] http/tests/devtools/tracing/console-timeline.js [ Failure Pass ]
 
 # Timeout media preload test until preloading media destinations gets enabled.
 crbug.com/977033 http/tests/priorities/resource-load-priorities-media-preload.html [ Timeout ]
@@ -6161,11 +6350,7 @@
 # This test fails due to the linked bug since input is now routed through the compositor.
 crbug.com/1112508 fast/forms/number/number-wheel-event.html [ Failure ]
 
-# Sheriff 2020-07-20
-crbug.com/1107722 [ Mac ] http/tests/devtools/tracing/timeline-time/timeline-time.js [ Failure Pass ]
-
 # Sheriff 2020-07-22
-crbug.com/1107722 [ Mac ] http/tests/devtools/tracing/timeline-js/timeline-script-id.js [ Failure Pass ]
 crbug.com/1107722 [ Mac ] virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-causes.js [ Failure Pass ]
 # Failing on Webkit Linux Leak
 crbug.com/1046784 [ Linux ] http/tests/devtools/tracing/timeline-paint/timeline-paint.js [ Failure Pass ]
@@ -7225,14 +7410,6 @@
 # Mac below 10.15 is not implemented yet.
 crbug.com/1218431 [ Mac ] virtual/file-system-access-access-handle/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-close.https.tentative.worker.html [ Failure Pass ]
 crbug.com/1218431 [ Mac ] virtual/file-system-access-access-handle/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-truncate.https.tentative.worker.html [ Failure Pass ]
-# Test expectations for incognito will be updated as each method is implemented.
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-create-sync-access-handle-dedicated-worker.https.tentative.window.html [ Pass ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/local_FileSystemFileHandle-create-sync-access-handle-dedicated-worker-manual.https.tentative.html [ Pass ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-sync-access-handle-lock.https.tentative.worker.html [ Pass ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-read-write.https.tentative.worker.html [ Pass ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-flush.https.tentative.worker.html [ Skip ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-close.https.tentative.worker.html [ Skip ]
-crbug.com/1225653 virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-getSize.https.tentative.worker.html [ Pass ]
 
 # Sheriff 2021-06-30
 crbug.com/1216587 [ Win7 ] accessibility/scroll-window-sends-notification.html [ Failure Pass ]
@@ -7375,7 +7552,6 @@
 crbug.com/webrtc/12906 external/wpt/webrtc/RTCRtpTransceiver.https.html [ Failure Pass Timeout ]
 
 # Sheriff 2021-07-29
-crbug.com/626703 [ Mac ] external/wpt/webrtc/simulcast/setParameters-active.https.html [ Failure Pass ]
 crbug.com/626703 http/tests/security/cross-frame-access-put.html [ Failure Pass ]
 crbug.com/626703 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/overdraw.https.html [ Failure Pass ]
 crbug.com/626703 virtual/synchronous_html_parser/http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js [ Failure Pass ]
@@ -7406,3 +7582,6 @@
 # Sheriff 2021-08-10
 crbug.com/1238266 [ Mac ] virtual/file-system-access-access-handle-incognito/external/wpt/file-system-access/sandboxed_FileSystemSyncAccessHandle-truncate.https.tentative.worker.html [ Pass Failure ]
 crbug.com/1233840 external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html [ Pass Timeout ]
+crbug.com/1230534 external/wpt/webrtc/simulcast/basic.https.html [ Pass Timeout ]
+crbug.com/1230534 external/wpt/webrtc/simulcast/setParameters-active.https.html [ Failure Pass Timeout ]
+crbug.com/1237909 [ Mac ] external/wpt/webrtc-svc/RTCRtpParameters-scalability.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-in-initial-about-blank-document-cross-document.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-in-initial-about-blank-document-cross-document.html
index e74efcf..49f8b1a 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-in-initial-about-blank-document-cross-document.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-in-initial-about-blank-document-cross-document.html
@@ -10,12 +10,13 @@
   i.contentWindow.appHistory.onnavigate = t.unreached_func('onnavigate should not be called');
   i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
   i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
-  let promise_resolved = false;
+  let promise_settled = false;
   i.contentWindow.appHistory.navigate(new URL("/common/blank.html?1", location.href).href)
-      .then(() => promise_resolved = true);
+      .finally(() => promise_settled = true);
   await new Promise(resolve => i.onload = resolve);
+  await new Promise(resolve => t.step_timeout(resolve, 0));
   assert_equals(i.contentWindow.location.search, "?1");
-  assert_false(promise_resolved);
+  assert_false(promise_settled);
 }, "navigate in initial about:blank document");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-invalid-url.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-invalid-url.html
index 13ccfdd..c378126 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-invalid-url.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-invalid-url.html
@@ -3,7 +3,6 @@
 <script src="/resources/testharnessreport.js"></script>
 <script>
 promise_test(async t => {
-  let navInfo = { nav : "info" };
   appHistory.onnavigate = t.unreached_func("onnavigate");
   await promise_rejects_dom(t, "SyntaxError", appHistory.navigate("https://example.com\u0000mozilla.org"));
 }, "navigate() with invalid url");
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-no-args.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-no-args.html
deleted file mode 100644
index 09197f65..0000000
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-no-args.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-promise_test(async t => {
-  await promise_rejects_js(t, TypeError, appHistory.navigate());
-  await promise_rejects_js(t, TypeError, appHistory.navigate({}));
-  await promise_rejects_js(t, TypeError, appHistory.navigate({ replace : true }));
-}, "navigate() with no args or empty options");
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-beforeunload-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-beforeunload-unserializablestate.html
new file mode 100644
index 0000000..04e846f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-beforeunload-unserializablestate.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  let onbeforeunload_promise;
+  // The iframe does not have sticky activation, so per
+  // https://html.spec.whatwg.org/#prompt-to-unload-a-document, no prompt is
+  // shown and the navigation will proceed.
+  i.contentWindow.onbeforeunload = t.step_func(() => {
+    onbeforeunload_promise = i.contentWindow.appHistory.navigate("/common/blank.html?1", { state: document.body }).catch(e => {
+      assert_equals(e.constructor, i.contentWindow.DOMException);
+      assert_equals(e.name, "InvalidStateError");
+    });
+  });
+  i.contentWindow.appHistory.navigate("?1");
+  await onbeforeunload_promise;
+  assert_equals(navigate_event_count, 1);
+}, `navigate() with an unserializable state inside onbeforeunload throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-detached-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-detached-unserializablestate.html
new file mode 100644
index 0000000..ab7a88c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-detached-unserializablestate.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i"></iframe>
+<script>
+promise_test(async t => {
+  let iframe_constructor = i.contentWindow.DOMException;
+  let i_win = i.contentWindow;
+  i.remove();
+
+  i_win.appHistory.onnavigate = t.unreached_func("onnavigate");
+  await promise_rejects_dom(t, "InvalidStateError", iframe_constructor, i_win.appHistory.navigate("https://example.com/", { state: document.body }));
+}, `navigate() with unserializable state in a detached iframe throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-beforeunload.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-beforeunload.html
new file mode 100644
index 0000000..3adb353
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-beforeunload.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  let onbeforeunload_promise;
+  // The iframe does not have sticky activation, so per
+  // https://html.spec.whatwg.org/#prompt-to-unload-a-document, no prompt is
+  // shown and the navigation will proceed.
+  i.contentWindow.onbeforeunload = t.step_func(() => {
+    onbeforeunload_promise = i.contentWindow.appHistory.navigate("https://example.com\u0000mozilla.org").catch(e => {
+      assert_equals(e.constructor, i.contentWindow.DOMException);
+      assert_equals(e.name, "SyntaxError");
+    });
+  });
+  i.contentWindow.appHistory.navigate("?1");
+  await onbeforeunload_promise;
+  assert_equals(navigate_event_count, 1);
+}, `navigate() with an invalid URL inside onbeforeunload throws "SyntaxError", not "InvalidStateError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-detached.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-detached.html
new file mode 100644
index 0000000..a165cff
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-detached.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i"></iframe>
+<script>
+promise_test(async t => {
+  let iframe_constructor = i.contentWindow.DOMException;
+  let i_win = i.contentWindow;
+  i.remove();
+
+  i_win.appHistory.onnavigate = t.unreached_func("onnavigate");
+  await promise_rejects_dom(t, "SyntaxError", iframe_constructor, i_win.appHistory.navigate("https://example.com\u0000mozilla.org"));
+}, `navigate() with an invalid URL in a detached iframe throws "SyntaxError", not "InvalidStateError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unload.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unload.html
new file mode 100644
index 0000000..36505013
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unload.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  i.contentWindow.appHistory.navigate("?1");
+  await new Promise(resolve => {
+    i.contentWindow.onunload = t.step_func(() => {
+      i.contentWindow.appHistory.navigate("https://example.com\u0000mozilla.org").catch(t.step_func(e => {
+        assert_equals(e.constructor, i.contentWindow.DOMException);
+        assert_equals(e.name, "SyntaxError");
+        resolve();
+      }));
+    });
+  });
+  assert_equals(navigate_event_count, 1);
+}, `navigate() with an invalid URL inside onunload throws "SyntaxError", not "InvalidStateError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unserializablestate.html
new file mode 100644
index 0000000..01b7937
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-invalidurl-unserializablestate.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i"></iframe>
+<script>
+promise_test(async t => {
+  let iframe_constructor = i.contentWindow.DOMException;
+  let i_win = i.contentWindow;
+
+  i_win.appHistory.onnavigate = t.unreached_func("onnavigate");
+  await promise_rejects_dom(t, "SyntaxError", iframe_constructor, i_win.appHistory.navigate("https://example.com\u0000mozilla.org", { state: document.body }));
+}, `navigate() with an invalid URL and unserializable state throws "SyntaxError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-unload-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-unload-unserializablestate.html
new file mode 100644
index 0000000..cf9de41
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-rejection-order-unload-unserializablestate.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  i.contentWindow.appHistory.navigate("?1");
+  await new Promise(resolve => {
+    i.contentWindow.onunload = t.step_func(() => {
+      i.contentWindow.appHistory.navigate("/common/blank.html?1", { state: document.body }).catch(t.step_func(e => {
+        assert_equals(e.constructor, i.contentWindow.DOMException);
+        assert_equals(e.name, "InvalidStateError");
+        resolve();
+      }));
+    });
+  });
+  assert_equals(navigate_event_count, 1);
+}, `navigate() with an unserializable state inside onunload throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-unload.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-unload.html
index bc06c50..222eb93c 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-unload.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-unload.html
@@ -12,11 +12,11 @@
   i.contentWindow.appHistory.navigate("?1");
   await new Promise(resolve => {
     i.contentWindow.onunload = t.step_func(() => {
-      i.contentWindow.appHistory.navigate("#").catch(e => {
+      i.contentWindow.appHistory.navigate("#").catch(t.step_func(e => {
         assert_equals(e.constructor, i.contentWindow.DOMException);
         assert_equals(e.name, "InvalidStateError");
         resolve();
-      });
+      }));
     });
   });
   assert_equals(navigate_event_count, 1);
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg-replace.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg-replace.html
deleted file mode 100644
index 482402f..0000000
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg-replace.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<iframe id="i" src="/common/blank.html"></iframe>
-<script>
-async_test(t => {
-  window.onload = t.step_func(() => {
-    let navInfo = { nav: "info" };
-    let start_url = i.contentWindow.location.href;
-    let start_key = i.contentWindow.appHistory.current.key;
-    let onnavigate_called = false;
-    i.contentWindow.appHistory.onnavigate = t.step_func(e => {
-      onnavigate_called = true;
-      assert_equals(e.info, navInfo);
-    });
-    i.contentWindow.appHistory.navigate({ replace: true, info: navInfo });
-    i.onload = t.step_func_done(() => {
-      assert_true(onnavigate_called);
-      assert_equals(start_url, i.contentWindow.location.href);
-      assert_equals(start_key, i.contentWindow.appHistory.current.key);
-      assert_equals(i.contentWindow.appHistory.entries().length, 1);
-    });
-  });
-}, "navigate() variant with no url, replacing");
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg.html
deleted file mode 100644
index 5b8ccba27..0000000
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/navigate-without-url-arg.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<iframe id="i" src="/common/blank.html"></iframe>
-<script>
-async_test(t => {
-  window.onload = t.step_func(() => {
-    let navInfo = { nav: "info" };
-    let start_url = i.contentWindow.location.href;
-    let start_key = i.contentWindow.appHistory.current.key;
-    let start_id = i.contentWindow.appHistory.current.id;
-    let onnavigate_called = false;
-    i.contentWindow.appHistory.onnavigate = t.step_func(e => {
-      onnavigate_called = true;
-      assert_equals(e.info, navInfo);
-    });
-    i.contentWindow.appHistory.navigate({ info: navInfo });
-    i.onload = t.step_func_done(() => {
-      assert_true(onnavigate_called);
-      assert_equals(start_url, i.contentWindow.location.href);
-      assert_equals(start_key, i.contentWindow.appHistory.current.key);
-      assert_not_equals(start_id, i.contentWindow.appHistory.current.id);
-      assert_equals(i.contentWindow.appHistory.entries().length, 1);
-    });
-  });
-}, "navigate() variant with no url");
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-in-initial-about-blank-document.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-in-initial-about-blank-document.html
new file mode 100644
index 0000000..c91f8d2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-in-initial-about-blank-document.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/get-host-info.js"></script>
+<body>
+<script>
+promise_test(async t => {
+  let i = document.createElement("iframe");
+  document.body.appendChild(i);
+  i.contentWindow.appHistory.onnavigate = t.unreached_func('onnavigate should not be called');
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  let promise_settled = false;
+  i.contentWindow.appHistory.reload()
+      .finally(() => promise_settled = true);
+  await new Promise(resolve => i.onload = resolve);
+  await new Promise(resolve => t.step_timeout(resolve, 0));
+  assert_equals(i.contentWindow.location.href, "about:blank");
+  assert_false(promise_settled);
+}, "reload() in initial about:blank document");
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html
new file mode 100644
index 0000000..d0ed5ebc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    const navState = { key: "value" };
+    const navInfo = { infoKey: "infoValue" };
+    i.contentWindow.appHistory.navigate("#1", { state: navState }).then(t.step_func(() => {
+      // Make sure that state setting worked
+      assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
+      assert_not_equals(i.contentWindow.appHistory.current.getState(), navState);
+
+      let start_url = i.contentWindow.location.href;
+      let start_key = i.contentWindow.appHistory.current.key;
+      let start_id = i.contentWindow.appHistory.current.id;
+      let start_state = i.contentWindow.appHistory.current.getState();
+      let onnavigate_called = false;
+      let promise_settled = false;
+      i.contentWindow.appHistory.onnavigate = t.step_func(e => {
+        onnavigate_called = true;
+        assert_equals(e.info, navInfo);
+        assert_equals(e.navigationType, "reload");
+        assert_equals(e.destination.getState().key, "value");
+        assert_not_equals(e.destination.getState(), start_state);
+      });
+      i.contentWindow.appHistory.reload({ info: navInfo }).finally(() => {
+        promise_settled = true;
+      });
+      i.onload = t.step_func(() => {
+        assert_true(onnavigate_called);
+        assert_equals(i.contentWindow.location.href, start_url);
+        assert_equals(i.contentWindow.appHistory.current.key, start_key);
+        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
+        assert_not_equals(i.contentWindow.appHistory.current.getState(), start_state);
+        assert_equals(i.contentWindow.appHistory.entries().length, 2);
+
+        t.step_timeout(t.step_func_done(() => {
+          assert_equals(promise_settled, false);
+        }), 0);
+      });
+    }));
+  });
+}, "reload() variant with only info");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-navigation-timing.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-navigation-timing.html
new file mode 100644
index 0000000..a24e33f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-navigation-timing.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  i.contentWindow.appHistory.reload();
+  await new Promise(resolve => i.onload = resolve);
+
+  const entries = i.contentWindow.performance.getEntriesByType("navigation");
+  assert_equals(entries.length, 1);
+  assert_equals(entries[0].type, "reload");
+}, `reload() appears as a reload to navigation timing APIs`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html
new file mode 100644
index 0000000..569346f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    const navState = { key: "value" };
+    i.contentWindow.appHistory.navigate("#1", { state: navState }).then(t.step_func(() => {
+      // Make sure that state setting worked
+      assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
+      assert_not_equals(i.contentWindow.appHistory.current.getState(), navState);
+
+      let start_url = i.contentWindow.location.href;
+      let start_key = i.contentWindow.appHistory.current.key;
+      let start_id = i.contentWindow.appHistory.current.id;
+      let start_state = i.contentWindow.appHistory.current.getState();
+      let onnavigate_called = false;
+      let promise_settled = false;
+      i.contentWindow.appHistory.onnavigate = t.step_func(e => {
+        onnavigate_called = true;
+        assert_equals(e.info, undefined);
+        assert_equals(e.navigationType, "reload");
+        assert_equals(e.destination.getState().key, "value");
+        assert_not_equals(e.destination.getState(), start_state);
+      });
+      i.contentWindow.appHistory.reload().finally(() => {
+        promise_settled = true;
+      });
+      i.onload = t.step_func(() => {
+        assert_true(onnavigate_called);
+        assert_equals(i.contentWindow.location.href, start_url);
+        assert_equals(i.contentWindow.appHistory.current.key, start_key);
+        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
+        assert_not_equals(i.contentWindow.appHistory.current.getState(), start_state);
+        assert_equals(i.contentWindow.appHistory.entries().length, 2);
+
+        t.step_timeout(t.step_func_done(() => {
+          assert_equals(promise_settled, false);
+        }), 0);
+      });
+    }));
+  });
+}, "reload() variant with no state or info");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-beforeunload-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-beforeunload-unserializablestate.html
new file mode 100644
index 0000000..d40a6c7d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-beforeunload-unserializablestate.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  let onbeforeunload_promise;
+  // The iframe does not have sticky activation, so per
+  // https://html.spec.whatwg.org/#prompt-to-unload-a-document, no prompt is
+  // shown and the navigation will proceed.
+  i.contentWindow.onbeforeunload = t.step_func(() => {
+    onbeforeunload_promise = i.contentWindow.appHistory.reload({ state: document.body }).catch(e => {
+      assert_equals(e.constructor, i.contentWindow.DOMException);
+      assert_equals(e.name, "InvalidStateError");
+    });
+  });
+  i.contentWindow.appHistory.navigate("?1");
+  await onbeforeunload_promise;
+  assert_equals(navigate_event_count, 1);
+}, `reload() with an unserializable state inside onbeforeunload throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-detached-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-detached-unserializablestate.html
new file mode 100644
index 0000000..78da99a4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-detached-unserializablestate.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i"></iframe>
+<script>
+promise_test(async t => {
+  let iframe_constructor = i.contentWindow.DOMException;
+  let i_win = i.contentWindow;
+  i.remove();
+
+  i_win.appHistory.onnavigate = t.unreached_func("onnavigate");
+  await promise_rejects_dom(t, "InvalidStateError", iframe_constructor, i_win.appHistory.reload({ state: document.body }));
+}, `reload() with unserializable state in a detached iframe throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-unload-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-unload-unserializablestate.html
new file mode 100644
index 0000000..bf4b16ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-rejection-order-unload-unserializablestate.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+  await new Promise(resolve => window.onload = resolve);
+  let navigate_event_count = 0;
+  i.contentWindow.appHistory.onnavigate = () => navigate_event_count++;
+  i.contentWindow.appHistory.onnavigatesuccess = t.unreached_func('onnavigatesuccess should not be called');
+  i.contentWindow.appHistory.onnavigateerror = t.unreached_func('onnavigateerror should not be called');
+  i.contentWindow.appHistory.navigate("?1");
+  await new Promise(resolve => {
+    i.contentWindow.onunload = t.step_func(() => {
+      i.contentWindow.appHistory.reload({ state: document.body }).catch(t.step_func(e => {
+        assert_equals(e.constructor, i.contentWindow.DOMException);
+        assert_equals(e.name, "InvalidStateError");
+        resolve();
+      }));
+    });
+  });
+  assert_equals(navigate_event_count, 1);
+}, `reload() with an unserializable state inside onunload throws "InvalidStateError", not "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event-expected.txt b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event-expected.txt
new file mode 100644
index 0000000..cf4b285
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL reload() appears as a reload to service worker fetch event handlers promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'getRegistration')"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event.html
new file mode 100644
index 0000000..4d078e4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-service-worker-fetch-event.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+
+<!-- Keep an eye on https://github.com/whatwg/fetch/issues/1280 -->
+
+<script>
+const worker = "resources/fetch-event-test-worker.js";
+
+promise_test(async t => {
+  const scope = "resources/service-worker-page.html?reload-service-worker-fetch-event";
+
+  const reg = await service_worker_unregister_and_register(t, worker, scope);
+
+  await wait_for_state(t, reg.installing, "activated");
+  const frame = await with_iframe(scope);
+  assert_equals(frame.contentDocument.body.textContent, "method = GET, isReloadNavigation = false");
+
+  frame.contentWindow.appHistory.reload();
+  await new Promise(resolve => frame.addEventListener("load", resolve, { once: true }));
+  assert_equals(frame.contentDocument.body.textContent, "method = GET, isReloadNavigation = true");
+
+  frame.remove();
+  await reg.unregister();
+}, "reload() appears as a reload to service worker fetch event handlers");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html
new file mode 100644
index 0000000..de395bb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    const navState1 = { key: "value" };
+    const navState2 = { key2: "value2" };
+    const navInfo = { infoKey: "infoValue" };
+    i.contentWindow.appHistory.navigate("#1", { state: navState1 }).then(t.step_func(() => {
+      // Make sure that state setting worked
+      assert_equals(i.contentWindow.appHistory.current.getState().key, "value", "initial state setup");
+      assert_not_equals(i.contentWindow.appHistory.current.getState(), navState1);
+
+      let start_url = i.contentWindow.location.href;
+      let start_key = i.contentWindow.appHistory.current.key;
+      let start_id = i.contentWindow.appHistory.current.id;
+      let onnavigate_called = false;
+      let promise_settled = false;
+      i.contentWindow.appHistory.onnavigate = t.step_func(e => {
+        e.respondWith(Promise.resolve());
+        onnavigate_called = true;
+        assert_equals(e.info, navInfo);
+        assert_equals(e.navigationType, "reload");
+        assert_equals(e.destination.getState().key2, "value2", "navigate event for the reload()");
+        assert_not_equals(e.destination.getState(), navState2);
+      });
+      i.contentWindow.appHistory.reload({ info: navInfo, state: navState2 }).then(t.step_func_done(() => {
+        assert_true(onnavigate_called);
+        assert_equals(i.contentWindow.location.href, start_url);
+        assert_equals(i.contentWindow.appHistory.current.key, start_key);
+        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.getState().key2, "value2", "current.getState() after teh reload");
+        assert_not_equals(i.contentWindow.appHistory.current.getState(), navState2);
+      }));
+    }));
+  });
+}, "reload() variant with info and new state");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html
new file mode 100644
index 0000000..18b48ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    const navState = { key: "value" };
+    const navInfo = { infoKey: "infoValue" };
+    i.contentWindow.appHistory.navigate("#1", { state: navState }).then(t.step_func(() => {
+      // Make sure that state setting worked
+      assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
+      assert_not_equals(i.contentWindow.appHistory.current.getState(), navState);
+
+      let start_url = i.contentWindow.location.href;
+      let start_key = i.contentWindow.appHistory.current.key;
+      let start_id = i.contentWindow.appHistory.current.id;
+      let onnavigate_called = false;
+      let promise_settled = false;
+      i.contentWindow.appHistory.onnavigate = t.step_func(e => {
+        e.respondWith(Promise.resolve());
+        onnavigate_called = true;
+        assert_equals(e.info, navInfo);
+        assert_equals(e.navigationType, "reload");
+        assert_equals(e.destination.getState().key, "value", "destination.getState()");
+        assert_not_equals(e.destination.getState(), navState);
+      });
+      i.contentWindow.appHistory.reload({ info: navInfo, state: undefined }).then(t.step_func_done(() => {
+        assert_true(onnavigate_called);
+        assert_equals(i.contentWindow.location.href, start_url);
+        assert_equals(i.contentWindow.appHistory.current.key, start_key);
+        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.getState().key, "value", "destination.getState()");
+        assert_not_equals(i.contentWindow.appHistory.current.getState(), navState);
+      }));
+    }));
+  });
+}, "reload() variant with info and state: undefined counts the same as not present (because of Web IDL dictionary semantics), so preserves the state");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/fetch-event-test-worker.js b/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/fetch-event-test-worker.js
new file mode 100644
index 0000000..e0d740a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/fetch-event-test-worker.js
@@ -0,0 +1,7 @@
+self.addEventListener('fetch', function(event) {
+  const request = event.request;
+  const body =
+    `method = ${request.method}, ` +
+    `isReloadNavigation = ${request.isReloadNavigation}`;
+  event.respondWith(new Response(body));
+});
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/service-worker-page.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/service-worker-page.html
new file mode 100644
index 0000000..a10ff35
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/resources/service-worker-page.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<p>We can't use /common/blank.html because of scope restrictions.
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/navigate-state-after-same-document-location-api-navigation.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/navigate-state-after-same-document-location-api-navigation.html
index a56568b..49e4507 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/navigate-state-after-same-document-location-api-navigation.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/navigate-state-after-same-document-location-api-navigation.html
@@ -15,35 +15,33 @@
     location.href = "#2";
     let entry2 = appHistory.current;
 
-    t.step_func(() => {
+    assert_equals(appHistory.entries().length, 3);
+    assert_equals(entry0, appHistory.entries()[0]);
+    assert_equals(entry1, appHistory.entries()[1]);
+    assert_equals(entry2, appHistory.entries()[2]);
+
+    assert_equals(entry0.getState(), undefined);
+
+    let state1 = entry1.getState();
+    assert_not_equals(state1, undefined);
+    assert_not_equals(state1, navState);
+    assert_equals(state1.statevar, "state");
+
+    let state2 = entry2.getState();
+    assert_not_equals(state2, undefined);
+    assert_not_equals(state2, navState);
+    assert_equals(state2.statevar, "state");
+
+    history.back();
+    window.onpopstate = t.step_func_done(() => {
       assert_equals(appHistory.entries().length, 3);
-      assert_equals(entry0, appHistory.entries()[0]);
-      assert_equals(entry1, appHistory.entries()[1]);
-      assert_equals(entry2, appHistory.entries()[2]);
-
-      assert_equals(entry0.getState(), undefined);
-
-      let state1 = entry1.getState();
-      assert_not_equals(state1, undefined);
-      assert_not_equals(state1, navState);
-      assert_equals(state1.statevar, "state");
-
-      let state2 = entry2.getState();
-      assert_not_equals(state2, undefined);
-      assert_not_equals(state2, navState);
-      assert_equals(state2.statevar, "state");
-
-      history.back();
-      window.onpopstate = t.step_func_done(() => {
-        assert_equals(appHistory.entries().length, 3);
-        let back_entry = appHistory.current;
-        assert_equals(back_entry, appHistory.entries()[1]);
-        let back_state = back_entry.getState();
-        assert_not_equals(back_state, state1);
-        assert_not_equals(back_state, state2);
-        assert_equals(back_state.statevar, "state");
-      });
-    })();
+      let back_entry = appHistory.current;
+      assert_equals(back_entry, appHistory.entries()[1]);
+      let back_state = back_entry.getState();
+      assert_not_equals(back_state, state1);
+      assert_not_equals(back_state, state2);
+      assert_equals(back_state.statevar, "state");
+    });
   }, 0);
 }, "appHistoryEntry.getState() behavior after navigating away and back via a fragment change");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/reload-state-invalid.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/reload-state-invalid.html
new file mode 100644
index 0000000..fb6edbc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/reload-state-invalid.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(async t => {
+  await promise_rejects_dom(t, 'DataCloneError', appHistory.reload({ state : new WritableStream() }));
+  assert_equals(appHistory.current.getState(), undefined);
+  assert_equals(location.hash, "");
+}, "reload() with an unserializable state object (WriteableStream)");
+
+promise_test(async t => {
+  // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
+  const buffer = new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer;
+  await promise_rejects_dom(t, 'DataCloneError', appHistory.reload({ state : buffer }));
+  assert_equals(appHistory.current.getState(), undefined);
+  assert_equals(location.hash, "");
+}, "reload() with an unserializable state object (SharedArrayBuffer)");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/basic.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/basic.html
new file mode 100644
index 0000000..00d3f597
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/basic.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+async_test(t => {
+  appHistory.onnavigate = t.unreached_func("navigate must not fire");
+  appHistory.onnavigatesuccess = t.unreached_func("navigatesuccess must not fire");
+  appHistory.onnavigateerror = t.unreached_func("navigateerror must not fire");
+
+  assert_equals(appHistory.current.getState(), undefined, "App history state starts out as undefined");
+  assert_equals(history.state, null, "history.state starts out as null");
+
+  const newState = { key: "value" };
+
+  appHistory.updateCurrent({ state: newState });
+
+  assert_equals(appHistory.current.getState().key, "value");
+  assert_not_equals(appHistory.current.getState(), newState);
+  assert_equals(history.state, null);
+
+  // Wait a tick to make sure no events fire asynchronously.
+  t.step_timeout(() => t.done(), 0);
+}, "updateCurrent() works as expected");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-initial-about-blank-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-initial-about-blank-unserializablestate.html
new file mode 100644
index 0000000..9ecb7979
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-initial-about-blank-unserializablestate.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe"></iframe>
+
+<script>
+test(() => {
+  assert_throws_dom("InvalidStateError", iframe.contentWindow.DOMException, () => {
+    iframe.contentWindow.appHistory.updateCurrent({ state: document.body });
+  });
+  assert_equals(appHistory.current.getState(), undefined);
+}, `updateCurrent() with unserializable state on the initial about:blank must throw an "InvalidStateError", not a "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-not-fully-active-unserializablestate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-not-fully-active-unserializablestate.html
new file mode 100644
index 0000000..bd13b59
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/exception-order-not-fully-active-unserializablestate.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe" src="/common/blank.html"></iframe>
+
+<script>
+async_test(t => {
+  window.onload = t.step_func_done(() => {
+    const wAppHistory = iframe.contentWindow.appHistory;
+    const wDOMException = iframe.contentWindow.DOMException;
+
+    iframe.remove();
+
+    assert_throws_dom("InvalidStateError", wDOMException, () => {
+      wAppHistory.updateCurrent({ state: document.body });
+    });
+    assert_equals(appHistory.current.getState(), undefined);
+  });
+}, `updateCurrent() with unserializable state while not fully active must throw an "InvalidStateError", not a "DataCloneError"`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/initial-about-blank.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/initial-about-blank.html
new file mode 100644
index 0000000..1c1d9145
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/initial-about-blank.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe"></iframe>
+
+<script>
+test(() => {
+  assert_throws_dom("InvalidStateError", iframe.contentWindow.DOMException, () => {
+    iframe.contentWindow.appHistory.updateCurrent({ state: 1 });
+  });
+  assert_equals(appHistory.current.getState(), undefined);
+}, "updateCurrent() must throw if the document is still on the initial about:blank");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/no-args.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/no-args.html
new file mode 100644
index 0000000..435f260
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/no-args.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+test(() => {
+  assert_throws_js(TypeError, () => {
+    appHistory.updateCurrent();
+  }, "no args");
+
+  assert_throws_js(TypeError, () => {
+    appHistory.updateCurrent({});
+  }, "empty dictionary");
+}, "updateCurrent() must throw if state is not given");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/not-fully-active.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/not-fully-active.html
new file mode 100644
index 0000000..ba1df86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/not-fully-active.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe" src="/common/blank.html"></iframe>
+
+<script>
+async_test(t => {
+  window.onload = t.step_func_done(() => {
+    const wAppHistory = iframe.contentWindow.appHistory;
+    const wDOMException = iframe.contentWindow.DOMException;
+
+    iframe.remove();
+
+    assert_throws_dom("InvalidStateError", wDOMException, () => {
+      wAppHistory.updateCurrent({ state: 1 });
+    });
+    assert_equals(appHistory.current.getState(), undefined);
+  });
+}, "updateCurrent() must throw if the document is not fully active");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-pushState.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-pushState.html
new file mode 100644
index 0000000..e24fc0f3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-pushState.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+  appHistory.navigate("#", { replace : true, state : { data : "value" } });
+  assert_equals(appHistory.current.getState().data, "value");
+  history.pushState(1, "", "#push");
+  assert_equals(appHistory.current.getState(), undefined);
+}, "appHistoryEntry.getState() after history.pushState()");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-replaceState.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-replaceState.html
new file mode 100644
index 0000000..440cd48
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-history-replaceState.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+  appHistory.updateCurrent({ state: { data: "value" } });
+  assert_equals(appHistory.current.getState().data, "value");
+  history.replaceState(1, "", "#replace");
+  assert_equals(appHistory.current.getState(), undefined);
+}, "appHistoryEntry.getState() after history.replaceState()");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-reload.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-reload.html
new file mode 100644
index 0000000..43d452d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-reload.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    i.contentWindow.appHistory.updateCurrent({ state: { data: "value" } });
+    assert_equals(i.contentWindow.appHistory.entries().length, 1);
+    assert_equals(i.contentWindow.appHistory.current.getState().data, "value");
+
+    i.contentWindow.location.reload();
+    i.onload = t.step_func_done(() => {
+      assert_equals(i.contentWindow.appHistory.entries().length, 1);
+      assert_equals(i.contentWindow.appHistory.current.getState().data, "value");
+    });
+  });
+}, "appHistoryEntry.getState() after location.reload()");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-same-document-location-api-navigation.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-same-document-location-api-navigation.html
new file mode 100644
index 0000000..5d57ea0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-after-same-document-location-api-navigation.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(t => {
+  // Wait for after the load event so that the navigation doesn't get converted
+  // into a replace navigation.
+  window.onload = () => t.step_timeout(async () => {
+    let entry0 = appHistory.current;
+
+    let navState = { statevar: "state" };
+    appHistory.updateCurrent({ state: navState });
+    assert_equals(appHistory.current, entry0);
+
+    location.href = "#2";
+    let entry1 = appHistory.current;
+
+    assert_equals(appHistory.entries().length, 2);
+    assert_equals(entry0, appHistory.entries()[0]);
+    assert_equals(entry1, appHistory.entries()[1]);
+
+    assert_equals(entry0.getState().statevar, "state");
+    assert_not_equals(entry0.getState(), navState);
+
+    assert_equals(entry1.getState().statevar, "state");
+    assert_not_equals(entry1.getState(), navState);
+    assert_not_equals(entry1.getState(), entry0.getState());
+
+    history.back();
+    window.onpopstate = t.step_func_done(() => {
+      assert_equals(appHistory.entries().length, 2);
+      let back_entry = appHistory.current;
+      assert_equals(back_entry, entry0);
+      let back_state = back_entry.getState();
+      assert_not_equals(back_state, navState);
+      assert_equals(back_state.statevar, "state");
+    });
+  }, 0);
+}, "appHistoryEntry.getState() behavior after navigating away and back via a fragment change");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-location-navigate.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-location-navigate.html
new file mode 100644
index 0000000..6e70b48
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-location-navigate.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    i.contentWindow.appHistory.updateCurrent({ state: { data: "value" } });
+    assert_equals(i.contentWindow.appHistory.entries().length, 1);
+    assert_equals(i.contentWindow.appHistory.current.getState().data, "value");
+
+    i.contentWindow.location.href = "?1";
+    i.onload = t.step_func_done(() => {
+      assert_equals(i.contentWindow.appHistory.entries().length, 2);
+      assert_equals(i.contentWindow.appHistory.current.index, 1);
+      assert_equals(i.contentWindow.appHistory.current.getState(), undefined);
+    });
+  });
+}, "appHistoryEntry.getState() behavior after cross-document location API navigation");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-restore.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-restore.html
new file mode 100644
index 0000000..f872e61
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-cross-document-restore.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+async_test(t => {
+  window.onload = t.step_func(() => {
+    i.contentWindow.appHistory.updateCurrent({ state: { data: "value" } });
+    assert_equals(i.contentWindow.appHistory.entries().length, 1);
+    assert_equals(i.contentWindow.appHistory.current.getState().data, "value");
+
+    let navigated_back = false;
+    i.contentWindow.appHistory.navigate("?1");
+    i.onload = t.step_func(() => {
+      if (navigated_back) {
+        let back_entry = i.contentWindow.appHistory.current;
+        assert_equals(i.contentWindow.appHistory.entries().length, 2);
+        assert_equals(back_entry.index, 0);
+        assert_equals(back_entry.getState().data, "value");
+        t.done();
+      } else {
+        assert_equals(i.contentWindow.appHistory.entries().length, 2);
+        assert_equals(i.contentWindow.appHistory.current, i.contentWindow.appHistory.entries()[1]);
+        assert_equals(i.contentWindow.appHistory.current.getState(), undefined);
+        history.back();
+        navigated_back = true;
+      }
+    });
+  });
+}, "appHistoryEntry.getState() behavior after navigating away and back");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-invalid.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-invalid.html
new file mode 100644
index 0000000..469b7d2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/state/updateCurrent/state-invalid.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe" src="/common/blank.html"></iframe>
+
+<script>
+setup({ explicit_done: true });
+
+window.onload = () => {
+  test(() => {
+    assert_throws_dom("DataCloneError", iframe.contentWindow.DOMException, () => {
+      iframe.contentWindow.appHistory.updateCurrent({ state: new WritableStream() });
+    });
+    assert_equals(appHistory.current.getState(), undefined);
+  }, "updateCurrent() must throw if state is unserializable (WritableStream)");
+
+  test(() => {
+    // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
+    const buffer = new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer;
+
+    assert_throws_dom("DataCloneError", iframe.contentWindow.DOMException, () => {
+      iframe.contentWindow.appHistory.updateCurrent({ state: buffer });
+    });
+    assert_equals(appHistory.current.getState(), undefined);
+  }, "updateCurrent() must throw if state is unserializable (SharedArrayBuffer)");
+
+  done();
+};
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-001.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-001.html
new file mode 100644
index 0000000..909779d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+</style>
+<body><span>One </span><span>two </span><span>three…</span>
+<script>
+  let r = new Range();
+  r.setStart(document.body, 0);
+  r.setEnd(document.body, 2);
+
+  // Force frame paint before registering the Highlight.
+  requestAnimationFrame(()=>{
+    requestAnimationFrame(()=>{
+      CSS.highlights.set("example-highlight", new Highlight(r));
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-002.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-002.html
new file mode 100644
index 0000000..197b9a4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-002.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-staticrange-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted after deletion">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+</style>
+<body><span>One </span><span>two </span><span>three…</span>
+<script>
+  let r = new Range();
+  r.setStart(document.body, 0);
+  r.setEnd(document.body, 2);
+  CSS.highlights.set("example-highlight", new Highlight(r));
+
+  // Force frame paint before deleting the Highlight.
+  requestAnimationFrame(()=>{
+    requestAnimationFrame(()=>{
+      CSS.highlights.delete("example-highlight");
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-003.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-003.html
new file mode 100644
index 0000000..a02d050
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-003.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted after modifying its range">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+</style>
+<body><span>One </span><span>two </span><span>three…</span>
+<script>
+  let r = new Range();
+  CSS.highlights.set("example-highlight", new Highlight(r));
+
+  // Force frame paint before modifying the Highlight's range.
+  requestAnimationFrame(()=>{
+    requestAnimationFrame(()=>{
+      r.setStart(document.body, 0);
+      r.setEnd(document.body, 2);
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-004.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-004.html
new file mode 100644
index 0000000..2b22743
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-004.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted after adding a range to it">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+</style>
+<body><span>One </span><span>two </span><span>three…</span>
+<script>
+  let r = new Range();
+  r.setStart(document.body, 0);
+  r.setEnd(document.body, 2);
+  let h = new Highlight();
+  CSS.highlights.set("example-highlight", h);
+
+  // Force frame paint before modifying the Highlight.
+  requestAnimationFrame(()=>{
+    requestAnimationFrame(()=>{
+      h.add(r);
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-005.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-005.html
new file mode 100644
index 0000000..b22b7d7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-005.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted after modifying its priority">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+  ::highlight(another-highlight) {
+    background-color: red;
+    color: orange;
+  }
+</style>
+<body><span>One </span><span>two </span><span>three…</span>
+<script>
+  let r = new Range();
+  r.setStart(document.body, 0);
+  r.setEnd(document.body, 2);
+  let h1 = new Highlight(r);
+  let h2 = new Highlight(r);
+  h1.priority = 1;
+  h2.priority = 2;
+  CSS.highlights.set("example-highlight", h1);
+  CSS.highlights.set("another-highlight", h2);
+
+  // Force frame paint before modifying the Highlight.
+  requestAnimationFrame(()=>{
+    requestAnimationFrame(()=>{
+      h1.priority = 3;
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-006.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-006.html
new file mode 100644
index 0000000..d773a01
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/custom-highlight-painting-invalidation-006.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Highlight API Test: </title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="custom-highlight-painting-001-ref.html">
+<meta name="assert" value="::highlight overlay is correctly invalidated and repainted after inserting a new node inside one of its ranges">
+<style>
+  ::highlight(example-highlight) {
+    background-color: yellow;
+    color: blue;
+  }
+</style>
+<body><span>two </span><span>three…</span>
+  <script>
+    let r = new Range();
+    r.setStart(document.body, 0);
+    r.setEnd(document.body, 1);
+    CSS.highlights.set("example-highlight", new Highlight(r));
+    let newNode = document.createElement("span");
+    newNode.innerText = "One ";
+
+    // Force frame paint before inserting a new node.
+    requestAnimationFrame(()=>{
+      requestAnimationFrame(()=>{
+        document.body.insertBefore(newNode, document.body.firstChild);
+      });
+    });
+  </script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html
index a873e1b..853ad9e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-001.sub.html
@@ -2,6 +2,8 @@
 <title>an abs-pos iframe in the first page but its hypothetical position is in the second page</title>
 <link rel="help" href="https://drafts.csswg.org/css-position/#valdef-position-absolute">
 <link rel="match" href="position-absolute-iframe-print-ref.html">
+<!-- Allow some text antialias pixels to be different. -->
+<meta name="fuzzy" content="0-255;0-20">
 <style>
   body {
     margin: 0
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html
index 0b39fd9..b47616d1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html
@@ -2,6 +2,8 @@
 <title>an abs-pos iframe in the first page but its hypothetical position is in the second page</title>
 <link rel="help" href="https://drafts.csswg.org/css-position/#valdef-position-absolute">
 <link rel="match" href="position-absolute-iframe-print-ref.html">
+<!-- Allow some text antialias pixels to be different. -->
+<meta name="fuzzy" content="0-255;0-20">
 <style>
   body {
     margin: 0;
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector-ref.xml b/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector-ref.xml
deleted file mode 100644
index 6b44280..0000000
--- a/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector-ref.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <title>Class selectors in an XML namespace</title>
-  <link rel="author" href="mailto:masonf@chromium.org" />
-  <body>
-    <p>The .class selector should work in any namespace. Both boxes should be green.</p>
-    <Boxes xmlns="http://foo">
-      <box>.classname selector</box>
-      <box>*[class~="classname"] selector</box>
-    </Boxes>
-
-    <style>
-      box {background:green;}
-    </style>
-  </body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector.xml b/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector.xml
deleted file mode 100644
index 00fda11..0000000
--- a/third_party/blink/web_tests/external/wpt/css/selectors/xml-class-selector.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <title>Class selectors in an XML namespace</title>
-  <link rel="author" href="mailto:masonf@chromium.org" />
-  <link rel="help" href="https://dom.spec.whatwg.org/#dom-element-classname" />
-  <link rel="match" href="xml-class-selector-ref.xml" />
-  <body>
-    <p>The .class selector should work in any namespace. Both boxes should be green.</p>
-    <Boxes xmlns="http://foo">
-      <box class="green">.classname selector</box>
-      <box class="green2">*[class~="classname"] selector</box>
-    </Boxes>
-
-    <style>
-      box {background:red;}
-      .green {background: green;}
-      *[class~="green2"] {background: green;}
-    </style>
-  </body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/anonymous-iframe/cross-origin-isolated.tentative.window.js b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/anonymous-iframe/cross-origin-isolated.tentative.window.js
new file mode 100644
index 0000000..8ab0e710
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/anonymous-iframe/cross-origin-isolated.tentative.window.js
@@ -0,0 +1,112 @@
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=../credentialless/resources/common.js
+// META: script=../credentialless/resources/dispatcher.js
+// META: timeout=long
+
+const same_origin = get_host_info().HTTPS_ORIGIN;
+const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+
+const CROSS_ORIGIN_ISOLATED = "true";
+const NOT_CROSS_ORIGIN_ISOLATED = "false";
+const BLOCKED = "blocked";
+
+// Vary the headers of a parent and its anonymous iframe. Determine in which
+// cases the anonymous iframe gets the cross-origin-isolated capability.
+const crossOriginIsolatedTest = (description, params) => {
+  const default_params = {
+    parent_origin: same_origin,
+    parent_headers: '',
+    parent_allow: '',
+    child_origin: same_origin,
+    child_headers: '',
+    child_state: NOT_CROSS_ORIGIN_ISOLATED,
+  };
+  params = {...default_params, ...params};
+
+  promise_test_parallel(async test => {
+    // Create the parent.
+    const parent_token = token();
+    const parent_url = params.parent_origin + executor_path +
+        params.parent_headers + `&uuid=${parent_token}`;
+    const parent = window.open(parent_url)
+    add_completion_callback(() => parent.close());
+
+    // Create its anonymous iframe.
+    const child_token = token();
+    const child_url = params.child_origin + executor_path +
+        params.child_headers + `&uuid=${child_token}`;
+    send(parent_token, `
+      const iframe = document.createElement("iframe");
+      iframe.src = "${child_url}";
+      iframe.anonymous = true;
+      iframe.allow="${params.parent_allow}";
+      document.body.appendChild(iframe);
+    `);
+
+    // Check child's cross-origin isolation state.
+    const this_token = token();
+    send(child_token, `
+      send("${this_token}", window.crossOriginIsolated);
+    `);
+
+    test.step_timeout(() => {
+      send(this_token, 'blocked');
+    }, 3000);
+
+    assert_equals(await receive(this_token), params.child_state);
+  }, description);
+};
+
+crossOriginIsolatedTest("Basic", {
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Basic + child cross_origin", {
+  child_origin: cross_origin,
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Parent coep_require-corp", {
+  parent_headers: coep_require_corp,
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Parent coep_require-corp + cross_origin", {
+  parent_headers: coep_require_corp,
+  child_origin: cross_origin,
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Parent COI", {
+  parent_headers: coop_same_origin + coep_require_corp,
+  child_state: CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Parent COI + child cross-origin", {
+  parent_headers: coop_same_origin + coep_require_corp,
+  child_origin: cross_origin,
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest("Parent COI + child cross-origin COEP/CORP", {
+  parent_headers: coop_same_origin + coep_require_corp,
+  child_headers: coep_require_corp + corp_cross_origin,
+  child_origin: cross_origin,
+  child_state: NOT_CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest('Parent COI allow + child cross_origin', {
+  parent_headers: coop_same_origin + coep_require_corp,
+  parent_allow: 'cross-origin-isolated',
+  child_origin: cross_origin,
+  child_state: CROSS_ORIGIN_ISOLATED,
+});
+
+crossOriginIsolatedTest('Parent COI allow + child cross-origin COEP/CORP', {
+  parent_headers: coop_same_origin + coep_require_corp,
+  parent_allow: 'cross-origin-isolated',
+  child_headers: coep_require_corp + corp_cross_origin,
+  child_origin: cross_origin,
+  child_state: CROSS_ORIGIN_ISOLATED,
+});
diff --git a/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html b/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html
index 25eb941..c90d844 100644
--- a/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html
+++ b/third_party/blink/web_tests/external/wpt/media-source/mediasource-appendbuffer-quota-exceeded.html
@@ -7,25 +7,36 @@
 <script src="mediasource-util.js"></script>
 <script>
     var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
-    var manifestFilenameAudio = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
+    var manifestFilenameAudio = subType + '/test-a-128k-44100Hz-1ch-manifest.json';
 
     // Fill up a given SourceBuffer by appending data repeatedly via doAppendDataFunc until
     // an exception is thrown. The thrown exception is passed to onCaughtExceptionCallback.
     function fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback) {
+        assert_false(sourceBuffer.updating, 'updating should be false before attempting an append operation');
+
         // We are appending data repeatedly in sequence mode, there should be no gaps.
-        assert_false(sourceBuffer.buffered.length > 1, "unexpected gap in buffered ranges.");
+        let sbLength = sourceBuffer.buffered.length;
+        assert_false(sbLength > 1, 'unexpected gap in buffered ranges.');
+
+        let previousBufferedStart = sbLength == 0 ? -Infinity : sourceBuffer.buffered.start(0);
+        let previousBufferedEnd = sbLength == 0 ? -Infinity : sourceBuffer.buffered.end(0);
+        let appendSucceeded = true;
         try {
             doAppendDataFunc();
         } catch(ex) {
-            onCaughtExceptionCallback(ex);
+            onCaughtExceptionCallback(ex, previousBufferedStart, previousBufferedEnd);
+            appendSucceeded = false;
         }
-        test.expectEvent(sourceBuffer, 'updateend', 'append ended.');
-        test.waitForExpectedEvents(function() { fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback); });
+        if (appendSucceeded) {
+          assert_true(sourceBuffer.updating, 'updating should be true if synchronous portion of appendBuffer succeeded');
+          test.expectEvent(sourceBuffer, 'updateend', 'append ended.');
+          test.waitForExpectedEvents(function() { fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback); });
+        }
     }
 
     mediasource_test(function(test, mediaElement, mediaSource)
     {
-        mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
+        mediaElement.addEventListener('error', test.unreached_func('Unexpected media element error event'));
         MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function(typeAudio, dataAudio)
         {
             var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
@@ -34,9 +45,30 @@
                 function () { // doAppendDataFunc
                     sourceBuffer.appendBuffer(dataAudio);
                 },
-                function (ex) { // onCaughtExceptionCallback
+                function (ex, previousBufferedStart, previousBufferedEnd) { // onCaughtExceptionCallback
                     assert_equals(ex.name, 'QuotaExceededError');
-                    test.done();
+                    // Verify that the state looks like appendBuffer stops executing its steps if the prepare append
+                    // algorithm aborts after throwing `QuotaExceededError`.
+
+                    assert_false(sourceBuffer.updating, 'updating should be false if appendBuffer throws QuotaExceededError');
+
+                    sourceBuffer.onupdatestart = test.unreached_func('buffer append, signalled by updatestart, should not be in progress');
+                    sourceBuffer.onupdate = test.unreached_func('buffer append, signalled by update, should not be in progress');
+                    sourceBuffer.onupdateend = test.unreached_func('buffer append, signalled by updateend, should not be in progress');
+
+                    // Ensure the async append was not actually run by letting their event handlers have some time before we proceed.
+                    test.step_timeout(function() {
+                        // At least the first doAppendDataFunc call shouldn't throw QuotaExceededError, unless the audio
+                        // test media itself is too large for one append. If that's the case, then many other tests should
+                        // fail and the choice of test media may need to be changed.
+                        assert_equals(sourceBuffer.buffered.length, 1, 'test expects precisely one buffered range here');
+                        assert_equals(sourceBuffer.buffered.start(0), previousBufferedStart, 'QuotaExceededError should not update buffered media');
+                        assert_equals(sourceBuffer.buffered.end(0), previousBufferedEnd, 'QuotaExceededError should not update buffered media');
+
+                        // Note, it's difficult to verify that the user agent does not "Add |data| to the end of the |input buffer|" if
+                        // the attempted appendBuffer() of that |data| caused QuotaExceededError.
+                        test.done();
+                    }, 1000 /* 1 second, modifiable by harness multiplier */ );
                 });
         });
     }, 'Appending data repeatedly should fill up the buffer and throw a QuotaExceededError when buffer is full.');
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/audio-encoder.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/audio-encoder.any.js
index c246ccc..0f0c01f9 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/audio-encoder.any.js
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/audio-encoder.any.js
@@ -109,11 +109,17 @@
   encoder.close();
   assert_greater_than_equal(outputs.length, data_count);
   assert_equals(outputs[0].timestamp, 0, "first chunk timestamp");
+  let total_encoded_duration = 0
   for (chunk of outputs) {
     assert_greater_than(chunk.byteLength, 0);
     assert_greater_than_equal(timestamp_us, chunk.timestamp);
-    assert_greater_than_equal(chunk.duration, 0);
+    assert_greater_than(chunk.duration, 0);
+    total_encoded_duration += chunk.duration;
   }
+
+  // The total duration might be padded with silence.
+  assert_greater_than_equal(
+      total_encoded_duration, total_duration_s * 1_000_000);
 }, 'Simple audio encoding');
 
 promise_test(async t => {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/parser/xhtml-alternate-entities-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/parser/xhtml-alternate-entities-expected.png
index 25c33ef..79f74b5 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/parser/xhtml-alternate-entities-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/parser/xhtml-alternate-entities-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js
index e99c67c7..126faf6 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js
@@ -62,8 +62,8 @@
 
   function testNewElementStyles() {
     function callback(response) {
-      if (response[Protocol.Error]) {
-        TestRunner.addResult('error: ' + response[Protocol.Error]);
+      if (response.getError()) {
+        TestRunner.addResult('error: ' + response.getError());
         return;
       }
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/selector-source-data.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/selector-source-data.js
index ecf0dac..92737be9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/selector-source-data.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/selector-source-data.js
@@ -23,8 +23,8 @@
 
   async function nodeFound(node) {
     var response = await TestRunner.CSSAgent.invoke_getMatchedStylesForNode({nodeId: node.id});
-    if (response[Protocol.Error]) {
-      TestRunner.addResult('Failed to get styles: ' + response[Protocol.Error]);
+    if (response.getError()) {
+      TestRunner.addResult('Failed to get styles: ' + response.getError());
       return;
     }
     ElementsTestRunner.dumpRuleMatchesArray(response.matchedCSSRules);
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-new-API.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-new-API.js
index b6e0934f..32222f9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-new-API.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-new-API.js
@@ -97,8 +97,8 @@
       }
 
       function matchedCallback(response) {
-        if (response[Protocol.Error]) {
-          TestRunner.addResult('error: ' + response[Protocol.Error]);
+        if (response.getError()) {
+          TestRunner.addResult('error: ' + response.getError());
           TestRunner.completeTest();
           return;
         }
@@ -176,8 +176,8 @@
     function test_tableStyles(next) {
       async function nodeCallback(node) {
         var response = await TestRunner.CSSAgent.invoke_getInlineStylesForNode({nodeId: node.id});
-        if (response[Protocol.Error]) {
-          TestRunner.addResult('error: ' + response[Protocol.Error]);
+        if (response.getError()) {
+          TestRunner.addResult('error: ' + response.getError());
           next();
           return;
         }
@@ -236,8 +236,8 @@
       }
 
       var response = await TestRunner.CSSAgent.invoke_getMatchedStylesForNode({nodeId: bodyId});
-      if (response[Protocol.Error]) {
-        TestRunner.addResult('error: ' + response[Protocol.Error]);
+      if (response.getError()) {
+        TestRunner.addResult('error: ' + response.getError());
         next();
         return;
       }
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-compile-and-run.js b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-compile-and-run.js
index 7673e41..bce10ef 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-compile-and-run.js
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-compile-and-run.js
@@ -36,14 +36,14 @@
       var response = await TestRunner.RuntimeAgent.invoke_compileScript(
           {expression, sourceURL: 'test.js', persistScript: true, executionContextId: contextId});
 
-      TestRunner.assertTrue(!response[Protocol.Error]);
+      TestRunner.assertTrue(!response.getError());
       TestRunner.assertTrue(!response.exceptionDetails);
       TestRunner.assertTrue(!!response.scriptId);
 
       TestRunner.addResult('Running script');
       response = await TestRunner.RuntimeAgent.invoke_runScript(
           {scriptId: response.scriptId, executionContextId: contextId, objectGroup: 'console', silent: false});
-      TestRunner.assertTrue(!response[Protocol.Error]);
+      TestRunner.assertTrue(!response.getError());
       TestRunner.assertTrue(!response.exceptionDetails);
       TestRunner.addResult('Script result: ' + response.result.value);
       next();
@@ -54,14 +54,14 @@
       TestRunner.addResult('Compiling script');
       var response = await TestRunner.RuntimeAgent.invoke_compileScript(
           {expression, sourceURL: 'test.js', persistScript: true, executionContextId: contextId});
-      TestRunner.assertTrue(!response[Protocol.Error]);
+      TestRunner.assertTrue(!response.getError());
       TestRunner.assertTrue(!response.exceptionDetails);
       TestRunner.assertTrue(!!response.scriptId);
 
       TestRunner.addResult('Running script');
       response = await TestRunner.RuntimeAgent.invoke_runScript(
           {scriptId: response.scriptId, executionContextId: contextId, objectGroup: 'console', silent: false});
-      TestRunner.assertTrue(!response[Protocol.Error]);
+      TestRunner.assertTrue(!response.getError());
       TestRunner.assertTrue(!!response.exceptionDetails);
       printExceptionDetails(response.exceptionDetails);
       next();
@@ -72,7 +72,7 @@
       TestRunner.addResult('Compiling script');
       var response = await TestRunner.RuntimeAgent.invoke_compileScript(
           {expression, sourceURL: 'test.js', persistScript: true, executionContextId: contextId});
-      TestRunner.assertTrue(!response[Protocol.Error]);
+      TestRunner.assertTrue(!response.getError());
       TestRunner.assertTrue(!!response.exceptionDetails);
       TestRunner.assertTrue(!response.scriptId);
       printExceptionDetails(response.exceptionDetails);
diff --git a/third_party/blink/web_tests/platform/linux/fast/parser/xhtml-alternate-entities-expected.png b/third_party/blink/web_tests/platform/linux/fast/parser/xhtml-alternate-entities-expected.png
index f95e579..954d31b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/parser/xhtml-alternate-entities-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/parser/xhtml-alternate-entities-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/parser/xhtml-alternate-entities-expected.png b/third_party/blink/web_tests/platform/mac/fast/parser/xhtml-alternate-entities-expected.png
index 6508f8e..06638e2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/parser/xhtml-alternate-entities-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/parser/xhtml-alternate-entities-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/parser/xhtml-alternate-entities-expected.png b/third_party/blink/web_tests/platform/win/fast/parser/xhtml-alternate-entities-expected.png
index 5b26601ed..3a23e07 100644
--- a/third_party/blink/web_tests/platform/win/fast/parser/xhtml-alternate-entities-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/parser/xhtml-alternate-entities-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index bf52ead..d54a65b 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -244,6 +244,8 @@
     method forward
     method goTo
     method navigate
+    method reload
+    method updateCurrent
     setter onnavigate
     setter onnavigateerror
     setter onnavigatesuccess
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc
index a619dc5..619e131 100644
--- a/third_party/leveldatabase/env_chromium.cc
+++ b/third_party/leveldatabase/env_chromium.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/check_op.h"
 #include "base/cxx17_backports.h"
+#include "base/files/file_error_or.h"
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
 #include "base/macros.h"
@@ -33,7 +34,6 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
 #include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
 #include "third_party/leveldatabase/chromium_logger.h"
 #include "third_party/leveldatabase/leveldb_chrome.h"
@@ -52,7 +52,7 @@
 namespace {
 
 template <typename ValueType>
-using FileErrorOr = storage::FileErrorOr<ValueType>;
+using FileErrorOr = base::FileErrorOr<ValueType>;
 
 // After this limit we don't bother doing file eviction for leveldb for speed,
 // memory usage, and simplicity.
@@ -879,7 +879,8 @@
   Status result;
   const base::FilePath path = base::FilePath::FromUTF8Unsafe(fname);
   Retrier retrier;
-  FileErrorOr<std::unique_ptr<storage::FilesystemProxy::FileLock>> lock_result;
+  FileErrorOr<std::unique_ptr<storage::FilesystemProxy::FileLock>> lock_result =
+      base::File::Error::FILE_ERROR_FAILED;
   do {
     lock_result = filesystem_->LockFile(path);
   } while (lock_result.is_error() && retrier.ShouldKeepTrying());
diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium
index f27b0848..a9627a0f 100644
--- a/third_party/protobuf/README.chromium
+++ b/third_party/protobuf/README.chromium
@@ -85,3 +85,9 @@
 
   Fixes a bug in delimited message parsing and serialization, as fixed in
   protobuf commit with hash bd9a7104e11740e4bcfbde46c190c2d908ef331a
+
+- 0024-fix-thread-priority-on-protobuf-initialization.patch
+
+  Adds hooks to allow running callback before and after protobuf initialisation.
+  These hooks allows to fix priority inversion by injecting code that boost
+  the thread priority while loading protobufs (https://crbug.com/1218253).
diff --git a/third_party/protobuf/patches/0024-fix-thread-priority-on-protobuf-initialization.patch b/third_party/protobuf/patches/0024-fix-thread-priority-on-protobuf-initialization.patch
new file mode 100644
index 0000000..4e8d27446
--- /dev/null
+++ b/third_party/protobuf/patches/0024-fix-thread-priority-on-protobuf-initialization.patch
@@ -0,0 +1,54 @@
+diff --git a/src/google/protobuf/generated_message_util.cc b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
+index e882587c6e7c..12ea55678dbe 100644
+--- a/third_party/protobuf/src/google/protobuf/generated_message_util.cc
++++ b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
+@@ -61,6 +61,9 @@ namespace google {
+ namespace protobuf {
+ namespace internal {
+
++InitSCCCallback g_init_scc_enter = nullptr;
++InitSCCCallback g_init_scc_leave = nullptr;
++
+ void DestroyMessage(const void* message) {
+   static_cast<const MessageLite*>(message)->~MessageLite();
+ }
+@@ -82,6 +85,11 @@ void InitProtobufDefaults() {
+   (void)is_inited;
+ }
+
++void RegisterInitSCCHooks(InitSCCCallback enter, InitSCCCallback leave) {
++  g_init_scc_enter = enter;
++  g_init_scc_leave = leave;
++}
++
+ const std::string& GetEmptyString() {
+   InitProtobufDefaults();
+   return GetEmptyStringAlreadyInited();
+@@ -820,7 +828,12 @@ void InitSCCImpl(SCCInfoBase* scc) {
+   InitProtobufDefaults();
+   mu.Lock();
+   runner.store(me, std::memory_order_relaxed);
++
++  if (g_init_scc_enter)
++    g_init_scc_enter();
+   InitSCC_DFS(scc);
++  if (g_init_scc_leave)
++    g_init_scc_leave();
+
+ #ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
+   runner.store(std::thread::id{}, std::memory_order_relaxed);
+diff --git a/src/google/protobuf/generated_message_util.h b/third_party/protobuf/src/google/protobuf/generated_message_util.h
+index e9b67bd15204..0e7102228142 100644
+--- a/third_party/protobuf/src/google/protobuf/generated_message_util.h
++++ b/third_party/protobuf/src/google/protobuf/generated_message_util.h
+@@ -87,6 +87,10 @@ inline To DownCast(From& f) {
+
+ PROTOBUF_EXPORT void InitProtobufDefaults();
+
++using InitSCCCallback = void (*)(void);
++PROTOBUF_EXPORT void RegisterInitSCCHooks(InitSCCCallback enter,
++                                          InitSCCCallback leave);
++
+ // This used by proto1
+ PROTOBUF_EXPORT const ::std::string& GetEmptyString();
+
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_util.cc b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
index e882587..12ea556 100644
--- a/third_party/protobuf/src/google/protobuf/generated_message_util.cc
+++ b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
@@ -61,6 +61,9 @@
 namespace protobuf {
 namespace internal {
 
+InitSCCCallback g_init_scc_enter = nullptr;
+InitSCCCallback g_init_scc_leave = nullptr;
+
 void DestroyMessage(const void* message) {
   static_cast<const MessageLite*>(message)->~MessageLite();
 }
@@ -82,6 +85,11 @@
   (void)is_inited;
 }
 
+void RegisterInitSCCHooks(InitSCCCallback enter, InitSCCCallback leave) {
+  g_init_scc_enter = enter;
+  g_init_scc_leave = leave;
+}
+
 const std::string& GetEmptyString() {
   InitProtobufDefaults();
   return GetEmptyStringAlreadyInited();
@@ -820,7 +828,12 @@
   InitProtobufDefaults();
   mu.Lock();
   runner.store(me, std::memory_order_relaxed);
+
+  if (g_init_scc_enter)
+    g_init_scc_enter();
   InitSCC_DFS(scc);
+  if (g_init_scc_leave)
+    g_init_scc_leave();
 
 #ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
   runner.store(std::thread::id{}, std::memory_order_relaxed);
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_util.h b/third_party/protobuf/src/google/protobuf/generated_message_util.h
index e9b67bd..b8b7c7f 100644
--- a/third_party/protobuf/src/google/protobuf/generated_message_util.h
+++ b/third_party/protobuf/src/google/protobuf/generated_message_util.h
@@ -87,6 +87,10 @@
 
 PROTOBUF_EXPORT void InitProtobufDefaults();
 
+using InitSCCCallback = void (*)();
+PROTOBUF_EXPORT void RegisterInitSCCHooks(InitSCCCallback enter,
+                                          InitSCCCallback leave);
+
 // This used by proto1
 PROTOBUF_EXPORT const ::std::string& GetEmptyString();
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 625fced..7bba660 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -3625,6 +3625,14 @@
   <int value="4" label="Account check failed"/>
 </enum>
 
+<enum name="ArcAuthAndroidIdSource">
+  <summary>Defines the source of AndroidId during provisioning of ARC.</summary>
+  <int value="0" label="Missing"/>
+  <int value="1" label="Cached"/>
+  <int value="2" label="GService flag"/>
+  <int value="3" label="GmsProxy api"/>
+</enum>
+
 <enum name="ArcAuthMainAccountResolutionStatus">
   <int value="0" label="No hash code no account"/>
   <int value="1" label="No hash code for single account"/>
@@ -49145,6 +49153,7 @@
   <int value="-78035185" label="custom_summary"/>
   <int value="-77872983" label="BookmarkAppsMac:disabled"/>
   <int value="-77789682" label="SharingPreferVapid:disabled"/>
+  <int value="-77328559" label="IncognitoReauthenticationForAndroid:enabled"/>
   <int value="-77230883"
       label="OmniboxOnFocusSuggestionsContextualWebAllowSRP:enabled"/>
   <int value="-77084779" label="ExperimentalFlingAnimation:enabled"/>
@@ -50232,6 +50241,7 @@
   <int value="779703052" label="ChromeOSAmbientMode:enabled"/>
   <int value="779849093" label="OfflinePagesCTSuppressNotifications:disabled"/>
   <int value="780743733" label="QueryTilesLocalOrdering:disabled"/>
+  <int value="781085897" label="IncognitoReauthenticationForAndroid:disabled"/>
   <int value="781573553" label="UnifiedPasswordManagerAndroid:enabled"/>
   <int value="781785788" label="ClipboardSuggestionContentHidden:disabled"/>
   <int value="782167080" label="enable-new-qp-input-view"/>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 537bc6f..5c658c5 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -317,6 +317,23 @@
   </token>
 </histogram>
 
+<histogram name="Arc.Auth.AndroidIdSource{ArcUserTypes}"
+    enum="ArcAuthAndroidIdSource" expires_after="2022-08-09">
+  <owner>mhasank@google.com</owner>
+  <owner>arc-core@google.com</owner>
+  <summary>
+    The source of AndroidId during ARC provisioning. Recorded when trying to
+    determine if the device is checked in. {ArcUserTypes}
+  </summary>
+  <token key="ArcUserTypes" variants="ArcUserTypes">
+    <variant name="">
+      <obsolete>
+        Base histogram. Use suffixes of this histogram instead.
+      </obsolete>
+    </variant>
+  </token>
+</histogram>
+
 <histogram name="Arc.Auth.Checkin.Attempts{ArcUserTypes}" units="attempts"
     expires_after="2022-07-04">
   <owner>mhasank@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 132e4a8..5770d371 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1077,6 +1077,16 @@
   <summary>Records the number of tabs in a template when it is saved.</summary>
 </histogram>
 
+<histogram name="Ash.DeskTemplate.UserTemplateCount" units="count"
+    expires_after="2022-07-14">
+  <owner>richui@chromium.org</owner>
+  <owner>janetmac@chromium.org</owner>
+  <summary>
+    Records the number of templates a user has saved when a template is saved or
+    deleted.
+  </summary>
+</histogram>
+
 <histogram name="Ash.DeskTemplate.WindowAndTabCount" units="count"
     expires_after="2022-07-14">
   <owner>richui@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 99f307a..1e448998 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -2429,6 +2429,15 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.Plugin.UpdateTime" units="ms" expires_after="2022-06-09">
+  <owner>cduvall@chromium.org</owner>
+  <owner>jam@chromium.org</owner>
+  <summary>
+    Measures the time it takes to update the plugin list. This can happen, for
+    example, during Navigator.plugins.get.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Blink.PrePaint.UpdateTime" units="microseconds"
     expires_after="2022-01-02">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index e3c4b69a..420b018 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -793,6 +793,17 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.Liveness.PingResponseTime" units="ms"
+    expires_after="2022-08-05">
+  <owner>rtinkoff@google.com</owner>
+  <owner>xiyuan@google.com</owner>
+  <summary>
+    Reports the time (ms) elapsed between sending of a LivenessChecker ping and
+    receipt of the response. Recorded when LivenessChecker receives a ping
+    response.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.Logging.{LogType}EntryCountPerDay"
     units="log entries per day" expires_after="2021-07-31">
   <owner>yoshiki@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index b149fca..a0232d3 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3879,6 +3879,20 @@
 
 <histogram name="Conversions.Storage.Sql.InitStatus"
     enum="ConversionStorageSqlInitStatus" expires_after="2021-12-12">
+  <obsolete>
+    Replaced in 2021-08 with Conversions.Storage.Sql.InitStatus2. Due to a bug,
+    this metric would not properly record kFailedToInitializeSchema.
+  </obsolete>
+  <owner>johnidel@chromium.org</owner>
+  <owner>csharrison@chromium.org</owner>
+  <summary>
+    Records initialisation statuses of ConversionStorageSql. Note: currently
+    ConversionStorageSql is initialised lazily.
+  </summary>
+</histogram>
+
+<histogram name="Conversions.Storage.Sql.InitStatus2"
+    enum="ConversionStorageSqlInitStatus" expires_after="2021-12-12">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -14732,6 +14746,9 @@
 
 <histogram name="Setup.Install.DeleteAppLauncherClientsKey"
     enum="BooleanDeletedOrNot" expires_after="2021-03-22">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>src/chrome/installer/OWNERS</owner>
   <summary>
@@ -14742,6 +14759,9 @@
 
 <histogram name="Setup.Install.DeleteBinariesClientsKey"
     enum="BooleanDeletedOrNot" expires_after="2021-03-22">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>src/chrome/installer/OWNERS</owner>
   <summary>
@@ -14752,6 +14772,9 @@
 
 <histogram name="Setup.Install.DeleteIExecuteCommandClassKey"
     enum="BooleanDeletedOrNot" expires_after="2021-03-22">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>src/chrome/installer/OWNERS</owner>
   <summary>
@@ -14763,6 +14786,9 @@
 
 <histogram name="Setup.Install.DeleteInstallExtensionCommand"
     enum="BooleanDeletedOrNot" expires_after="2021-03-22">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>src/chrome/installer/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 1d76ecd4..f6e7c59c 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.AllPages.PercentNetworkBytesAds"
-    units="%" expires_after="2021-08-09">
+    units="%" expires_after="2022-08-09">
   <owner>alexmt@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index a92b13c..522c6bb 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -993,6 +993,17 @@
   </summary>
 </histogram>
 
+<histogram
+    name="SafeBrowsing.NavigationObserver.NavigationEventsRecordedLength"
+    units="count" expires_after="2022-08-10">
+  <owner>bdea@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Count of how many NavigationEvents are recorded prior to appending recent
+    navigations to the referrer chain.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.PakIntegrity.{PakFile}" enum="BooleanSuccess"
     expires_after="2022-05-01">
   <owner>rsesek@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/subresource/histograms.xml b/tools/metrics/histograms/metadata/subresource/histograms.xml
index f30e5a78..f1ab878 100644
--- a/tools/metrics/histograms/metadata/subresource/histograms.xml
+++ b/tools/metrics/histograms/metadata/subresource/histograms.xml
@@ -243,7 +243,7 @@
 </histogram>
 
 <histogram name="SubresourceFilter.DocumentLoad.SubframeFilteringDelay.Allowed"
-    units="microseconds" expires_after="2021-08-09">
+    units="microseconds" expires_after="2022-08-09">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -433,7 +433,7 @@
 
 <histogram
     name="SubresourceFilter.MainFrameLoad.RulesetIsAvailableAnyActivationLevel"
-    enum="BooleanAvailable" expires_after="2021-08-09">
+    enum="BooleanAvailable" expires_after="2022-08-09">
   <owner>alexmt@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index ee6010ac..a6b3070 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -509,7 +509,8 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="Sync.E2ELatency" units="ms" expires_after="M94">
+<histogram base="true" name="Sync.E2ELatency" units="ms"
+    expires_after="2022-02-01">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml
index 029c9c70..6bb964f 100644
--- a/tools/metrics/histograms/metadata/windows/histograms.xml
+++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -384,6 +384,9 @@
 
 <histogram name="Windows.TmpFileDeleter.FailCount" units="files"
     expires_after="2021-08-09">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>etiennep@chromium.org</owner>
   <summary>
@@ -398,6 +401,9 @@
 
 <histogram name="Windows.TmpFileDeleter.SuccessCount" units="files"
     expires_after="2021-08-09">
+  <obsolete>
+    Removed in M94.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <owner>etiennep@chromium.org</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index edc1c2f..d3bf46a 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,20 +5,20 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "8180137cc747ee73911b4f0711033e11a56d28bc",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/02c4020f875f43cefcad9222d2354c49b5b20a90/trace_processor_shell.exe"
+            "hash": "a8b866bd834dd410f7f5c4e3e7939db581d4286c",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/3f8fabd85f1c3c15a2a98a40fe71e3eb165fba5e/trace_processor_shell.exe"
         },
         "mac": {
             "hash": "8452a92a4d2f47b9fe48579afde153ce345fe63a",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/02c4020f875f43cefcad9222d2354c49b5b20a90/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/bb09784511ef291082ade44a2d3d05dd3e45d30d/trace_processor_shell"
         },
         "linux_arm64": {
             "hash": "5074025a2898ec41a872e70a5719e417acb0a380",
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "linux": {
-            "hash": "2fe9fdf8fd013acc318ee44e7dd56f55dfb8e604",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/02c4020f875f43cefcad9222d2354c49b5b20a90/trace_processor_shell"
+            "hash": "5ac0292f3b6531e8428ccefcf5318e457b12ab6c",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/3f8fabd85f1c3c15a2a98a40fe71e3eb165fba5e/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/page_sets/desktop_ui/webui_tab_strip_story.py b/tools/perf/page_sets/desktop_ui/webui_tab_strip_story.py
index ae4ad8e8..5b85dc2 100644
--- a/tools/perf/page_sets/desktop_ui/webui_tab_strip_story.py
+++ b/tools/perf/page_sets/desktop_ui/webui_tab_strip_story.py
@@ -24,17 +24,22 @@
 ]
 
 WEBUI_TAB_STRIP_CUSTOM_METRIC_NAMES = [
-    'TabStripUIHandler:HandleGetGroupVisualData',
-    'TabStripUIHandler:HandleGetLayout',
-    'TabStripUIHandler:HandleGetTabs',
-    'TabStripUIHandler:HandleGetThemeColors',
-    'TabStripUIHandler:HandleSetThumbnailTracked',
-    'TabStripUIHandler:HandleThumbnailUpdate',
-    'TabStripUIHandler:NotifyLayoutChanged',
-    'TabStripUIHandler:OnTabGroupChanged',
-    'TabStripUIHandler:OnTabStripModelChanged',
-    'TabStripUIHandler:TabChangedAt',
-    'TabStripUIHandler:TabGroupedStateChanged',
+    'Jank',
+    'Tab.Preview.CompressJPEG',
+    'Tab.Preview.CompressJPEGWithFlow',
+    'Tab.Preview.VideoCapture',
+    'Tab.Preview.VideoCaptureFrameReceived',
+    'TabStripPageHandler:HandleGetGroupVisualData',
+    'TabStripPageHandler:HandleGetLayout',
+    'TabStripPageHandler:HandleGetTabs',
+    'TabStripPageHandler:HandleGetThemeColors',
+    'TabStripPageHandler:HandleSetThumbnailTracked',
+    'TabStripPageHandler:HandleThumbnailUpdate',
+    'TabStripPageHandler:NotifyLayoutChanged',
+    'TabStripPageHandler:OnTabGroupChanged',
+    'TabStripPageHandler:OnTabStripModelChanged',
+    'TabStripPageHandler:TabChangedAt',
+    'TabStripPageHandler:TabGroupedStateChanged',
 ]
 
 WEBUI_TAB_STRIP_URL = 'chrome://tab-strip.top-chrome/'
@@ -68,6 +73,8 @@
 
   def WillStartTracing(self, chrome_trace_config):
     super(WebUITabStripStory, self).WillStartTracing(chrome_trace_config)
+    chrome_trace_config.category_filter.AddIncludedCategory('benchmark')
+    chrome_trace_config.category_filter.AddIncludedCategory('ui')
     chrome_trace_config.EnableUMAHistograms(*WEBUI_TAB_STRIP_BENCHMARK_UMA)
 
 
diff --git a/tools/typescript/definitions/management.d.ts b/tools/typescript/definitions/management.d.ts
index efd4f07..d538a4b 100644
--- a/tools/typescript/definitions/management.d.ts
+++ b/tools/typescript/definitions/management.d.ts
@@ -2,15 +2,44 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/** @fileoverview Definitions for chrome.bookmarkManagerPrivate API. */
+/** @fileoverview Definitions for chrome.management API. */
 // TODO(crbug.com/1203307): Auto-generate this file.
 
 declare namespace chrome {
   export namespace management {
+    export interface ExtensionInfo {
+      id: string;
+      name: string;
+      shortName: string;
+      description: string;
+      version: string;
+      versionName?: string;
+      mayDisable: boolean;
+      mayEnable?: boolean;
+      enabled: boolean;
+      // TODO(crbug.com/1189595): Define commented out fields as needed.
+      //disabledReason?: ExtensionDisabledReason;
+      isApp: boolean;
+      //type: ExtensionType;
+      appLaunchUrl?: string;
+      homepageUrl?: string;
+      updateUrl?: string;
+      offlineEnabled: boolean;
+      optionsUrl: string;
+      //icons?: Array<IconInfo>;
+      permissions: Array<string>;
+      hostPermissions: Array<string>;
+      //installType?: ExtensionInstallType;
+      //launchType?: LaunchType;
+      //availableLaunchTypes?: Array<LaunchType>;
+    }
+
     export interface UninstallOptions {
       showConfirmDialog?: boolean;
     }
 
+    export function get(
+        id: string, callback?: (info: ExtensionInfo) => void): void;
     export function uninstall(
         id: string, options?: UninstallOptions, callback?: () => void): void;
     export function setEnabled(
diff --git a/tools/typescript/definitions/settings_private.d.ts b/tools/typescript/definitions/settings_private.d.ts
index d324129c..6a64138 100644
--- a/tools/typescript/definitions/settings_private.d.ts
+++ b/tools/typescript/definitions/settings_private.d.ts
@@ -45,5 +45,8 @@
       extensionId?: string;
       extensionCanBeDisabled?: boolean;
     }
+
+    export function getDefaultZoom(callback: (zoom: number) => void): void;
+    export function setDefaultZoom(zoom: number): void;
   }
 }
diff --git a/tools/vscode/tasks.json5 b/tools/vscode/tasks.json5
index 683db8c..57941b1 100644
--- a/tools/vscode/tasks.json5
+++ b/tools/vscode/tasks.json5
@@ -1,8 +1,10 @@
 {
   // Note!
-  // You can set the value used for ${config:chrome.outputDir} in your settings.json
+  // Set the value used for ${config:chrome.outputDir} in your settings.json
   // file with a line like:
-  // "chrome.outputDir": "/path/to/chromium/src/out/Debug",
+  //   "chrome.outputDir": "/path/to/chromium/src/out/current_link",
+  // Then run "0-set_chrome_output_directory" to set the `current_link`
+  // symbolic link (see below).
   "version": "2.0.0",
   "runner": "terminal",
   // The default problem matcher matches build output, which is useful for most tasks.
@@ -58,6 +60,12 @@
         "/path/to/chromium/src/out/Debug",
         "/path/to/chromium/src/out/Debug_x86"
       ]
+    },
+    {
+      "type": "promptString",
+      "id": "gtestFilter",
+      "description": "Filter for 4-test_current_file_with_filter",
+      "default": "*"
     }
   ],
   "tasks": [
@@ -103,31 +111,41 @@
     {
       "label": "3-test_current_file",
       "type": "shell",
-      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run_all ${file}"
+      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run-all ${file}"
     },
     {
-      "label": "4-test_current_directory",
+      "label": "4-test_current_file_with_filter",
       "type": "shell",
-      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run_all ${fileDirname}"
+      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --gtest_filter ${input:gtestFilter} ${file}"
     },
     {
-      "label": "5-build_current_file",
+      "label": "5-test_current_line",
+      "type": "shell",
+      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --line ${lineNumber} ${file}"
+    },
+    {
+      "label": "6-test_current_directory",
+      "type": "shell",
+      "command": "${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run-all ${fileDirname}"
+    },
+    {
+      "label": "7-build_current_file",
       "type": "shell",
       "command": "compile_single_file --build-dir=${config:chrome.outputDir} --file-path=${file}"
     },
     // Some more specific build tasks, which hard-code the output directory.
     {
-      "label": "6-build_chrome_debug",
+      "label": "8-build_chrome_debug",
       "type": "shell",
       "command": "autoninja -C ${workspaceFolder}/out/Debug chrome"
     },
     {
-      "label": "7-build_chrome_release",
+      "label": "9-build_chrome_release",
       "type": "shell",
       "command": "autoninja -C ${workspaceFolder}/out/Release chrome"
     },
     {
-      "label": "8-build_test_debug",
+      "label": "10-build_test_debug",
       "type": "shell",
       "command": "autoninja -C ${workspaceFolder}/out/Debug unit_tests components_unittests browser_tests"
     }
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_utils_win.cc b/ui/accessibility/platform/ax_platform_node_delegate_utils_win.cc
index 2e1c63c7..dc00f97b 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate_utils_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_delegate_utils_win.cc
@@ -20,6 +20,11 @@
   //
   // IValueProvider must be implemented by controls such as the color picker
   // selection control [...]
+  //
+  // We also support the Value pattern on platform documents mostly for
+  // historical reasons - it was supported as a way to get the URL of a document
+  // via IA2's get_accValue, and the UIA bridge also populates an IValueProvider
+  // with the same information.
 
   // https://www.w3.org/TR/html-aam-1.0/
   // The HTML AAM maps "href [a; area]" to UIA Value.Value
@@ -27,7 +32,8 @@
          IsReadOnlySupported(delegate->GetRole()) ||
          IsLink(delegate->GetRole()) ||
          delegate->GetRole() == ax::mojom::Role::kColorWell ||
-         delegate->IsCellOrHeaderOfARIAGrid();
+         delegate->IsCellOrHeaderOfARIAGrid() ||
+         IsPlatformDocument(delegate->GetRole());
 }
 
 }  // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 2dbc785b..0cb8bbb 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -14,6 +14,8 @@
 #include "base/containers/contains.h"
 #include "base/json/json_reader.h"
 #include "base/run_loop.h"
+#include "base/strings/string_util_win.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
 #include "base/win/atl.h"
@@ -6046,7 +6048,7 @@
   Init(update);
 
   EXPECT_EQ(PatternSet({UIA_ScrollItemPatternId, UIA_TextEditPatternId,
-                        UIA_TextPatternId}),
+                        UIA_TextPatternId, UIA_ValuePatternId}),
             GetSupportedPatternsFromNodeId(root_id));
 
   EXPECT_EQ(PatternSet({UIA_ScrollItemPatternId, UIA_ValuePatternId,
@@ -7118,11 +7120,27 @@
                          static_cast<int>(ax::mojom::Restriction::kReadOnly));
   root.child_ids.push_back(child3.id);
 
-  Init(root, child1, child2, child3);
+  const char url[] = "https://localhost";
+  AXTreeUpdate update;
+  update.has_tree_data = true;
+  update.tree_data.url = url;
+  update.root_id = root.id;
+  update.nodes.push_back(root);
+  update.nodes.push_back(child1);
+  update.nodes.push_back(child2);
+  update.nodes.push_back(child3);
+  Init(update);
 
   ScopedBstr bstr_value;
 
   EXPECT_HRESULT_SUCCEEDED(
+      QueryInterfaceFromNode<IValueProvider>(GetRootAsAXNode())
+          ->get_Value(bstr_value.Receive()));
+  EXPECT_STREQ(url,
+               base::UTF16ToASCII(base::as_u16cstr(bstr_value.Get())).c_str());
+  bstr_value.Reset();
+
+  EXPECT_HRESULT_SUCCEEDED(
       QueryInterfaceFromNode<IValueProvider>(GetRootAsAXNode()->children()[0])
           ->get_Value(bstr_value.Receive()));
   EXPECT_STREQ(L"3", bstr_value.Get());
@@ -7191,7 +7209,16 @@
                          static_cast<int>(ax::mojom::Restriction::kReadOnly));
   root.child_ids.push_back(child3.id);
 
-  Init(root, child1, child2, child3);
+  const char url[] = "https://localhost";
+  AXTreeUpdate update;
+  update.has_tree_data = true;
+  update.tree_data.url = url;
+  update.root_id = root.id;
+  update.nodes.push_back(root);
+  update.nodes.push_back(child1);
+  update.nodes.push_back(child2);
+  update.nodes.push_back(child3);
+  Init(update);
 
   ComPtr<IValueProvider> root_provider =
       QueryInterfaceFromNode<IValueProvider>(GetRootAsAXNode());
@@ -7204,9 +7231,14 @@
 
   ScopedBstr bstr_value;
 
+  EXPECT_UIA_ELEMENTNOTENABLED(root_provider->SetValue(L"https://foo"));
+  EXPECT_HRESULT_SUCCEEDED(root_provider->get_Value(bstr_value.Receive()));
+  EXPECT_STREQ(url,
+               base::UTF16ToASCII(base::as_u16cstr(bstr_value.Get())).c_str());
+  bstr_value.Reset();
+
   // Note: TestAXNodeWrapper::AccessibilityPerformAction will
   // modify the value when the kSetValue action is fired.
-
   EXPECT_UIA_ELEMENTNOTENABLED(provider1->SetValue(L"2"));
   EXPECT_HRESULT_SUCCEEDED(provider1->get_Value(bstr_value.Receive()));
   EXPECT_STREQ(L"3", bstr_value.Get());
@@ -7260,6 +7292,11 @@
   BOOL is_readonly = false;
 
   EXPECT_HRESULT_SUCCEEDED(
+      QueryInterfaceFromNode<IValueProvider>(GetRootAsAXNode())
+          ->get_IsReadOnly(&is_readonly));
+  EXPECT_TRUE(is_readonly);
+
+  EXPECT_HRESULT_SUCCEEDED(
       QueryInterfaceFromNode<IValueProvider>(GetRootAsAXNode()->children()[0])
           ->get_IsReadOnly(&is_readonly));
   EXPECT_FALSE(is_readonly);
diff --git a/ui/base/x/selection_requestor.cc b/ui/base/x/selection_requestor.cc
index 2fd537c..a568701 100644
--- a/ui/base/x/selection_requestor.cc
+++ b/ui/base/x/selection_requestor.cc
@@ -9,6 +9,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "ui/base/x/selection_owner.h"
 #include "ui/base/x/selection_utils.h"
+#include "ui/base/x/x11_clipboard_helper.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 #include "ui/gfx/x/xproto.h"
@@ -40,8 +41,11 @@
 
 }  // namespace
 
-SelectionRequestor::SelectionRequestor(x11::Window x_window)
-    : x_window_(x_window), x_property_(x11::GetAtom(kChromeSelection)) {}
+SelectionRequestor::SelectionRequestor(x11::Window x_window,
+                                       XClipboardHelper* helper)
+    : x_window_(x_window),
+      helper_(helper),
+      x_property_(x11::GetAtom(kChromeSelection)) {}
 
 SelectionRequestor::~SelectionRequestor() = default;
 
@@ -224,17 +228,8 @@
     size_t events_size = events.size();
     for (; i < events_size; ++i) {
       auto& event = events[i];
-      if (auto* notify = event.As<x11::SelectionNotifyEvent>()) {
-        if (notify->requestor == x_window_) {
-          OnSelectionNotify(*notify);
-          event = x11::Event();
-        }
-      } else if (auto* prop = event.As<x11::PropertyNotifyEvent>()) {
-        if (CanDispatchPropertyEvent(*prop)) {
-          OnPropertyEvent(*prop);
-          event = x11::Event();
-        }
-      }
+      if (helper_->DispatchEvent(event))
+        event = x11::Event();
     }
     DCHECK_EQ(events_size, events.size());
   }
diff --git a/ui/base/x/selection_requestor.h b/ui/base/x/selection_requestor.h
index cd7b2e4..3d318f6 100644
--- a/ui/base/x/selection_requestor.h
+++ b/ui/base/x/selection_requestor.h
@@ -15,6 +15,7 @@
 
 namespace ui {
 class SelectionData;
+class XClipboardHelper;
 
 // Requests and later receives data from the X11 server through the selection
 // system.
@@ -25,7 +26,7 @@
 // implement per-component fast-paths.
 class COMPONENT_EXPORT(UI_BASE_X) SelectionRequestor {
  public:
-  explicit SelectionRequestor(x11::Window xwindow);
+  SelectionRequestor(x11::Window xwindow, XClipboardHelper* helper);
   SelectionRequestor(const SelectionRequestor&) = delete;
   SelectionRequestor& operator=(const SelectionRequestor&) = delete;
   ~SelectionRequestor();
@@ -112,6 +113,9 @@
   // Our X11 state.
   const x11::Window x_window_;
 
+  // Not owned.
+  XClipboardHelper* const helper_;
+
   // The property on |x_window_| set by the selection owner with the value of
   // the selection.
   const x11::Atom x_property_;
diff --git a/ui/base/x/selection_requestor_unittest.cc b/ui/base/x/selection_requestor_unittest.cc
index 0bffa98..ae177ba 100644
--- a/ui/base/x/selection_requestor_unittest.cc
+++ b/ui/base/x/selection_requestor_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/x/selection_utils.h"
+#include "ui/base/x/x11_clipboard_helper.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/gfx/x/connection.h"
 #include "ui/gfx/x/event.h"
@@ -52,11 +53,14 @@
   void SetUp() override {
     // Create a window for the selection requestor to use.
     x_window_ = x11::CreateDummyWindow();
-    requestor_ = std::make_unique<SelectionRequestor>(x_window_);
+    helper_ = std::make_unique<XClipboardHelper>(
+        base::BindRepeating([](ClipboardBuffer buffer) {}));
+    requestor_ = helper_->GetSelectionRequestorForTest();
   }
 
   void TearDown() override {
-    requestor_.reset();
+    helper_.reset();
+    requestor_ = nullptr;
     connection_->DestroyWindow({x_window_});
   }
 
@@ -65,7 +69,8 @@
   // |requestor_|'s window.
   x11::Window x_window_ = x11::Window::None;
 
-  std::unique_ptr<SelectionRequestor> requestor_;
+  std::unique_ptr<XClipboardHelper> helper_;
+  SelectionRequestor* requestor_ = nullptr;
 
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::SingleThreadTaskEnvironment::MainThreadType::UI};
@@ -107,7 +112,7 @@
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(&PerformBlockingConvertSelection,
-                                base::Unretained(requestor_.get()), selection,
+                                base::Unretained(requestor_), selection,
                                 target2, "Data2"));
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
@@ -117,8 +122,7 @@
       FROM_HERE,
       base::BindOnce(&SelectionRequestorTest::SendSelectionNotify,
                      base::Unretained(this), selection, target2, "Data2"));
-  PerformBlockingConvertSelection(requestor_.get(), selection, target1,
-                                  "Data1");
+  PerformBlockingConvertSelection(requestor_, selection, target1, "Data1");
 }
 
 }  // namespace ui
diff --git a/ui/base/x/x11_clipboard_helper.cc b/ui/base/x/x11_clipboard_helper.cc
index ef66362..20b359a 100644
--- a/ui/base/x/x11_clipboard_helper.cc
+++ b/ui/base/x/x11_clipboard_helper.cc
@@ -142,7 +142,8 @@
     : connection_(x11::Connection::Get()),
       x_root_window_(ui::GetX11RootWindow()),
       x_window_(x11::CreateDummyWindow("Chromium Clipboard Window")),
-      selection_requestor_(std::make_unique<SelectionRequestor>(x_window_)),
+      selection_requestor_(
+          std::make_unique<SelectionRequestor>(x_window_, this)),
       clipboard_owner_(connection_, x_window_, x11::GetAtom(kClipboard)),
       primary_owner_(connection_, x_window_, x11::Atom::PRIMARY) {
   DCHECK(selection_requestor_);
@@ -346,10 +347,10 @@
   return XClipboardHelper::TargetList(out);
 }
 
-void XClipboardHelper::OnEvent(const x11::Event& xev) {
+bool XClipboardHelper::DispatchEvent(const x11::Event& xev) {
   if (auto* request = xev.As<x11::SelectionRequestEvent>()) {
     if (request->owner != x_window_)
-      return;
+      return false;
     if (request->selection == x11::Atom::PRIMARY) {
       primary_owner_.OnSelectionRequest(*request);
     } else {
@@ -361,9 +362,11 @@
   } else if (auto* notify = xev.As<x11::SelectionNotifyEvent>()) {
     if (notify->requestor == x_window_)
       selection_requestor_->OnSelectionNotify(*notify);
+    else
+      return false;
   } else if (auto* clear = xev.As<x11::SelectionClearEvent>()) {
     if (clear->owner != x_window_)
-      return;
+      return false;
     if (clear->selection == x11::Atom::PRIMARY) {
       primary_owner_.OnSelectionClear(*clear);
     } else {
@@ -375,11 +378,24 @@
   } else if (auto* prop = xev.As<x11::PropertyNotifyEvent>()) {
     if (primary_owner_.CanDispatchPropertyEvent(*prop))
       primary_owner_.OnPropertyEvent(*prop);
-    if (clipboard_owner_.CanDispatchPropertyEvent(*prop))
+    else if (clipboard_owner_.CanDispatchPropertyEvent(*prop))
       clipboard_owner_.OnPropertyEvent(*prop);
-    if (selection_requestor_->CanDispatchPropertyEvent(*prop))
+    else if (selection_requestor_->CanDispatchPropertyEvent(*prop))
       selection_requestor_->OnPropertyEvent(*prop);
+    else
+      return false;
+  } else {
+    return false;
   }
+  return true;
+}
+
+SelectionRequestor* XClipboardHelper::GetSelectionRequestorForTest() {
+  return selection_requestor_.get();
+}
+
+void XClipboardHelper::OnEvent(const x11::Event& xev) {
+  DispatchEvent(xev);
 }
 
 x11::Atom XClipboardHelper::LookupSelectionForClipboardBuffer(
diff --git a/ui/base/x/x11_clipboard_helper.h b/ui/base/x/x11_clipboard_helper.h
index 79ce9f4..98f5b6e 100644
--- a/ui/base/x/x11_clipboard_helper.h
+++ b/ui/base/x/x11_clipboard_helper.h
@@ -91,6 +91,11 @@
   // ownership of it.
   void StoreCopyPasteDataAndWait();
 
+  // Returns true if the event was handled.
+  bool DispatchEvent(const x11::Event& xev);
+
+  SelectionRequestor* GetSelectionRequestorForTest();
+
  private:
   class TargetList;
 
diff --git a/ui/gl/dcomp_surface_registry.cc b/ui/gl/dcomp_surface_registry.cc
index 9a4a9b4..b876126 100644
--- a/ui/gl/dcomp_surface_registry.cc
+++ b/ui/gl/dcomp_surface_registry.cc
@@ -17,6 +17,7 @@
 
 base::UnguessableToken DCOMPSurfaceRegistry::RegisterDCOMPSurfaceHandle(
     base::win::ScopedHandle surface) {
+  DVLOG(1) << __func__;
   base::UnguessableToken token = base::UnguessableToken::Create();
   DCHECK(surface_handle_map_.find(token) == surface_handle_map_.end());
   surface_handle_map_[token] = std::move(surface);
@@ -24,6 +25,12 @@
   return token;
 }
 
+void DCOMPSurfaceRegistry::UnregisterDCOMPSurfaceHandle(
+    const base::UnguessableToken& token) {
+  DVLOG(1) << __func__;
+  surface_handle_map_.erase(token);
+}
+
 base::win::ScopedHandle DCOMPSurfaceRegistry::TakeDCOMPSurfaceHandle(
     const base::UnguessableToken& token) {
   DVLOG(1) << __func__;
diff --git a/ui/gl/dcomp_surface_registry.h b/ui/gl/dcomp_surface_registry.h
index cf77519..8f33b67 100644
--- a/ui/gl/dcomp_surface_registry.h
+++ b/ui/gl/dcomp_surface_registry.h
@@ -20,11 +20,17 @@
  public:
   static DCOMPSurfaceRegistry* GetInstance();
 
-  // `GpuServiceImpl` calls this when it receives the corresponding call from
-  // Browser process.
+  // Registers a surface handle and return the associated token, which will be
+  // sent to `MediaFoundationRendererClient` and then to `DCOMPTexture` to take
+  // the handle for direct composition rendering.
   base::UnguessableToken RegisterDCOMPSurfaceHandle(
       base::win::ScopedHandle surface);
 
+  // Unregisters the surface handle associated with `token`. Called when the
+  // `MediaFoundationRendererWrapper` with a registered handle is destructed.
+  // No-op if the handle has already been taken by `DCOMPTexture`.
+  void UnregisterDCOMPSurfaceHandle(const base::UnguessableToken& token);
+
   // `DCOMPTexture` calls this to take the ownership of the DCOMP surface handle
   // when it receives a token from the `MediaFoundationRendererClient` in the
   // render process.
diff --git a/ui/gl/gl_image_dcomp_surface.cc b/ui/gl/gl_image_dcomp_surface.cc
index 24fbdc0..c91f048 100644
--- a/ui/gl/gl_image_dcomp_surface.cc
+++ b/ui/gl/gl_image_dcomp_surface.cc
@@ -39,7 +39,9 @@
 }
 
 bool GLImageDCOMPSurface::BindTexImage(unsigned target) {
-  NOTREACHED();
+  // This should not be called via compositor. It is possible other code paths
+  // such as canvas2d drawImage with video might use `BindTexImage` to import
+  // the video into GL.
   return false;
 }
 
diff --git a/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc b/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
index 6d201d8..8822c0a 100644
--- a/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
+++ b/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
@@ -63,6 +63,7 @@
     device_ = std::make_unique<GtkPrimarySelectionDevice>(
         connection_, gtk_primary_selection_device_manager_get_device(
                          device_manager_.get(), connection_->seat()));
+    connection_->ScheduleFlush();
   }
   DCHECK(device_);
   return device_.get();
@@ -73,6 +74,7 @@
     GtkPrimarySelectionSource::Delegate* delegate) {
   auto* data_source =
       gtk_primary_selection_device_manager_create_source(device_manager_.get());
+  connection_->ScheduleFlush();
   return std::make_unique<GtkPrimarySelectionSource>(data_source, connection_,
                                                      delegate);
 }
diff --git a/ui/ozone/platform/wayland/host/wayland_clipboard.h b/ui/ozone/platform/wayland/host/wayland_clipboard.h
index 65c31be..3471f9a 100644
--- a/ui/ozone/platform/wayland/host/wayland_clipboard.h
+++ b/ui/ozone/platform/wayland/host/wayland_clipboard.h
@@ -58,6 +58,7 @@
   bool IsSelectionBufferAvailable() const override;
 
  private:
+  friend class WaylandClipboardTest;
   // Get the wl::Clipboard instance owning a given |buffer|. Can return null in
   // case |buffer| is unsupported. E.g: primary selection is not available.
   wl::Clipboard* GetClipboard(ClipboardBuffer buffer);
diff --git a/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc b/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
index c3cde66d..9a9fd1f 100644
--- a/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
@@ -26,6 +26,7 @@
 #include "ui/ozone/platform/wayland/test/test_data_device_manager.h"
 #include "ui/ozone/platform/wayland/test/test_data_offer.h"
 #include "ui/ozone/platform/wayland/test/test_data_source.h"
+#include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
 #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h"
 #include "ui/ozone/platform/wayland/test/wayland_test.h"
 #include "ui/ozone/public/platform_clipboard.h"
@@ -57,23 +58,45 @@
   void SetUp() override {
     WaylandTest::SetUp();
 
-    Sync();
-
-    data_device_manager_ = server_.data_device_manager();
-    ASSERT_TRUE(data_device_manager_);
+    ASSERT_TRUE(server_.data_device_manager());
+    ASSERT_TRUE(GetParam().primary_selection_protocol ==
+                    wl::PrimarySelectionProtocol::kNone ||
+                server_.primary_selection_device_manager());
 
     clipboard_ = connection_->clipboard();
     ASSERT_TRUE(clipboard_);
-    Sync();
 
-    ASSERT_EQ(GetParam().primary_selection_protocol !=
-                  wl::PrimarySelectionProtocol::kNone,
-              clipboard_->IsSelectionBufferAvailable());
+    // Make sure clipboard instance for the available primary selection protocol
+    // gets properly created, ie: the corresponding 'get_device' request is
+    // issued, so server-side objects are created prior to test-case specific
+    // calls, otherwise tests, such as ReadFromClipboard, would crash.
+    ASSERT_EQ(GetBuffer() == ClipboardBuffer::kSelection,
+              !!clipboard_->GetClipboard(ClipboardBuffer::kSelection));
+    Sync();
 
     offered_data_.clear();
   }
 
  protected:
+  wl::TestSelectionDevice* GetServerSelectionDevice() {
+    return GetBuffer() == ClipboardBuffer::kSelection
+               ? server_.primary_selection_device_manager()->device()
+               : server_.data_device_manager()->data_device();
+  }
+
+  wl::TestSelectionSource* GetServerSelectionSource() {
+    return GetBuffer() == ClipboardBuffer::kSelection
+               ? server_.primary_selection_device_manager()->source()
+               : server_.data_device_manager()->data_source();
+  }
+
+  ClipboardBuffer GetBuffer() const {
+    return GetParam().primary_selection_protocol !=
+                   wl::PrimarySelectionProtocol::kNone
+               ? ClipboardBuffer::kSelection
+               : ClipboardBuffer::kCopyPaste;
+  }
+
   // Fill the clipboard backing store with sample data.
   void OfferData(ClipboardBuffer buffer,
                  const char* data,
@@ -86,8 +109,7 @@
     clipboard_->OfferClipboardData(buffer, offered_data_, offer_callback.Get());
   }
 
-  wl::TestDataDeviceManager* data_device_manager_;
-  WaylandClipboard* clipboard_;
+  WaylandClipboard* clipboard_ = nullptr;
   PlatformClipboard::DataMap offered_data_;
 
  private:
@@ -96,8 +118,7 @@
 
 TEST_P(WaylandClipboardTest, WriteToClipboard) {
   // The client writes data to the clipboard ...
-  OfferData(ClipboardBuffer::kCopyPaste, kSampleClipboardText,
-            {kMimeTypeTextUtf8});
+  OfferData(GetBuffer(), kSampleClipboardText, {kMimeTypeTextUtf8});
   Sync();
 
   // ... and the server reads it.
@@ -110,16 +131,16 @@
       },
       &run_loop);
 
-  data_device_manager_->data_source()->ReadData(kMimeTypeTextUtf8,
-                                                std::move(callback));
+  GetServerSelectionSource()->ReadData(kMimeTypeTextUtf8, std::move(callback));
   run_loop.Run();
 }
 
 TEST_P(WaylandClipboardTest, ReadFromClipboard) {
-  auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+  auto* device = GetServerSelectionDevice();
+  auto* data_offer = device->OnDataOffer();
   data_offer->OnOffer(kMimeTypeTextUtf8,
                       ToClipboardData(std::string(kSampleClipboardText)));
-  data_device_manager_->data_device()->OnSelection(data_offer);
+  device->OnSelection(data_offer);
   Sync();
 
   // The client requests to read the clipboard data from the server. The Server
@@ -134,8 +155,8 @@
       },
       run_loop.QuitClosure());
 
-  clipboard_->RequestClipboardData(ClipboardBuffer::kCopyPaste,
-                                   kMimeTypeTextUtf8, std::move(callback));
+  clipboard_->RequestClipboardData(GetBuffer(), kMimeTypeTextUtf8,
+                                   std::move(callback));
   Sync();
   run_loop.Run();
 }
@@ -143,12 +164,12 @@
 // Regression test for crbug.com/1183939. Ensures unicode mime types take
 // priority over text/plain when reading text.
 TEST_P(WaylandClipboardTest, ReadFromClipboardPrioritizeUtf) {
-  auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+  auto* data_offer = GetServerSelectionDevice()->OnDataOffer();
   data_offer->OnOffer(kMimeTypeText,
                       ToClipboardData(std::string("ascii_text")));
   data_offer->OnOffer(kMimeTypeTextUtf8,
                       ToClipboardData(std::string("utf8_text")));
-  data_device_manager_->data_device()->OnSelection(data_offer);
+  GetServerSelectionDevice()->OnSelection(data_offer);
   Sync();
 
   base::RunLoop run_loop;
@@ -160,56 +181,57 @@
       },
       run_loop.QuitClosure());
 
-  clipboard_->RequestClipboardData(ClipboardBuffer::kCopyPaste,
-                                   kMimeTypeTextUtf8, std::move(callback));
+  clipboard_->RequestClipboardData(GetBuffer(), kMimeTypeTextUtf8,
+                                   std::move(callback));
   Sync();
   run_loop.Run();
 }
 
 TEST_P(WaylandClipboardTest, ReadFromClipboardWithoutOffer) {
-  // When no data offer is advertised and client requests clipboard data
-  // from the server, the response callback should be gracefully called with
-  // null data.
+  // When no data offer is advertised and client requests clipboard data from
+  // the server, the response callback should be gracefully called with null
+  // data.
   auto callback = base::BindOnce(
       [](const PlatformClipboard::Data& data) { ASSERT_FALSE(data); });
-  clipboard_->RequestClipboardData(ClipboardBuffer::kCopyPaste,
-                                   kMimeTypeTextUtf8, std::move(callback));
+  clipboard_->RequestClipboardData(GetBuffer(), kMimeTypeTextUtf8,
+                                   std::move(callback));
 }
 
 TEST_P(WaylandClipboardTest, IsSelectionOwner) {
-  OfferData(ClipboardBuffer::kCopyPaste, kSampleClipboardText,
-            {kMimeTypeTextUtf8});
+  OfferData(GetBuffer(), kSampleClipboardText, {kMimeTypeTextUtf8});
   Sync();
-  ASSERT_TRUE(clipboard_->IsSelectionOwner(ClipboardBuffer::kCopyPaste));
+  ASSERT_TRUE(clipboard_->IsSelectionOwner(GetBuffer()));
 
-  // The compositor sends OnCancelled whenever another application
-  // on the system sets a new selection. It means we are not the application
-  // that owns the current selection data.
-  data_device_manager_->data_source()->OnCancelled();
+  // The compositor sends OnCancelled whenever another application on the system
+  // sets a new selection. It means we are not the application that owns the
+  // current selection data.
+  GetServerSelectionSource()->OnCancelled();
   Sync();
 
-  ASSERT_FALSE(clipboard_->IsSelectionOwner(ClipboardBuffer::kCopyPaste));
+  ASSERT_FALSE(clipboard_->IsSelectionOwner(GetBuffer()));
 }
 
 // Ensures WaylandClipboard correctly handles overlapping read requests for
 // different clipboard buffers.
 TEST_P(WaylandClipboardTest, OverlapReadingFromDifferentBuffers) {
   // Offer a piece of text in kCopyPaste clipboard buffer.
-  auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+  auto* data_offer = GetServerSelectionDevice()->OnDataOffer();
   data_offer->OnOffer(kMimeTypeTextUtf8,
                       ToClipboardData(std::string(kSampleClipboardText)));
-  data_device_manager_->data_device()->OnSelection(data_offer);
+  GetServerSelectionDevice()->OnSelection(data_offer);
   Sync();
 
-  // Post a read request for kSelection buffer, which will start its execution
-  // after kCopyPaste request (below) starts.
-  base::MockCallback<PlatformClipboard::RequestDataClosure> selection_callback;
-  EXPECT_CALL(selection_callback, Run(_)).Times(1);
+  // Post a read request for the other buffer, which will start its execution
+  // after the request above starts.
+  auto other_buffer = GetBuffer() == ClipboardBuffer::kSelection
+                          ? ClipboardBuffer::kCopyPaste
+                          : ClipboardBuffer::kSelection;
+  base::MockCallback<PlatformClipboard::RequestDataClosure> callback;
+  EXPECT_CALL(callback, Run(_)).Times(1);
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PlatformClipboard::RequestClipboardData,
-                     base::Unretained(clipboard_), ClipboardBuffer::kSelection,
-                     kMimeTypeTextUtf8, selection_callback.Get()));
+      FROM_HERE, base::BindOnce(&PlatformClipboard::RequestClipboardData,
+                                base::Unretained(clipboard_), other_buffer,
+                                kMimeTypeTextUtf8, callback.Get()));
 
   // Instantly start a clipboard read request for kCopyPaste buffer (the actual
   // data transfer will take place asynchronously. See WaylandDataDevice impl)
@@ -217,7 +239,7 @@
   // regardless any other request that may arrive in the meantime.
   base::RunLoop run_loop;
   clipboard_->RequestClipboardData(
-      ClipboardBuffer::kCopyPaste, kMimeTypeTextUtf8,
+      GetBuffer(), kMimeTypeTextUtf8,
       base::BindOnce(
           [](base::OnceClosure quit_closure,
              const PlatformClipboard::Data& data) {
@@ -238,16 +260,16 @@
   base::MockCallback<PlatformClipboard::ClipboardDataChangedCallback>
       clipboard_changed_callback;
   clipboard_->SetClipboardDataChangedCallback(clipboard_changed_callback.Get());
-  const auto buffer = ClipboardBuffer::kCopyPaste;
+  const auto buffer = GetBuffer();
 
   // 1. For selection offered by an external application.
   EXPECT_CALL(clipboard_changed_callback, Run(buffer)).Times(1);
-  auto* data_offer = data_device_manager_->data_device()->OnDataOffer();
+  auto* data_offer = GetServerSelectionDevice()->OnDataOffer();
   data_offer->OnOffer(kMimeTypeTextUtf8,
                       ToClipboardData(std::string(kSampleClipboardText)));
-  data_device_manager_->data_device()->OnSelection(data_offer);
+  GetServerSelectionDevice()->OnSelection(data_offer);
   Sync();
-  EXPECT_FALSE(clipboard_->IsSelectionOwner(ClipboardBuffer::kCopyPaste));
+  EXPECT_FALSE(clipboard_->IsSelectionOwner(buffer));
 
   // 2. For selection offered by Chromium.
   EXPECT_CALL(clipboard_changed_callback, Run(buffer)).Times(1);
@@ -257,12 +279,6 @@
 }
 
 INSTANTIATE_TEST_SUITE_P(
-    WithoutPrimarySelection,
-    WaylandClipboardTest,
-    Values(wl::ServerConfig{
-        .primary_selection_protocol = wl::PrimarySelectionProtocol::kNone}));
-
-INSTANTIATE_TEST_SUITE_P(
     WithZwpPrimarySelection,
     WaylandClipboardTest,
     Values(wl::ServerConfig{
@@ -274,4 +290,13 @@
     Values(wl::ServerConfig{
         .primary_selection_protocol = wl::PrimarySelectionProtocol::kGtk}));
 
+INSTANTIATE_TEST_SUITE_P(
+    WithoutPrimarySelection,
+    WaylandClipboardTest,
+    Values(wl::ServerConfig{
+        .primary_selection_protocol = wl::PrimarySelectionProtocol::kNone}));
+
+// TODO(crbug.com/1204670): Add test cases specific for CopyPaste-only
+// clipboards, i.e.: No primary selection protocol available.
+
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc b/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
index 532cf86e6..0bae867 100644
--- a/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
+++ b/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
@@ -63,6 +63,7 @@
     device_ = std::make_unique<ZwpPrimarySelectionDevice>(
         connection_, zwp_primary_selection_device_manager_v1_get_device(
                          device_manager_.get(), connection_->seat()));
+    connection_->ScheduleFlush();
   }
   DCHECK(device_);
   return device_.get();
@@ -73,8 +74,9 @@
     ZwpPrimarySelectionSource::Delegate* delegate) {
   auto* data_source = zwp_primary_selection_device_manager_v1_create_source(
       device_manager_.get());
+  connection_->ScheduleFlush();
   return std::make_unique<ZwpPrimarySelectionSource>(data_source, connection_,
-                                                  delegate);
+                                                     delegate);
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.h b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
index b603325..b5dad7a 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.h
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
@@ -57,8 +57,8 @@
   TestSelectionDeviceManager& operator=(const TestSelectionDeviceManager&) =
       delete;
 
-  const TestSelectionDevice* device() const { return device_; }
-  const TestSelectionSource* source() const { return source_; }
+  TestSelectionDevice* device() { return device_; }
+  TestSelectionSource* source() { return source_; }
 
   // Protocol object requests:
   static void CreateSource(wl_client* client,
diff --git a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
index 6b94e7f..4beb5b7 100644
--- a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
+++ b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
@@ -106,6 +106,10 @@
 
   wl_display* display() const { return display_.get(); }
 
+  TestSelectionDeviceManager* primary_selection_device_manager() {
+    return primary_selection_device_manager_.get();
+  }
+
   void set_output_delegate(OutputDelegate* delegate) {
     output_delegate_ = delegate;
   }
diff --git a/ui/platform_window/x11/test/x11_window_unittest.cc b/ui/platform_window/x11/test/x11_window_unittest.cc
index e89b7a0..866da48 100644
--- a/ui/platform_window/x11/test/x11_window_unittest.cc
+++ b/ui/platform_window/x11/test/x11_window_unittest.cc
@@ -41,6 +41,7 @@
 
   gfx::AcceleratedWidget widget() const { return widget_; }
   PlatformWindowState state() const { return state_; }
+  bool active() const { return active_; }
 
   void WaitForBoundsSet(const gfx::Rect& expected_bounds) {
     if (changed_bounds_ == expected_bounds)
@@ -74,7 +75,7 @@
   void OnAcceleratedWidgetDestroyed() override {
     widget_ = gfx::kNullAcceleratedWidget;
   }
-  void OnActivationChanged(bool active) override {}
+  void OnActivationChanged(bool active) override { active_ = active; }
   void OnMouseEnter() override {}
   SkPath GetWindowMaskForWindowShapeInPixels() override {
     SkPath window_mask;
@@ -96,6 +97,7 @@
   PlatformWindowState state_ = PlatformWindowState::kUnknown;
   gfx::Rect changed_bounds_;
   gfx::Rect expected_bounds_;
+  bool active_ = false;
 
   // Ends the run loop.
   base::OnceClosure quit_closure_;
@@ -469,6 +471,11 @@
   }
   EXPECT_TRUE(window->IsMinimized());
   EXPECT_EQ(delegate.state(), PlatformWindowState::kMinimized);
+  // X11 allows a window to be both minimized and active.
+  EXPECT_TRUE(delegate.active());
+
+  window->Deactivate();
+  EXPECT_FALSE(delegate.active());
 
   // Show from minimized by sending _NET_WM_STATE_FOCUSED
   {
@@ -491,6 +498,9 @@
   }
   EXPECT_FALSE(window->IsMinimized());
   EXPECT_EQ(delegate.state(), PlatformWindowState::kNormal);
+  EXPECT_FALSE(delegate.active());
+  window->Activate();
+  EXPECT_TRUE(delegate.active());
 }
 
 }  // namespace ui
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc
index 3b1ea96..9d0bc696 100644
--- a/ui/platform_window/x11/x11_window.cc
+++ b/ui/platform_window/x11/x11_window.cc
@@ -1211,6 +1211,8 @@
     last_motion = ui::BuildEventFromXEvent(last_xev);
     event = last_motion.get();
   }
+  if (!event)
+    return;
 
   // If |event| is a located event (mouse, touch, etc) and another X11 window
   // is set as the current located events grabber, the |event| must be
@@ -1238,22 +1240,20 @@
   // include mouse wheel events as well. Investigation showed that events on
   // Linux are checked with cmt-device path, and can include DT_CMT_SCROLL_
   // data. See more discussion in https://crrev.com/c/853953
-  if (event) {
-    UpdateWMUserTime(event);
-    bool event_dispatched = false;
+  UpdateWMUserTime(event);
+  bool event_dispatched = false;
 #if defined(USE_OZONE)
-    if (features::IsUsingOzonePlatform()) {
-      event_dispatched = true;
-      DispatchEventFromNativeUiEvent(
-          event, base::BindOnce(&PlatformWindowDelegate::DispatchEvent,
-                                base::Unretained(platform_window_delegate())));
-    }
+  if (features::IsUsingOzonePlatform()) {
+    event_dispatched = true;
+    DispatchEventFromNativeUiEvent(
+        event, base::BindOnce(&PlatformWindowDelegate::DispatchEvent,
+                              base::Unretained(platform_window_delegate())));
+  }
 #endif
 #if defined(USE_X11)
-    if (!event_dispatched)
-      platform_window_delegate_->DispatchEvent(event);
+  if (!event_dispatched)
+    platform_window_delegate_->DispatchEvent(event);
 #endif
-  }
 }
 
 void X11Window::OnXWindowStateChanged() {
@@ -1750,8 +1750,7 @@
   // a window is topmost iff it has focus, just use the focus state to determine
   // if a window is active.  Note that Activate() and Deactivate() change the
   // stacking order in addition to changing the focus state.
-  return (has_window_focus_ || has_pointer_focus_) && !ignore_keyboard_input_ &&
-         !IsMinimized();
+  return (has_window_focus_ || has_pointer_focus_) && !ignore_keyboard_input_;
 }
 
 bool X11Window::IsMinimized() const {
@@ -1869,7 +1868,9 @@
   if (had_pointer_capture && !has_pointer_capture)
     OnXWindowLostCapture();
 
-  bool is_active = IsActive();
+  // A window can be both minimized and active from x11's perspective.
+  // But we treat a minimized window as inactive for platform consistency.
+  bool is_active = IsActive() && !IsMinimized();
   if (!was_active_ && is_active)
     SetFlashFrameHint(false);
 
diff --git a/ui/views/animation/animation_builder.cc b/ui/views/animation/animation_builder.cc
index e80a67d..94d0544 100644
--- a/ui/views/animation/animation_builder.cc
+++ b/ui/views/animation/animation_builder.cc
@@ -29,7 +29,7 @@
       view->SetPaintToLayer();
     for (auto& s : animation.second) {
       if (animation_observer_)
-        animation_observer_->ObserveAnimationSequence(s.get());
+        s->AddObserver(animation_observer_.get());
       all_animations[view].push_back(s.release());
     }
   }
@@ -156,14 +156,6 @@
   Reset();
 }
 
-void AnimationBuilder::AnimationBuilderObserver::ObserveAnimationSequence(
-    ui::LayerAnimationSequence* sequence) {
-  DCHECK(!base::Contains(sequences_, sequence,
-                         &base::WeakPtr<ui::LayerAnimationSequence>::get));
-  sequence->AddObserver(this);
-  sequences_.emplace_back(sequence->AsWeakPtr());
-}
-
 void AnimationBuilder::AnimationBuilderObserver::SetOnStarted(
     base::OnceClosure callback) {
   DCHECK(!on_started_);
@@ -203,14 +195,12 @@
 void AnimationBuilder::AnimationBuilderObserver::OnLayerAnimationEnded(
     ui::LayerAnimationSequence* sequence) {
   const auto running =
-      base::ranges::count_if(sequences_, [](const auto& sequence) {
-        return sequence && !sequence->IsFinished(base::TimeTicks::Now());
+      base::ranges::count_if(attached_sequences(), [](auto* sequence) {
+        return sequence->IsFinished(base::TimeTicks::Now());
       });
   if (running <= 1) {
     if (on_ended_)
       std::move(on_ended_).Run();
-    // TODO(kylixrd): This needs more thought in light of repeating animations
-    // aborts, etc...
     delete this;
   }
 }
@@ -236,10 +226,9 @@
 }
 
 void AnimationBuilder::AnimationBuilderObserver::Reset() {
-  for (auto& sequence : sequences_) {
-    if (sequence.get())
-      sequence.get()->RemoveObserver(this);
-  }
+  auto& sequences = attached_sequences();
+  while (!sequences.empty())
+    (*sequences.begin())->RemoveObserver(this);
 }
 
 }  // namespace views
diff --git a/ui/views/animation/animation_builder.h b/ui/views/animation/animation_builder.h
index b7dca4d..16d70b6 100644
--- a/ui/views/animation/animation_builder.h
+++ b/ui/views/animation/animation_builder.h
@@ -72,7 +72,7 @@
     }
   };
 
-  class AnimationBuilderObserver : ui::LayerAnimationObserver {
+  class AnimationBuilderObserver : public ui::LayerAnimationObserver {
    public:
     AnimationBuilderObserver();
     AnimationBuilderObserver(const AnimationBuilderObserver&) = delete;
@@ -80,8 +80,6 @@
         delete;
     ~AnimationBuilderObserver() override;
 
-    void ObserveAnimationSequence(ui::LayerAnimationSequence* sequence);
-
     void SetOnStarted(base::OnceClosure callback);
     void SetOnEnded(base::OnceClosure callback);
     void SetOnWillRepeat(base::RepeatingClosure callback);
@@ -100,7 +98,6 @@
    private:
     void Reset();
 
-    std::vector<base::WeakPtr<ui::LayerAnimationSequence>> sequences_;
     base::OnceClosure on_started_;
     base::OnceClosure on_ended_;
     base::RepeatingClosure on_will_repeat_;
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h
index 8826274..d4906e0 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -378,9 +378,10 @@
 };
 
 // BubbleDialogDelegateView is a BubbleDialogDelegate that is also a View.
-// TODO(pbos): Finish moving functionality from BubbleDialogDelegateView into
-// BubbleDialogDelegate, then document here that it's better to subclass View
-// and construct a BubbleDialogDelegate.
+// Prefer using a BubbleDialogDelegate that sets a separate View as its contents
+// view.
+// TODO(pbos): Migrate existing uses of BubbleDialogDelegateView to directly
+// inherit or use BubbleDialogDelegate.
 class VIEWS_EXPORT BubbleDialogDelegateView : public BubbleDialogDelegate,
                                               public View {
  public:
diff --git a/ui/views/cascading_property.cc b/ui/views/cascading_property.cc
index d69074f..bdd659a 100644
--- a/ui/views/cascading_property.cc
+++ b/ui/views/cascading_property.cc
@@ -4,6 +4,7 @@
 
 #include "ui/views/cascading_property.h"
 #include "ui/base/theme_provider.h"
+#include "ui/gfx/color_utils.h"
 #include "ui/native_theme/native_theme.h"
 
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
@@ -62,4 +63,20 @@
       std::make_unique<views::CascadingNativeThemeColor>(color_id));
 }
 
+SkColor GetCascadingBackgroundColor(View* view) {
+  const absl::optional<SkColor> color =
+      GetCascadingProperty(view, kCascadingBackgroundColor);
+  return color.value_or(view->GetNativeTheme()->GetSystemColor(
+      ui::NativeTheme::kColorId_WindowBackground));
+}
+
+SkColor GetCascadingAccentColor(View* view) {
+  const SkColor default_color = view->GetNativeTheme()->GetSystemColor(
+      ui::NativeTheme::kColorId_FocusedBorderColor);
+
+  return color_utils::PickGoogleColor(
+      default_color, GetCascadingBackgroundColor(view),
+      color_utils::kMinimumVisibleContrastRatio);
+}
+
 }  // namespace views
diff --git a/ui/views/cascading_property.h b/ui/views/cascading_property.h
index bb4e685..10a0f418 100644
--- a/ui/views/cascading_property.h
+++ b/ui/views/cascading_property.h
@@ -62,18 +62,22 @@
 }
 
 VIEWS_EXPORT void SetCascadingThemeProviderColor(
-    views::View* view,
+    View* view,
     const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
     int color_id);
 
 VIEWS_EXPORT void SetCascadingNativeThemeColor(
-    views::View* view,
+    View* view,
     const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
     ui::NativeTheme::ColorId color_id);
 
 VIEWS_EXPORT extern const ui::ClassProperty<CascadingProperty<SkColor>*>* const
     kCascadingBackgroundColor;
 
+VIEWS_EXPORT SkColor GetCascadingBackgroundColor(View* view);
+
+VIEWS_EXPORT SkColor GetCascadingAccentColor(View* view);
+
 }  // namespace views
 
 DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
diff --git a/ui/views/controls/focus_ring.cc b/ui/views/controls/focus_ring.cc
index 7eb9d40..581b3312 100644
--- a/ui/views/controls/focus_ring.cc
+++ b/ui/views/controls/focus_ring.cc
@@ -45,28 +45,11 @@
                              path.isRRect(nullptr));
 }
 
-ui::NativeTheme::ColorId ColorIdForValidity(bool valid) {
-  return valid ? ui::NativeTheme::kColorId_FocusedBorderColor
-               : ui::NativeTheme::kColorId_AlertSeverityHigh;
-}
-
-SkColor GetBackgroundColor(View* view) {
-  const absl::optional<SkColor> color =
-      GetCascadingProperty(view, kCascadingBackgroundColor);
-  return color.value_or(view->GetNativeTheme()->GetSystemColor(
-      ui::NativeTheme::kColorId_WindowBackground));
-}
-
 SkColor GetColor(View* focus_ring, bool valid) {
-  const SkColor default_color =
-      focus_ring->GetNativeTheme()->GetSystemColor(ColorIdForValidity(valid));
-
   if (!valid)
-    return default_color;
-
-  return color_utils::PickGoogleColor(
-      default_color, GetBackgroundColor(focus_ring),
-      color_utils::kMinimumVisibleContrastRatio);
+    return focus_ring->GetNativeTheme()->GetSystemColor(
+        ui::NativeTheme::kColorId_AlertSeverityHigh);
+  return GetCascadingAccentColor(focus_ring);
 }
 
 double GetCornerRadius() {
@@ -225,7 +208,7 @@
     // Draw with full stroke width + 2x outline thickness to effectively paint
     // the outline thickness on both sides of the FocusRing.
     paint.setStrokeWidth(FocusRing::kHaloThickness + 2 * kOutlineThickness);
-    paint.setColor(GetBackgroundColor(this));
+    paint.setColor(GetCascadingBackgroundColor(this));
     canvas->sk_canvas()->drawRRect(ring_rect, paint);
   }
 
diff --git a/weblayer/browser/android/javatests/skew/expectations.txt b/weblayer/browser/android/javatests/skew/expectations.txt
index 330b656..6b6932f 100644
--- a/weblayer/browser/android/javatests/skew/expectations.txt
+++ b/weblayer/browser/android/javatests/skew/expectations.txt
@@ -7,6 +7,8 @@
 # These lines are not comments! They define the set of known tags and other information.
 # tags: [ client_lte_87 client_lte_88 client_lte_89 client_lte_91 ]
 # tags: [ impl_lte_91 ]
+# 'all' disables the test from any skew test.
+# tags: [ all ]
 # results: [ Skip ]
 # conflicts_allowed: True
 
@@ -24,51 +26,27 @@
 crbug.com/1196803 [ client_lte_91 ] org.chromium.weblayer.test.ExternalNavigationTest#testExternalIntentWithNoRedirectInBrowserStartupInIncognitoBlockedWhenBackgroundLaunchesAllowedAndUserForbids [ Skip ]
 
 # Bulk disable to get bot green.
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.FullscreenCallbackTest* [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.MediaSessionTest#basic [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.InputTypesTest* [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NavigationTest#testDestroyTabWithModalDialog [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NavigationTest#testRepostConfirmation [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testDestroyTabInOnNewTab [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testScrollNotificationDirectionChange [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlay [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testMoveToDifferentFragment [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testDestroyTab [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testActiveTabChanged [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabTest#testRotationDoesntChangeVisibility [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabTest#testBeforeUnload [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testNewBrowser [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.DownloadCallbackTest#testBasic [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testNewTabHasFocus [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.FindInPageTest#testHideOnNewTab [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlayOnBackgroundTab [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.CookieManagerTest#testCookieChanged [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testDismissTransientUi [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.NavigationTest#testIsFormSubmission [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testOnRenderProcessGone [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.ScrollOffsetCallbackTest#testBasic [ Skip ]
-crbug.com/1191751 [ impl_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testCallbackInvokedWhenTabClosedViaWebContents [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.FullscreenCallbackTest* [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.MediaSessionTest#basic [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.InputTypesTest* [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NavigationTest#testDestroyTabWithModalDialog [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NavigationTest#testRepostConfirmation [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testDestroyTabInOnNewTab [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testScrollNotificationDirectionChange [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlay [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testMoveToDifferentFragment [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testDestroyTab [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testActiveTabChanged [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabTest#testRotationDoesntChangeVisibility [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabTest#testBeforeUnload [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testNewBrowser [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.DownloadCallbackTest#testBasic [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NewTabCallbackTest#testNewTabHasFocus [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.FindInPageTest#testHideOnNewTab [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlayOnBackgroundTab [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.CookieManagerTest#testCookieChanged [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testDismissTransientUi [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.NavigationTest#testIsFormSubmission [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabCallbackTest#testOnRenderProcessGone [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.ScrollOffsetCallbackTest#testBasic [ Skip ]
-crbug.com/1191751 [ client_lte_91 ] org.chromium.weblayer.test.TabListCallbackTest#testCallbackInvokedWhenTabClosedViaWebContents [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.FullscreenCallbackTest* [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.MediaSessionTest#basic [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.InputTypesTest* [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NavigationTest#testDestroyTabWithModalDialog [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NavigationTest#testRepostConfirmation [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NewTabCallbackTest#testDestroyTabInOnNewTab [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabCallbackTest#testScrollNotificationDirectionChange [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlay [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabListCallbackTest#testMoveToDifferentFragment [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabListCallbackTest#testDestroyTab [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabListCallbackTest#testActiveTabChanged [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabTest#testRotationDoesntChangeVisibility [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabTest#testBeforeUnload [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NewTabCallbackTest#testNewBrowser [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.DownloadCallbackTest#testBasic [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NewTabCallbackTest#testNewTabHasFocus [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.FindInPageTest#testHideOnNewTab [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabCallbackTest#testTabModalOverlayOnBackgroundTab [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.CookieManagerTest#testCookieChanged [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabCallbackTest#testDismissTransientUi [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.NavigationTest#testIsFormSubmission [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabCallbackTest#testOnRenderProcessGone [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.ScrollOffsetCallbackTest#testBasic [ Skip ]
+crbug.com/1191751 [ all ] org.chromium.weblayer.test.TabListCallbackTest#testCallbackInvokedWhenTabClosedViaWebContents [ Skip ]
diff --git a/weblayer/browser/android/javatests/weblayer_instrumentation_test_versions.py b/weblayer/browser/android/javatests/weblayer_instrumentation_test_versions.py
index f6ae5c4..db3362f 100755
--- a/weblayer/browser/android/javatests/weblayer_instrumentation_test_versions.py
+++ b/weblayer/browser/android/javatests/weblayer_instrumentation_test_versions.py
@@ -59,6 +59,9 @@
   Raises:
     AssertionError if the tag is invalid.
   """
+  # 'All' is special cased to match anything.
+  if tag == 'all':
+    return True
   # Extract the three components from the tag.
   match = re.match(r'(client|impl)_([gl]te)_([0-9]+)', tag)
   assert match is not None, (