diff --git a/AUTHORS b/AUTHORS
index d99b2c4..fc7008f3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -385,6 +385,7 @@
 Ganesh Borle <ganesh.borle@samsung.com>
 Gao Chun <chun.gao@intel.com>
 Gao Chun <gaochun.dev@gmail.com>
+Gao Sheng <gaosheng08@meituan.com>
 Gao Yu <wanggao@tencent.com>
 Gaurav Dhol <gaurav.dhol@einfochips.com>
 Gautham Banasandra <gautham.bangalore@gmail.com>
@@ -1307,6 +1308,7 @@
 Yong Ling <yongling@tencent.com>
 Yong Shin <sy3620@gmail.com>
 Yong Wang <ccyongwang@tencent.com>
+Yonggang Luo <luoyonggang@gmail.com>
 Yongha Lee <yongha78.lee@samsung.com>
 Yongseok Choi <yongseok.choi@navercorp.com>
 Yongsheng Zhu <yongsheng.zhu@intel.com>
diff --git a/DEPS b/DEPS
index 02e42ae..eee042e8 100644
--- a/DEPS
+++ b/DEPS
@@ -301,7 +301,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': '3d1e9e70ada44406294dc874181a1efccb406ef5',
+  'v8_revision': '0b5366d9178b6334b7de044a22a8c5ebe9cf097b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -324,7 +324,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220806.1.1',
+  'fuchsia_version': 'version:9.20220808.1.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -344,7 +344,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': 'c026741a37cc99c0f1748714b2c6ef38a5597f1c',
+  'nacl_revision': '6bb46e84a384cfd877bbd741d89b31c547944cfd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -376,7 +376,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': 'ec07972b0ee6c5de8028d3f135282a448849f443',
+  'devtools_frontend_revision': '7d8e56b11f9532e3b94d8bf5fee6477addd57209',
   # 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.
@@ -862,7 +862,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'GuNmsNvpf1A4S_Z6iN4Pa3mSf0SEuh-U5nqRZl7bj4YC',
+          'version': '9xdFfYZeKUQKUeRtKixDPNDIA8-YVZwtbQTemfOErmEC',
         },
       ],
       'dep_type': 'cipd',
@@ -884,7 +884,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'q_60cGOVZXPn-wK6MOzLtQJD26P2FSrGZ0o5obYlsXYC',
+          'version': 'TkeDi6lBFHBcrmpPWK59LIg2PpplcaPGxM356osbi3sC',
         },
       ],
       'dep_type': 'cipd',
@@ -1573,7 +1573,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f44970fbdaa94f4edc67f0914b2a51aa9a237463',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '14ae2bfe87400a574ca21edfe99a046f7e5ab80b',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1805,7 +1805,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0ae04304e44c3ed66cb825de332559f5e3e46cc3',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@dfca36d6bffa25679453e1ad9f237bdb3008dfe6',
     'condition': 'checkout_src_internal',
   },
 
@@ -1835,7 +1835,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'Y0UiBKW9C3Ms6S5Lljn_BpXcOQN6c5xNuTc118E9c3oC',
+        'version': '_cUwSPtW3FdbOK_urzG1fMyfol6GQ2yq-GYL4XxWv1MC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1857,7 +1857,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'vnigrM__c5BBf1Ej7Mfoq20Uqg0IUWzFaPDBqbkqjl4C',
+        'version': '_SA97U3JJ0qmUHxhqA5Dh3m_3TqsaepwdTI4JvYsmkgC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 3da5147a..52b9424 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -3771,7 +3771,7 @@
         return self._file_cache[path]
 
     def _ComputeNormalizedPydepsEntries(self, pydeps_path):
-        """Returns an interable of paths within the .pydep, relativized to //."""
+        """Returns an iterable of paths within the .pydep, relativized to //."""
         pydeps_data = self._LoadFile(pydeps_path)
         uses_gn_paths = '--gn-paths' in pydeps_data
         entries = (l for l in pydeps_data.splitlines()
@@ -3898,7 +3898,7 @@
         results.append(
             output_api.PresubmitPromptOrNotify(
                 'You have changed python files that may affect pydeps for android\n'
-                'specific scripts. However, the relevant presumbit check cannot be\n'
+                'specific scripts. However, the relevant presubmit check cannot be\n'
                 'run because you are not using an Android checkout. To validate that\n'
                 'the .pydeps are correct, re-run presubmit in an Android checkout, or\n'
                 'use the android-internal-presubmit optional trybot.\n'
@@ -4245,7 +4245,7 @@
                 'forward_variables_from("*") without exclusions',
                 items=sorted(problems),
                 long_text=(
-                    'The variables "visibilty" and "test_only" should be '
+                    'The variables "visibility" and "test_only" should be '
                     'explicitly listed in forward_variables_from(). For more '
                     'details, see:\n'
                     'https://chromium.googlesource.com/chromium/src/+/HEAD/'
@@ -5217,7 +5217,7 @@
         detection_list=['config=nacl', 'enable-nacl', 'cpu=pnacl', 'nacl_io'],
         files_to_skip=files_to_skip + [r"^native_client_sdk[\\/]"])
 
-    # PPAPI: any C/C++ file that in its diff includes a ppappi library
+    # PPAPI: any C/C++ file that in its diff includes a ppapi library
     problems += _CheckForDeprecatedTech(
         input_api,
         output_api,
@@ -5675,7 +5675,7 @@
         grd_files = git_helper.list_grds_in_repository(repo_root)
 
     # Ignore bogus grd files used only for testing
-    # ui/webui/resoucres/tools/generate_grd.py.
+    # ui/webui/resources/tools/generate_grd.py.
     ignore_path = input_api.os_path.join('ui', 'webui', 'resources', 'tools',
                                          'tests')
     grd_files = [p for p in grd_files if ignore_path not in p]
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index 5ea2e87..036913b 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -935,7 +935,7 @@
 
   # The relnotes footer is not required for changes which do not touch any
   # accessibility directories.
-  def testIgnoresNonAccesssibilityCode(self):
+  def testIgnoresNonAccessibilityCode(self):
     mock_input_api = MockInputApi()
     mock_output_api = MockOutputApi()
 
@@ -1031,7 +1031,7 @@
         MockAffectedFile('ui/accessibility/foo.bar', ['']),
     ]
     mock_input_api.change.DescriptionText = lambda : ('Description:\n' +
-        'ax-relnotes= this is a valid format for accessibiliy relnotes')
+        'ax-relnotes= this is a valid format for accessibility relnotes')
 
     msgs = PRESUBMIT.CheckAccessibilityRelnotesField(
         mock_input_api, mock_output_api)
@@ -1643,13 +1643,13 @@
       MockAffectedFile('HasTooLongTag.java', [
         'import org.chromium.base.Log;',
         'some random stuff',
-        'private static final String TAG = "21_charachers_long___";',
+        'private static final String TAG = "21_characters_long___";',
         'Log.d(TAG, "foo");',
       ]),
       MockAffectedFile('HasTooLongTagWithNoLogCallsInDiff.java', [
         'import org.chromium.base.Log;',
         'some random stuff',
-        'private static final String TAG = "21_charachers_long___";',
+        'private static final String TAG = "21_characters_long___";',
       ]),
     ]
 
@@ -2440,7 +2440,7 @@
         'Review from an owner in ipc/SECURITY_OWNERS is required for the '
         'following newly-added files:', results[0].message)
 
-  def testmissingSecurityApprovalAtRealCommit(self):
+  def testMissingSecurityApprovalAtRealCommit(self):
     mock_input_api = self._createMockInputApi()
     new_owners_file_path = mock_input_api.os_path.join(
         'services', 'goat', 'public', 'OWNERS')
@@ -3309,8 +3309,7 @@
                        self.NEW_GRD_CONTENTS1, action='M'),
       MockAffectedFile('part.grdp', self.NEW_GRDP_CONTENTS1,
                        self.NEW_GRDP_CONTENTS1, action='M')])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(0, len(warnings))
 
     # Add two new strings. Should have two warnings.
@@ -3319,8 +3318,7 @@
                        self.NEW_GRD_CONTENTS1, action='M'),
       MockAffectedFile('part.grdp', self.NEW_GRDP_CONTENTS2,
                        self.NEW_GRDP_CONTENTS1, action='M')])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(1, len(warnings))
     self.assertEqual(self.GENERATE_SIGNATURES_MESSAGE, warnings[0].message)
     self.assertEqual('error', warnings[0].type)
@@ -3335,8 +3333,7 @@
                        self.OLD_GRD_CONTENTS, action='M'),
       MockAffectedFile('part.grdp', self.NEW_GRDP_CONTENTS2,
                        self.OLD_GRDP_CONTENTS, action='M')])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(1, len(warnings))
     self.assertEqual('error', warnings[0].type)
     self.assertEqual(self.GENERATE_SIGNATURES_MESSAGE, warnings[0].message)
@@ -3401,8 +3398,7 @@
         MockAffectedFile(
             os.path.join('test_grd', 'IDS_TEST1.png'), 'binary', action='A')
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(2, len(warnings))
     self.assertEqual('error', warnings[0].type)
     self.assertEqual(self.DO_NOT_UPLOAD_PNG_MESSAGE, warnings[0].message)
@@ -3438,8 +3434,7 @@
             os.path.join('part_grdp', 'IDS_PART_TEST1.png'), 'binary',
             action='A')
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(2, len(warnings))
     self.assertEqual('error', warnings[0].type)
     self.assertEqual(self.DO_NOT_UPLOAD_PNG_MESSAGE, warnings[0].message)
@@ -3485,8 +3480,7 @@
             'binary',
             action='A'),
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual([], warnings)
 
   def testScreenshotsRemovedWithSha1(self):
@@ -3513,8 +3507,7 @@
         MockFile(os.path.join('part_grdp', 'IDS_PART_TEST2.png.sha1'),
                  'binary', '')
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(1, len(warnings))
     self.assertEqual('error', warnings[0].type)
     self.assertEqual(self.REMOVE_SIGNATURES_MESSAGE, warnings[0].message)
@@ -3554,8 +3547,7 @@
             'old_contents',
             action='D')
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual(1, len(warnings))
     self.assertEqual('error', warnings[0].type)
     self.assertEqual(self.REMOVE_SIGNATURES_MESSAGE, warnings[0].message)
@@ -3594,8 +3586,7 @@
             'binary',
             action='D')
     ])
-    warnings = PRESUBMIT.CheckStrings(input_api,
-                                                      MockOutputApi())
+    warnings = PRESUBMIT.CheckStrings(input_api, MockOutputApi())
     self.assertEqual([], warnings)
 
   def testIcuSyntax(self):
@@ -3831,7 +3822,7 @@
           msg=('expected foo_unittest.cc in message but got %s in test %s' %
                (results[0].message, test)))
 
-  def testIngoreNotTestFiles(self):
+  def testIgnoreNotTestFiles(self):
     mock_input_api = MockInputApi()
     mock_input_api.files = [
         MockFile('some/path/foo.cc', 'TEST_F(FoobarTest, DISABLE_Foo)'),
@@ -3841,7 +3832,7 @@
                                                    MockOutputApi())
     self.assertEqual(0, len(results))
 
-  def testIngoreDeletedFiles(self):
+  def testIgnoreDeletedFiles(self):
     mock_input_api = MockInputApi()
     mock_input_api.files = [
         MockFile('some/path/foo.cc', 'TEST_F(FoobarTest, Foo)', action='D'),
@@ -4092,7 +4083,7 @@
     ]
     mock_output_api = MockOutputApi()
     errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api,
-                                                     mock_output_api)
+                                                           mock_output_api)
     self.assertEqual(1, len(errors))
     self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message)
     self.assertTrue( 'foo.NMF' in errors[0].message)
@@ -4115,7 +4106,7 @@
     ]
     mock_output_api = MockOutputApi()
     errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api,
-                                                     mock_output_api)
+                                                           mock_output_api)
     self.assertEqual(1, len(errors))
     self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message)
     self.assertTrue( 'manifest.json' in errors[0].message)
@@ -4138,7 +4129,7 @@
     ]
     mock_output_api = MockOutputApi()
     errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api,
-                                                     mock_output_api)
+                                                           mock_output_api)
     self.assertEqual(0, len(errors))
 
   def testWarningPPAPI(self):
@@ -4159,7 +4150,7 @@
     ]
     mock_output_api = MockOutputApi()
     errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api,
-                                                     mock_output_api)
+                                                           mock_output_api)
     self.assertEqual(1, len(errors))
     self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message)
     self.assertTrue( 'foo.hpp' in errors[0].message)
@@ -4182,7 +4173,7 @@
     ]
     mock_output_api = MockOutputApi()
     errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api,
-                                                     mock_output_api)
+                                                           mock_output_api)
     self.assertEqual(0, len(errors))
 
 class CheckDeprecationOfPreferencesTest(unittest.TestCase):
@@ -4313,7 +4304,7 @@
         'Discovered possible removal of preference registrations' in
         errors[0].message)
 
-  # Check that the presubmit fails if a marker line in brower_prefs.cc is
+  # Check that the presubmit fails if a marker line in browser_prefs.cc is
   # deleted.
   def testDeletedMarkerRaisesError(self):
     mock_input_api = MockInputApi()
diff --git a/PRESUBMIT_test_mocks.py b/PRESUBMIT_test_mocks.py
index dfc9bb9..9928c71f 100644
--- a/PRESUBMIT_test_mocks.py
+++ b/PRESUBMIT_test_mocks.py
@@ -142,7 +142,7 @@
 class MockOutputApi(object):
   """Mock class for the OutputApi class.
 
-  An instance of this class can be passed to presubmit unittests for outputing
+  An instance of this class can be passed to presubmit unittests for outputting
   various types of results.
   """
 
diff --git a/WATCHLISTS b/WATCHLISTS
index b16371c..b02a189 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -2967,6 +2967,7 @@
                   'raphael.kubo.da.costa@intel.com'],
     'wallpapers': ['croissant-eng+reviews@chromium.org'],
     'web_applications': ['alancutter+chrome-cls@chromium.org',
+                         'dibyapal+watch-webapps@chromium.org',
                          'dmurph+watching-webapps@chromium.org',
                          'dominickn+watch-web_applications@chromium.org',
                          'ericwilligers+watch-bmo@chromium.org',
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
index 772f2ed..a93b33d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
@@ -5,7 +5,9 @@
 package org.chromium.android_webview.test.services;
 
 import android.content.Context;
+import android.os.Build;
 
+import androidx.annotation.RequiresApi;
 import androidx.test.filters.MediumTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -16,12 +18,15 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.android_webview.js_sandbox.client.EvaluationFailedException;
+import org.chromium.android_webview.js_sandbox.client.IsolateSettings;
 import org.chromium.android_webview.js_sandbox.client.IsolateTerminatedException;
 import org.chromium.android_webview.js_sandbox.client.JsIsolate;
 import org.chromium.android_webview.js_sandbox.client.JsSandbox;
+import org.chromium.android_webview.js_sandbox.client.SandboxDeadException;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.util.DisabledTest;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Vector;
@@ -30,6 +35,8 @@
 
 /** Instrumentation test for JsSandboxService. */
 @RunWith(AwJUnit4ClassRunner.class)
+@MinAndroidSdkLevel(Build.VERSION_CODES.O)
+@RequiresApi(Build.VERSION_CODES.O)
 public class JsSandboxServiceTest {
     @Test
     @MediumTest
@@ -489,4 +496,35 @@
             Assert.assertEquals(expected, result);
         }
     }
+
+    @Test
+    @MediumTest
+    public void testHeapSize() throws Throwable {
+        // We need to beat the v8 optimizer to ensure it really allocates the required memory.
+        final String code = "this.array = Array(10000000).fill(Math.random(), 0);"
+                + "var arrayLength = this.array.length;"
+                + "var sum = 0;"
+                + "for (var i = 0; i < arrayLength; i++) {"
+                + " sum+=this.array[i];"
+                + "}";
+        Context context = ContextUtils.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.newConnectedInstanceForTestingAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.ISOLATE_MAX_HEAP_SIZE));
+            IsolateSettings isolateStartupParameters = new IsolateSettings();
+            isolateStartupParameters.setMaxHeapSizeBytes(1000);
+            try (JsIsolate jsIsolate = jsSandbox.createIsolate(isolateStartupParameters)) {
+                ListenableFuture<String> resultFuture = jsIsolate.evaluateJavascriptAsync(code);
+                try {
+                    resultFuture.get(5, TimeUnit.SECONDS);
+                    Assert.fail("Should have thrown");
+                } catch (ExecutionException e) {
+                    if (!(e.getCause() instanceof SandboxDeadException)) {
+                        throw e;
+                    }
+                }
+            }
+        }
+    }
 }
diff --git a/android_webview/js_sandbox/BUILD.gn b/android_webview/js_sandbox/BUILD.gn
index a28598c..2e84a5e0 100644
--- a/android_webview/js_sandbox/BUILD.gn
+++ b/android_webview/js_sandbox/BUILD.gn
@@ -44,6 +44,7 @@
   sources = [
     "java/src/org/chromium/android_webview/js_sandbox/client/CloseGuardHelper.java",
     "java/src/org/chromium/android_webview/js_sandbox/client/EvaluationFailedException.java",
+    "java/src/org/chromium/android_webview/js_sandbox/client/IsolateSettings.java",
     "java/src/org/chromium/android_webview/js_sandbox/client/IsolateTerminatedException.java",
     "java/src/org/chromium/android_webview/js_sandbox/client/JsException.java",
     "java/src/org/chromium/android_webview/js_sandbox/client/JsIsolate.java",
diff --git a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/IsolateSettings.java b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/IsolateSettings.java
new file mode 100644
index 0000000..c3b71969
--- /dev/null
+++ b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/IsolateSettings.java
@@ -0,0 +1,45 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.js_sandbox.client;
+
+import androidx.annotation.RequiresFeature;
+
+/**
+ * Class used to set startup parameters for {@link JsIsolate}.
+ */
+public class IsolateSettings {
+    private long mMaxHeapSizeBytes;
+    public IsolateSettings(){};
+
+    /**
+     * Sets the max heap size used by the {@JsIsolate}.
+     *
+     * A heap size of 0 indicates no limit. Default value of the heap size limit is 0.
+     *
+     * @param size heap size in bytes
+     */
+    @RequiresFeature(name = JsSandbox.ISOLATE_MAX_HEAP_SIZE,
+            enforcement =
+                    "org.chromium.android_webview.js_sandbox.client.JsSandbox#isFeatureSupported")
+    public void
+    setMaxHeapSizeBytes(long size) {
+        if (size < 0) {
+            throw new IllegalArgumentException("maxHeapSizeBytes should be >= 0");
+        }
+        mMaxHeapSizeBytes = size;
+    }
+
+    /**
+     * Gets the max heap size used by the {@JsIsolate}.
+     *
+     * If not set using {@link IsolateSettings#setMaxHeapSizeBytes(long)}, the default value is 0
+     * which indicates no heap size limit.
+     *
+     * @return heap size in bytes
+     */
+    public long getMaxHeapSizeBytes() {
+        return mMaxHeapSizeBytes;
+    }
+}
diff --git a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/JsSandbox.java b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/JsSandbox.java
index 855ee85..4929ce8 100644
--- a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/JsSandbox.java
+++ b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/client/JsSandbox.java
@@ -133,6 +133,14 @@
      */
     public static final String WASM_COMPILATION = "WASM_COMPILATION";
 
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     *
+     * When this feature is present,
+     * {@link JsSandbox#createIsolate(IsolateSettings)} can be used.
+     */
+    public static final String ISOLATE_MAX_HEAP_SIZE = "ISOLATE_MAX_HEAP_SIZE";
+
     private HashSet<String> mClientSideFeatureSet;
 
     static class ConnectionSetup implements ServiceConnection {
@@ -260,7 +268,8 @@
     }
 
     /**
-     * Creates and returns an {@link JsIsolate} within which JS can be executed.
+     * Creates and returns an {@link JsIsolate} within which JS can be executed with default
+     * settings.
      */
     @NonNull
     public JsIsolate createIsolate() {
@@ -269,16 +278,45 @@
                 throw new IllegalStateException(
                         "Attempting to createIsolate on a service that isn't connected");
             }
+            IJsSandboxIsolate isolateStub;
             try {
-                IJsSandboxIsolate isolateStub = mJsSandboxService.createIsolate();
-                Executor mainExecutor;
-                mainExecutor = ContextCompat.getMainExecutor(mConnection.mContext);
-                JsIsolate isolate = new JsIsolate(isolateStub, this, mainExecutor);
-                mActiveIsolateSet.add(isolate);
-                return isolate;
+                isolateStub = mJsSandboxService.createIsolate();
             } catch (RemoteException e) {
                 throw new RuntimeException(e);
             }
+            return createJsIsolateLocked(isolateStub);
+        }
+    }
+
+    /**
+     * Creates and returns an {@link JsIsolate} within which JS can be executed with the specified
+     * settings.
+     *
+     * @param settings configuration used to set up the isolate
+     */
+    @NonNull
+    public JsIsolate createIsolate(IsolateSettings settings) {
+        synchronized (mLock) {
+            if (mJsSandboxService == null) {
+                throw new IllegalStateException(
+                        "Attempting to createIsolate on a service that isn't connected");
+            }
+            IJsSandboxIsolate isolateStub;
+            try {
+                if (settings.getMaxHeapSizeBytes() == 0) {
+                    isolateStub = mJsSandboxService.createIsolate();
+                } else {
+                    isolateStub = mJsSandboxService.createIsolateWithMaxHeapSizeBytes(
+                            settings.getMaxHeapSizeBytes());
+                    if (isolateStub == null) {
+                        throw new RuntimeException(
+                                "Service implementation doesn't support setting maximum heap size");
+                    }
+                }
+            } catch (RemoteException e) {
+                throw new RuntimeException(e);
+            }
+            return createJsIsolateLocked(isolateStub);
         }
     }
 
@@ -300,6 +338,18 @@
             mClientSideFeatureSet.add(PROVIDE_CONSUME_ARRAY_BUFFER);
             mClientSideFeatureSet.add(WASM_COMPILATION);
         }
+        if (features.contains(IJsSandboxService.ISOLATE_MAX_HEAP_SIZE_LIMIT)) {
+            mClientSideFeatureSet.add(ISOLATE_MAX_HEAP_SIZE);
+        }
+    }
+
+    @GuardedBy("mLock")
+    private JsIsolate createJsIsolateLocked(IJsSandboxIsolate isolateStub) {
+        Executor mainExecutor;
+        mainExecutor = ContextCompat.getMainExecutor(mConnection.mContext);
+        JsIsolate isolate = new JsIsolate(isolateStub, this, mainExecutor);
+        mActiveIsolateSet.add(isolate);
+        return isolate;
     }
 
     /**
diff --git a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
index 5a3179f..4eea5705 100644
--- a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
+++ b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
@@ -20,6 +20,12 @@
     const String ISOLATE_TERMINATION = "ISOLATE_TERMINATION";
 
     /**
+     * Feature flag indicating that isolate creation can take a parameter
+     * to set the maximum heap size limit of the isolate.
+     */
+    const String ISOLATE_MAX_HEAP_SIZE_LIMIT = "ISOLATE_MAX_HEAP_SIZE_LIMIT";
+
+    /**
      * This feature flag is a combination of three sub-features:
      * - If evaluateJavascript() returns a promise, we wait for the promise
      *   to resolve and then return the resolved value.
@@ -34,4 +40,7 @@
      * @return A list of feature names supported by this implementation.
      */
     List<String> getSupportedFeatures() = 1;
+
+    IJsSandboxIsolate createIsolateWithMaxHeapSizeBytes(long maxHeapSize) = 2;
+
 }
diff --git a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxIsolate.java b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxIsolate.java
index 12a2c8c..f178a06 100644
--- a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxIsolate.java
+++ b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxIsolate.java
@@ -25,7 +25,12 @@
     private long mJsSandboxIsolate;
 
     JsSandboxIsolate() {
-        mJsSandboxIsolate = JsSandboxIsolateJni.get().createNativeJsSandboxIsolateWrapper();
+        mJsSandboxIsolate = JsSandboxIsolateJni.get().createNativeJsSandboxIsolateWrapper(0);
+    }
+
+    JsSandboxIsolate(long maxHeapSizeBytes) {
+        mJsSandboxIsolate =
+                JsSandboxIsolateJni.get().createNativeJsSandboxIsolateWrapper(maxHeapSizeBytes);
     }
 
     @Override
@@ -98,7 +103,7 @@
 
     @NativeMethods
     public interface Natives {
-        long createNativeJsSandboxIsolateWrapper();
+        long createNativeJsSandboxIsolateWrapper(long maxHeapSizeBytes);
 
         void initializeEnvironment();
 
diff --git a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxService.java b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxService.java
index 71b3bf4..6762ead 100644
--- a/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxService.java
+++ b/android_webview/js_sandbox/java/src/org/chromium/android_webview/js_sandbox/service/JsSandboxService.java
@@ -21,7 +21,8 @@
     private static final String TAG = "JsSandboxService";
 
     private static final List<String> SUPPORTED_FEATURES = Arrays.asList(
-            IJsSandboxService.ISOLATE_TERMINATION, IJsSandboxService.WASM_FROM_ARRAY_BUFFER);
+            IJsSandboxService.ISOLATE_TERMINATION, IJsSandboxService.WASM_FROM_ARRAY_BUFFER,
+            IJsSandboxService.ISOLATE_MAX_HEAP_SIZE_LIMIT);
 
     private final IJsSandboxService.Stub mBinder = new IJsSandboxService.Stub() {
         @Override
@@ -30,6 +31,11 @@
         }
 
         @Override
+        public IJsSandboxIsolate createIsolateWithMaxHeapSizeBytes(long maxHeapSizeBytes) {
+            return new JsSandboxIsolate(maxHeapSizeBytes);
+        }
+
+        @Override
         public List<String> getSupportedFeatures() {
             return SUPPORTED_FEATURES;
         }
diff --git a/android_webview/js_sandbox/javatests/src/org/chromium/webview_js_sandbox_test/test/WebViewJsSandboxTest.java b/android_webview/js_sandbox/javatests/src/org/chromium/webview_js_sandbox_test/test/WebViewJsSandboxTest.java
index 3ef8ff75..b9720720 100644
--- a/android_webview/js_sandbox/javatests/src/org/chromium/webview_js_sandbox_test/test/WebViewJsSandboxTest.java
+++ b/android_webview/js_sandbox/javatests/src/org/chromium/webview_js_sandbox_test/test/WebViewJsSandboxTest.java
@@ -16,9 +16,11 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.android_webview.js_sandbox.client.EvaluationFailedException;
+import org.chromium.android_webview.js_sandbox.client.IsolateSettings;
 import org.chromium.android_webview.js_sandbox.client.IsolateTerminatedException;
 import org.chromium.android_webview.js_sandbox.client.JsIsolate;
 import org.chromium.android_webview.js_sandbox.client.JsSandbox;
+import org.chromium.android_webview.js_sandbox.client.SandboxDeadException;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.util.DisabledTest;
@@ -471,4 +473,34 @@
             Assert.assertEquals(expected, result);
         }
     }
+
+    @Test
+    @MediumTest
+    public void testHeapSize() throws Throwable {
+        // We need to beat the v8 optimizer to ensure it really allocates the required memory.
+        final String code = "this.array = Array(10000000).fill(Math.random(), 0);"
+                + "var arrayLength = this.array.length;"
+                + "var sum = 0;"
+                + "for (var i = 0; i < arrayLength; i++) {"
+                + " sum+=this.array[i];"
+                + "}";
+        Context context = ContextUtils.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture = JsSandbox.newConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.ISOLATE_MAX_HEAP_SIZE));
+            IsolateSettings isolateStartupParameters = new IsolateSettings();
+            isolateStartupParameters.setMaxHeapSizeBytes(1000);
+            try (JsIsolate jsIsolate = jsSandbox.createIsolate(isolateStartupParameters)) {
+                ListenableFuture<String> resultFuture = jsIsolate.evaluateJavascriptAsync(code);
+                try {
+                    resultFuture.get(5, TimeUnit.SECONDS);
+                    Assert.fail("Should have thrown.");
+                } catch (ExecutionException e) {
+                    if (!(e.getCause() instanceof SandboxDeadException)) {
+                        throw e;
+                    }
+                }
+            }
+        }
+    }
 }
diff --git a/android_webview/js_sandbox/service/js_sandbox_isolate.cc b/android_webview/js_sandbox/service/js_sandbox_isolate.cc
index 51bb3f4..0eda0d2 100644
--- a/android_webview/js_sandbox/service/js_sandbox_isolate.cc
+++ b/android_webview/js_sandbox/service/js_sandbox_isolate.cc
@@ -19,6 +19,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
+#include "base/system/sys_info.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "base/task/thread_pool.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
@@ -115,10 +116,11 @@
   length = len;
 }
 
-JsSandboxIsolate::JsSandboxIsolate() {
+JsSandboxIsolate::JsSandboxIsolate(jlong max_heap_size_bytes) {
+  isolate_max_heap_size_bytes_ = max_heap_size_bytes;
   control_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner({});
   isolate_task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner(
-      {base::TaskPriority::USER_VISIBLE,
+      {base::TaskPriority::USER_BLOCKING,
        base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::MayBlock()},
       base::SingleThreadTaskRunnerThreadMode::DEDICATED);
   control_task_runner_->PostTask(
@@ -304,11 +306,20 @@
 
 // Called from isolate thread.
 void JsSandboxIsolate::InitializeIsolateOnThread() {
+  std::unique_ptr<v8::Isolate::CreateParams> params =
+      gin::IsolateHolder::getDefaultIsolateParams();
+  if (isolate_max_heap_size_bytes_ > 0) {
+    if ((uint64_t)isolate_max_heap_size_bytes_ < UINT_MAX) {
+      params->constraints.ConfigureDefaultsFromHeapSize(
+          0, isolate_max_heap_size_bytes_);
+    } else {
+      params->constraints.ConfigureDefaultsFromHeapSize(0, UINT_MAX);
+    }
+  }
   isolate_holder_ = std::make_unique<gin::IsolateHolder>(
       base::ThreadTaskRunnerHandle::Get(),
       gin::IsolateHolder::AccessMode::kSingleThread,
-      gin::IsolateHolder::IsolateType::kUtility,
-      gin::IsolateHolder::getDefaultIsolateParams());
+      gin::IsolateHolder::IsolateType::kUtility, std::move(params));
   v8::Isolate* isolate = isolate_holder_->isolate();
   v8::Isolate::Scope isolate_scope(isolate);
   isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kAuto);
@@ -515,8 +526,9 @@
 }
 
 static jlong JNI_JsSandboxIsolate_CreateNativeJsSandboxIsolateWrapper(
-    JNIEnv* env) {
-  JsSandboxIsolate* processor = new JsSandboxIsolate();
+    JNIEnv* env,
+    jlong max_heap_size_bytes) {
+  JsSandboxIsolate* processor = new JsSandboxIsolate(max_heap_size_bytes);
   return reinterpret_cast<intptr_t>(processor);
 }
 
diff --git a/android_webview/js_sandbox/service/js_sandbox_isolate.h b/android_webview/js_sandbox/service/js_sandbox_isolate.h
index 581d4a8..dc49103f 100644
--- a/android_webview/js_sandbox/service/js_sandbox_isolate.h
+++ b/android_webview/js_sandbox/service/js_sandbox_isolate.h
@@ -41,7 +41,7 @@
 
 class JsSandboxIsolate {
  public:
-  JsSandboxIsolate();
+  explicit JsSandboxIsolate(jlong max_heap_size_bytes = 0);
   ~JsSandboxIsolate();
 
   using FinishedCallback = base::OnceCallback<void(const std::string&)>;
@@ -116,6 +116,7 @@
   base::Lock named_fd_lock_;
   std::unordered_map<std::string, FdWithLength> named_fd_
       GUARDED_BY(named_fd_lock_);
+  jlong isolate_max_heap_size_bytes_;
 };
 }  // namespace android_webview
 
diff --git a/ash/components/cryptohome/BUILD.gn b/ash/components/cryptohome/BUILD.gn
index 28cf7ac..5b14178b 100644
--- a/ash/components/cryptohome/BUILD.gn
+++ b/ash/components/cryptohome/BUILD.gn
@@ -22,6 +22,12 @@
     "//components/user_manager",
   ]
   sources = [
+    "auth_factor.cc",
+    "auth_factor.h",
+    "auth_factor_conversions.cc",
+    "auth_factor_conversions.h",
+    "auth_factor_input.cc",
+    "auth_factor_input.h",
     "common_types.h",
     "cryptohome_parameters.cc",
     "cryptohome_parameters.h",
diff --git a/ash/components/cryptohome/auth_factor.cc b/ash/components/cryptohome/auth_factor.cc
new file mode 100644
index 0000000..4bba0388
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor.cc
@@ -0,0 +1,83 @@
+// Copyright 2022 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 "ash/components/cryptohome/auth_factor.h"
+
+#include <utility>
+
+#include "ash/components/cryptohome/common_types.h"
+#include "base/check_op.h"
+
+namespace cryptohome {
+
+// =============== `AuthFactorRef` ===============
+AuthFactorRef::AuthFactorRef(AuthFactorType type, KeyLabel label)
+    : type_(type), label_(std::move(label)) {
+  DCHECK(!label_->empty());
+}
+AuthFactorRef::AuthFactorRef(AuthFactorRef&&) = default;
+AuthFactorRef& AuthFactorRef::operator=(AuthFactorRef&&) = default;
+AuthFactorRef::AuthFactorRef(const AuthFactorRef&) = default;
+AuthFactorRef& AuthFactorRef::operator=(const AuthFactorRef&) = default;
+AuthFactorRef::~AuthFactorRef() = default;
+
+// =============== `AuthFactorCommonMetadata` ===============
+AuthFactorCommonMetadata::AuthFactorCommonMetadata() = default;
+AuthFactorCommonMetadata::AuthFactorCommonMetadata(
+    AuthFactorCommonMetadata&&) noexcept = default;
+AuthFactorCommonMetadata& AuthFactorCommonMetadata::operator=(
+    AuthFactorCommonMetadata&&) noexcept = default;
+AuthFactorCommonMetadata::AuthFactorCommonMetadata(
+    const AuthFactorCommonMetadata&) = default;
+AuthFactorCommonMetadata& AuthFactorCommonMetadata::operator=(
+    const AuthFactorCommonMetadata&) = default;
+AuthFactorCommonMetadata::~AuthFactorCommonMetadata() = default;
+
+// =============== `AuthFactor` ===============
+
+AuthFactor::AuthFactor(AuthFactorRef ref, AuthFactorCommonMetadata metadata)
+    : ref_(std::move(ref)), common_metadata_(std::move(metadata)) {}
+
+AuthFactor::AuthFactor(AuthFactorRef ref,
+                       AuthFactorCommonMetadata metadata,
+                       PinStatus status)
+    : ref_(std::move(ref)),
+      common_metadata_(std::move(metadata)),
+      factor_status_(std::move(status)) {
+  CHECK_EQ(ref_.type(), AuthFactorType::kPin);
+}
+
+AuthFactor::AuthFactor(AuthFactorRef ref,
+                       AuthFactorCommonMetadata metadata,
+                       SmartCardMetadata factor_metadata)
+    : ref_(std::move(ref)),
+      common_metadata_(std::move(metadata)),
+      factor_metadata_(std::move(factor_metadata)) {
+  CHECK_EQ(ref_.type(), AuthFactorType::kSmartCard);
+}
+
+AuthFactor::AuthFactor(AuthFactor&&) noexcept = default;
+AuthFactor& AuthFactor::operator=(AuthFactor&&) noexcept = default;
+AuthFactor::AuthFactor(const AuthFactor&) = default;
+AuthFactor& AuthFactor::operator=(const AuthFactor&) = default;
+
+AuthFactor::~AuthFactor() = default;
+
+const AuthFactorRef& AuthFactor::ref() const {
+  return ref_;
+}
+
+const AuthFactorCommonMetadata& AuthFactor::GetCommonMetadata() const {
+  return common_metadata_;
+}
+
+const PinStatus& AuthFactor::GetPinStatus() const {
+  return absl::get<PinStatus>(factor_status_);
+}
+
+const SmartCardMetadata& AuthFactor::GetSmartCardMetadata() const {
+  return absl::get<SmartCardMetadata>(factor_metadata_);
+}
+
+}  // namespace cryptohome
diff --git a/ash/components/cryptohome/auth_factor.h b/ash/components/cryptohome/auth_factor.h
new file mode 100644
index 0000000..e4887086
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor.h
@@ -0,0 +1,127 @@
+// Copyright 2022 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 ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_H_
+#define ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_H_
+
+#include <string>
+
+#include "ash/components/cryptohome/common_types.h"
+#include "base/component_export.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
+
+namespace cryptohome {
+
+enum class AuthFactorType {
+  // Special edge case - on old ChromeOS versions Kiosk keys and passwords for
+  // regular users had no metadata to distinguish them on cryptohome level,
+  // only Chrome can do that based on UserType.
+  // This type can be returned when retrieving data from cryptohome,
+  // but should not be used in any data passed from chrome to cryptohome.
+  kUnknownLegacy,
+  kPassword,
+  kPin,
+  kRecovery,
+  kSmartCard,
+  kKiosk,
+  kLegacyFingerprint
+};
+
+// Reference to a particular AuthFactor.
+// While `label` uniquely identifies factor across all factor types,
+// it is convenient to pass AuthFactorType along.
+class COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) AuthFactorRef {
+ public:
+  AuthFactorRef(AuthFactorType type, KeyLabel label);
+
+  AuthFactorRef(AuthFactorRef&&);
+  AuthFactorRef& operator=(AuthFactorRef&&);
+
+  AuthFactorRef(const AuthFactorRef&);
+  AuthFactorRef& operator=(const AuthFactorRef&);
+
+  ~AuthFactorRef();
+
+  AuthFactorType type() const { return type_; }
+
+  const KeyLabel& label() const { return label_; }
+
+ private:
+  AuthFactorType type_;
+  KeyLabel label_;
+};
+
+// Each auth factor supported by cryptohome has 4 types of data associated with
+// it:
+//   * factor identifiers: type and label (though label can be changed by
+//     cryptohome);
+//   * factor input: part of data that is write-only by Chrome, e.g.
+//     during setting up a factor, or attempting an authentication;
+//   * factor status: data that is set by cryptohome and is read-only on the
+//     Chrome side, e.g. PIN lockout status;
+//   * factor metadata: non-identifying data associated with factor that can
+//     be both read and written by Chrome.
+
+// Common metadata that should be defined for each auth factor.
+class COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) AuthFactorCommonMetadata {
+ public:
+  AuthFactorCommonMetadata();
+  ~AuthFactorCommonMetadata();
+
+  AuthFactorCommonMetadata(AuthFactorCommonMetadata&&) noexcept;
+  AuthFactorCommonMetadata& operator=(AuthFactorCommonMetadata&&) noexcept;
+
+  AuthFactorCommonMetadata(const AuthFactorCommonMetadata&);
+  AuthFactorCommonMetadata& operator=(const AuthFactorCommonMetadata&);
+};
+
+// Per-factor statuses (read-only properties set by cryptohomed):
+
+struct COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) PinStatus {
+  bool auth_locked;
+};
+
+// Factor-specific metadata:
+
+struct COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) SmartCardMetadata {
+  std::string public_key_spki_der;
+};
+
+// AuthFactor definition.
+// If it is obtainted from `cryptohome` it will contain factor-specific status,
+// otherwise it would only contain identity and metadata.
+class COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) AuthFactor {
+ public:
+  AuthFactor(AuthFactorRef ref, AuthFactorCommonMetadata metadata);
+  AuthFactor(AuthFactorRef ref,
+             AuthFactorCommonMetadata metadata,
+             SmartCardMetadata smartcard_metadata);
+  AuthFactor(AuthFactorRef ref,
+             AuthFactorCommonMetadata metadata,
+             PinStatus status);
+
+  AuthFactor(AuthFactor&&) noexcept;
+  AuthFactor& operator=(AuthFactor&&) noexcept;
+  AuthFactor(const AuthFactor&);
+  AuthFactor& operator=(const AuthFactor&);
+
+  ~AuthFactor();
+
+  const AuthFactorRef& ref() const;
+  const AuthFactorCommonMetadata& GetCommonMetadata() const;
+
+  // Fails if type does not match:
+  const PinStatus& GetPinStatus() const;
+  const SmartCardMetadata& GetSmartCardMetadata() const;
+
+ private:
+  AuthFactorRef ref_;
+  AuthFactorCommonMetadata common_metadata_;
+  absl::variant<absl::monostate, PinStatus> factor_status_;
+  absl::variant<absl::monostate, SmartCardMetadata> factor_metadata_;
+};
+
+}  // namespace cryptohome
+
+#endif  // ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_H_
diff --git a/ash/components/cryptohome/auth_factor_conversions.cc b/ash/components/cryptohome/auth_factor_conversions.cc
new file mode 100644
index 0000000..cf1e502
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor_conversions.cc
@@ -0,0 +1,171 @@
+// Copyright 2022 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 "ash/components/cryptohome/auth_factor_conversions.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/logging.h"
+#include "base/notreached.h"
+#include "chromeos/ash/components/dbus/cryptohome/auth_factor.pb.h"
+#include "components/device_event_log/device_event_log.h"
+
+namespace cryptohome {
+
+namespace {
+
+user_data_auth::AuthFactorType ConvertFactorTypeToProto(AuthFactorType type) {
+  switch (type) {
+    case AuthFactorType::kUnknownLegacy:
+      NOTREACHED() << "Unknown factor type should never be sent to cryptohome";
+      return user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED;
+    case AuthFactorType::kPassword:
+      return user_data_auth::AUTH_FACTOR_TYPE_PASSWORD;
+    case AuthFactorType::kPin:
+      return user_data_auth::AUTH_FACTOR_TYPE_PIN;
+    case AuthFactorType::kRecovery:
+      return user_data_auth::AUTH_FACTOR_TYPE_CRYPTOHOME_RECOVERY;
+    case AuthFactorType::kKiosk:
+      return user_data_auth::AUTH_FACTOR_TYPE_KIOSK;
+    case AuthFactorType::kLegacyFingerprint:
+    case AuthFactorType::kSmartCard:
+      NOTIMPLEMENTED() << "Auth factor " << static_cast<int>(type)
+                       << " is not implemented in cryptohome yet.";
+      return user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED;
+  }
+}
+
+}  // namespace
+
+AuthFactorType ConvertFactorTypeFromProto(user_data_auth::AuthFactorType type) {
+  switch (type) {
+    case user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED:
+      NOTREACHED() << "Unknown factor type should be handled separately";
+      return AuthFactorType::kUnknownLegacy;
+    case user_data_auth::AUTH_FACTOR_TYPE_PASSWORD:
+      return AuthFactorType::kPassword;
+    case user_data_auth::AUTH_FACTOR_TYPE_PIN:
+      return AuthFactorType::kPin;
+    case user_data_auth::AUTH_FACTOR_TYPE_CRYPTOHOME_RECOVERY:
+      return AuthFactorType::kRecovery;
+    case user_data_auth::AUTH_FACTOR_TYPE_KIOSK:
+      return AuthFactorType::kKiosk;
+    default:
+      NOTREACHED() << "Unknown auth factor type " << static_cast<int>(type);
+      return AuthFactorType::kUnknownLegacy;
+  }
+}
+
+void SerializeAuthFactor(const AuthFactor& factor,
+                         user_data_auth::AuthFactor* out_proto) {
+  out_proto->set_type(ConvertFactorTypeToProto(factor.ref().type()));
+  out_proto->set_label(factor.ref().label().value());
+  // Do not do anything with is_active_for_login yet.
+
+  // TODO(b/241259026): fill in common metadata.
+
+  switch (factor.ref().type()) {
+    case AuthFactorType::kPassword:
+      out_proto->mutable_password_metadata();
+      break;
+    case AuthFactorType::kPin:
+      out_proto->mutable_pin_metadata();
+      break;
+    case AuthFactorType::kRecovery:
+      out_proto->mutable_cryptohome_recovery_metadata();
+      break;
+    case AuthFactorType::kKiosk:
+      out_proto->mutable_kiosk_metadata();
+      break;
+    case AuthFactorType::kUnknownLegacy:
+      LOG(FATAL) << "Unknown factor type should never be serialized";
+      break;
+    case AuthFactorType::kLegacyFingerprint:
+    case AuthFactorType::kSmartCard:
+      NOTIMPLEMENTED() << "Auth factor "
+                       << static_cast<int>(factor.ref().type())
+                       << " is not implemented in cryptohome yet.";
+  }
+}
+
+void SerializeAuthInput(const AuthFactorRef& ref,
+                        const AuthFactorInput& auth_input,
+                        user_data_auth::AuthInput* out_proto) {
+  DCHECK_EQ(ref.type(), auth_input.GetType());
+  switch (auth_input.GetType()) {
+    case AuthFactorType::kPassword:
+      out_proto->mutable_password_input()->set_secret(
+          auth_input.GetPasswordInput().hashed_password);
+      break;
+    case AuthFactorType::kPin:
+      out_proto->mutable_pin_input()->set_secret(
+          auth_input.GetPinInput().hashed_pin);
+      break;
+    case AuthFactorType::kRecovery: {
+      auto* proto_input = out_proto->mutable_cryptohome_recovery_input();
+      if (auth_input.UsableForAuthentication()) {
+        const auto& recovery_auth = auth_input.GetRecoveryAuthenticationInput();
+        proto_input->set_epoch_response(recovery_auth.epoch_data);
+        proto_input->set_recovery_response(recovery_auth.recovery_data);
+      } else {
+        const auto& recovery_creation = auth_input.GetRecoveryCreationInput();
+        proto_input->set_mediator_pub_key(recovery_creation.pub_key);
+      }
+    } break;
+    case AuthFactorType::kKiosk:
+      // Just create an input.
+      out_proto->mutable_kiosk_input();
+      break;
+    case AuthFactorType::kUnknownLegacy:
+      LOG(FATAL) << "Unknown factor type should never be serialized";
+      break;
+    case AuthFactorType::kLegacyFingerprint:
+    case AuthFactorType::kSmartCard:
+      NOTIMPLEMENTED() << "Auth factor "
+                       << static_cast<int>(auth_input.GetType())
+                       << " is not implemented in cryptohome yet.";
+      break;
+  }
+}
+
+AuthFactor DeserializeAuthFactor(const user_data_auth::AuthFactor& proto,
+                                 AuthFactorType fallback_type) {
+  AuthFactorType type;
+  if (proto.type() == user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED) {
+    LOG(WARNING) << "Unspecified auth factor type found, treating it as a "
+                 << static_cast<int>(fallback_type);
+    type = fallback_type;
+  } else {
+    type = ConvertFactorTypeFromProto(proto.type());
+  }
+  AuthFactorRef ref(type, KeyLabel{proto.label()});
+  AuthFactorCommonMetadata common_metadata;
+  // Ignore is_active_for_login for now
+  // TODO(b/241259026) : fill in common metadata
+  switch (type) {
+    case AuthFactorType::kPassword:
+      return AuthFactor(std::move(ref), std::move(common_metadata));
+    case AuthFactorType::kRecovery:
+      return AuthFactor(std::move(ref), std::move(common_metadata));
+    case AuthFactorType::kKiosk:
+      return AuthFactor(std::move(ref), std::move(common_metadata));
+    case AuthFactorType::kPin: {
+      DCHECK(proto.has_pin_metadata());
+      PinStatus pin_status{proto.pin_metadata().auth_locked()};
+      return AuthFactor(std::move(ref), std::move(common_metadata),
+                        std::move(pin_status));
+    }
+    case AuthFactorType::kUnknownLegacy:
+      LOG(FATAL) << "Should already be handled above";
+      __builtin_unreachable();
+    case AuthFactorType::kLegacyFingerprint:
+    case AuthFactorType::kSmartCard:
+      NOTIMPLEMENTED() << "Auth factor " << static_cast<int>(type)
+                       << " is not implemented in cryptohome yet.";
+      return AuthFactor(std::move(ref), std::move(common_metadata));
+  }
+}
+
+}  // namespace cryptohome
diff --git a/ash/components/cryptohome/auth_factor_conversions.h b/ash/components/cryptohome/auth_factor_conversions.h
new file mode 100644
index 0000000..02a80fe
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor_conversions.h
@@ -0,0 +1,30 @@
+// Copyright 2022 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 ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_CONVERSIONS_H_
+#define ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_CONVERSIONS_H_
+
+#include "ash/components/cryptohome/auth_factor.h"
+#include "ash/components/cryptohome/auth_factor_input.h"
+#include "base/component_export.h"
+#include "chromeos/ash/components/dbus/cryptohome/auth_factor.pb.h"
+
+namespace cryptohome {
+
+COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME)
+AuthFactorType ConvertFactorTypeFromProto(user_data_auth::AuthFactorType type);
+COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME)
+void SerializeAuthFactor(const AuthFactor& factor,
+                         user_data_auth::AuthFactor* out_proto);
+COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME)
+void SerializeAuthInput(const AuthFactorRef& ref,
+                        const AuthFactorInput& auth_input,
+                        user_data_auth::AuthInput* out_proto);
+COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME)
+AuthFactor DeserializeAuthFactor(const user_data_auth::AuthFactor& proto,
+                                 AuthFactorType fallback_type);
+
+}  // namespace cryptohome
+
+#endif  // ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_CONVERSIONS_H_
diff --git a/ash/components/cryptohome/auth_factor_input.cc b/ash/components/cryptohome/auth_factor_input.cc
new file mode 100644
index 0000000..011d1925
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor_input.cc
@@ -0,0 +1,82 @@
+// Copyright 2022 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 "ash/components/cryptohome/auth_factor_input.h"
+
+#include <utility>
+
+#include "ash/components/cryptohome/auth_factor.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
+
+namespace cryptohome {
+
+// =============== `AuthFactorInput` ===============
+
+AuthFactorInput::AuthFactorInput(InputVariant input)
+    : factor_input_(std::move(input)) {}
+
+AuthFactorInput::AuthFactorInput(AuthFactorInput&&) noexcept = default;
+AuthFactorInput& AuthFactorInput::operator=(AuthFactorInput&&) noexcept =
+    default;
+
+AuthFactorInput::~AuthFactorInput() = default;
+
+AuthFactorType AuthFactorInput::GetType() const {
+  if (absl::holds_alternative<AuthFactorInput::Password>(factor_input_))
+    return AuthFactorType::kPassword;
+  if (absl::holds_alternative<AuthFactorInput::Pin>(factor_input_))
+    return AuthFactorType::kPin;
+  if (absl::holds_alternative<AuthFactorInput::Kiosk>(factor_input_))
+    return AuthFactorType::kKiosk;
+  if (absl::holds_alternative<AuthFactorInput::SmartCard>(factor_input_))
+    return AuthFactorType::kSmartCard;
+  if (absl::holds_alternative<AuthFactorInput::RecoveryCreation>(factor_input_))
+    return AuthFactorType::kRecovery;
+  if (absl::holds_alternative<AuthFactorInput::RecoveryAuthentication>(
+          factor_input_))
+    return AuthFactorType::kRecovery;
+  NOTREACHED();
+  return AuthFactorType::kUnknownLegacy;
+}
+
+bool AuthFactorInput::UsableForCreation() const {
+  if (GetType() != AuthFactorType::kRecovery)
+    return true;
+  if (absl::holds_alternative<AuthFactorInput::RecoveryCreation>(factor_input_))
+    return true;
+  return false;
+}
+
+bool AuthFactorInput::UsableForAuthentication() const {
+  if (GetType() != AuthFactorType::kRecovery)
+    return true;
+  if (absl::holds_alternative<AuthFactorInput::RecoveryAuthentication>(
+          factor_input_))
+    return true;
+  return false;
+}
+
+const AuthFactorInput::Password& AuthFactorInput::GetPasswordInput() const {
+  return absl::get<AuthFactorInput::Password>(factor_input_);
+}
+
+const AuthFactorInput::Pin& AuthFactorInput::GetPinInput() const {
+  return absl::get<AuthFactorInput::Pin>(factor_input_);
+}
+
+const AuthFactorInput::RecoveryCreation&
+AuthFactorInput::GetRecoveryCreationInput() const {
+  return absl::get<AuthFactorInput::RecoveryCreation>(factor_input_);
+}
+const AuthFactorInput::RecoveryAuthentication&
+AuthFactorInput::GetRecoveryAuthenticationInput() const {
+  return absl::get<AuthFactorInput::RecoveryAuthentication>(factor_input_);
+}
+const AuthFactorInput::SmartCard& AuthFactorInput::GetSmartCardInput() const {
+  return absl::get<AuthFactorInput::SmartCard>(factor_input_);
+}
+
+}  // namespace cryptohome
diff --git a/ash/components/cryptohome/auth_factor_input.h b/ash/components/cryptohome/auth_factor_input.h
new file mode 100644
index 0000000..7878ba4
--- /dev/null
+++ b/ash/components/cryptohome/auth_factor_input.h
@@ -0,0 +1,77 @@
+// Copyright 2022 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 ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_INPUT_H_
+#define ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_INPUT_H_
+
+#include <string>
+
+#include "ash/components/cryptohome/auth_factor.h"
+#include "base/component_export.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
+
+namespace cryptohome {
+
+class COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) AuthFactorInput {
+ public:
+  struct Password {
+    std::string hashed_password;
+  };
+
+  struct Pin {
+    std::string hashed_pin;
+  };
+
+  struct RecoveryCreation {
+    std::string pub_key;
+  };
+
+  struct RecoveryAuthentication {
+    std::string epoch_data;
+    std::string recovery_data;
+  };
+
+  struct SmartCard {
+    // (b/241259026): introdude proper enum instead of int.
+    int signature_algorithm;
+    std::string key_delegate_dbus_service_name;
+  };
+
+  struct Kiosk {};
+
+  using InputVariant = absl::variant<Password,
+                                     Pin,
+                                     RecoveryCreation,
+                                     RecoveryAuthentication,
+                                     SmartCard,
+                                     Kiosk>;
+
+  explicit AuthFactorInput(InputVariant input);
+
+  AuthFactorInput(AuthFactorInput&&) noexcept;
+  AuthFactorInput& operator=(AuthFactorInput&&) noexcept;
+
+  // AuthFactorInput should not be copied.
+  AuthFactorInput(const AuthFactorInput&) = delete;
+  AuthFactorInput& operator=(const AuthFactorInput&) = delete;
+  ~AuthFactorInput();
+
+  AuthFactorType GetType() const;
+  bool UsableForCreation() const;
+  bool UsableForAuthentication() const;
+
+  // Fails if type does not match:
+  const Password& GetPasswordInput() const;
+  const Pin& GetPinInput() const;
+  const RecoveryCreation& GetRecoveryCreationInput() const;
+  const RecoveryAuthentication& GetRecoveryAuthenticationInput() const;
+  const SmartCard& GetSmartCardInput() const;
+
+ private:
+  InputVariant factor_input_;
+};
+
+}  // namespace cryptohome
+
+#endif  // ASH_COMPONENTS_CRYPTOHOME_AUTH_FACTOR_INPUT_H_
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index fc10ae7..3c83d6b 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1546,6 +1546,10 @@
 const base::Feature kUseAuthsessionAuthentication{
     "UseAuthsessionAuthentication", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Uses new AuthFactor-based API when communicating with cryptohome.
+const base::Feature kUseAuthFactors{"UseAuthFactors",
+                                    base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables using the BluetoothSystem Mojo interface for Bluetooth operations.
 const base::Feature kUseBluetoothSystemInAsh{"UseBluetoothSystemInAsh",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
@@ -2419,6 +2423,10 @@
   return base::FeatureList::IsEnabled(kUploadOfficeToCloud);
 }
 
+bool IsUseAuthFactorsEnabled() {
+  return base::FeatureList::IsEnabled(kUseAuthFactors);
+}
+
 bool IsUseLoginShelfWidgetEnabled() {
   return base::FeatureList::IsEnabled(kUseLoginShelfWidget);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index cbf5520..c2468b7 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -623,6 +623,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kUseAuthsessionAuthentication;
 COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kUseAuthFactors;
+COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kUseBluetoothSystemInAsh;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kUseLoginShelfWidget;
@@ -866,6 +868,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTrafficCountersEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTrilinearFilteringEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsUploadOfficeToCloudEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsUseAuthFactorsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsUseLoginShelfWidgetEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsUseStorkSmdsServerAddressEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsWallpaperFastRefreshEnabled();
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index fdd5756..c4906c0 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">কে’বলে কাৰ্যক্ষমতাত প্ৰভাৱ পেলাব পাৰে</translation>
 <translation id="2903844815300039659"><ph name="NAME" />ৰ সৈতে সংযোগ কৰা হ’ল, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">স্ক্ৰীন কেপচাৰ</translation>
+<translation id="2925246975070834767">স্বয়ংক্ৰিয় জুম ব্যৱহাৰ কৰি চাওক যাতে আপুনি স্ক্ৰীনখনৰ মাজত থাকে। এইটো ক্ষিপ্ৰ ছেটিঙত অন কৰক।</translation>
 <translation id="2941112035454246133">কম</translation>
 <translation id="2942350706960889382">ড'ক কৰা বিৱৰ্ধক</translation>
 <translation id="2942516765047364088">শ্বেল্ফৰ স্থান</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">ডিভাইচ</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, তৰাযুক্ত মূল্যাংকন <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{এদিনৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}one{# দিনৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}other{# দিনৰ ভিতৰত ডিভাইচটো পূৰ্বৱৰ্তী সংস্কৰণলৈ সলনি কৰক}}</translation>
+<translation id="4633636853437260449">মচিবলৈ Ctrl+W টিপক</translation>
 <translation id="4642092649622328492">আংশিক স্ক্ৰীণশ্বট লওক</translation>
 <translation id="4644727592819780893">কেমেৰাত খাপ খাবলৈ অঞ্চলটোৰ আকাৰ অতি সৰু</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, এপৰ চুপাৰিছ</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index f4fc062..1d5777e 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -469,6 +469,7 @@
 <translation id="3708186454126126312">Öncə qoşulmuş cihazlar</translation>
 <translation id="371370241367527062">Ön mikrofon</translation>
 <translation id="3713734891607377840">Tamamlandıqda açın</translation>
+<translation id="3724279623330129812">Avtomatik miqyaslama kameranı mərkəzə gətirib</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> və daha <ph name="UNAVAILABLE_APPS_COUNT" /> tətbiq bu cihazda yoxdur.</translation>
 <translation id="3735740477244556633">Çeşidləyin</translation>
 <translation id="3742055079367172538">Skrinşot çəkildi</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index cdd9895..515e33c 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Кабелът може да се отразява на ефективността</translation>
 <translation id="2903844815300039659">Установена е връзка с мрежата „<ph name="NAME" />“, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Екранни снимки</translation>
+<translation id="2925246975070834767">Изпробвайте функцията за автоматично мащабиране, така че да сте в центъра на екрана. Включете я от бързите настройки.</translation>
 <translation id="2941112035454246133">Нисък</translation>
 <translation id="2942350706960889382">Лупа в прикрепен режим</translation>
 <translation id="2942516765047364088">Позиция на лавицата</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">Устройства</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, оценка със звезди: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Връщане на устройството към предишна версия в рамките на един ден}other{Връщане на устройството към предишна версия в рамките на # дни}}</translation>
+<translation id="4633636853437260449">Натиснете Ctrl + W за изтриване</translation>
 <translation id="4642092649622328492">Създаване на частична екранна снимка</translation>
 <translation id="4644727592819780893">Областта е твърде малка за визуализиране в камерата</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, препоръка за приложение</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 5cfbec4..4a8b29c 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -100,6 +100,7 @@
 <translation id="1455242230282523554">ভাষার সেটিংস দেখুন</translation>
 <translation id="1460620680449458626">ভলিউম মিউট করা আছে।</translation>
 <translation id="1467432559032391204">বামে</translation>
+<translation id="146902737843070955">আপনার অ্যাডমিনিস্ট্রেটর এই পরিবর্তন করার জন্য অনুরোধ করেছেন</translation>
 <translation id="147310119694673958">ফোনে <ph name="BATTERY_PERCENTAGE" />% চার্জ আছে</translation>
 <translation id="1479909375538722835">ভাসমান অ্যাক্সেসিবিলিটি মেনু</translation>
 <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Calendar ভিউ খোলার জন্য এন্টার প্রেস করুন</translation>
@@ -837,6 +838,7 @@
 <translation id="5779721926447984944">পিন করা ফাইল</translation>
 <translation id="5788127256798019331">Play ফাইল</translation>
 <translation id="5790085346892983794">সফল</translation>
+<translation id="5804651031882187592">"সিম কার্ড লক করা" সেটিং বন্ধ করা</translation>
 <translation id="5805809050170488595"><ph name="NETWORK_NAME" /> চালু করতে ক্লিক করুন</translation>
 <translation id="5825969630400862129">কানেক্ট করা ডিভাইসের সেটিংস</translation>
 <translation id="5837036133683224804"><ph name="RECEIVER_NAME" />-এ <ph name="ROUTE_TITLE" /> বন্ধ করুন</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index df1850cd..ba9733f 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kabl može uticati na performanse</translation>
 <translation id="2903844815300039659">Povezani ste na mrežu <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Snimci ekrana</translation>
+<translation id="2925246975070834767">Isprobajte automatsko zumiranje da budete u centru ekrana. Uključite ga u Brzim postavkama.</translation>
 <translation id="2941112035454246133">Niska</translation>
 <translation id="2942350706960889382">Povećalo je uključeno</translation>
 <translation id="2942516765047364088">Položaj police</translation>
@@ -469,7 +470,7 @@
 <translation id="3708186454126126312">Prethodno povezano</translation>
 <translation id="371370241367527062">Prednji mikrofon</translation>
 <translation id="3713734891607377840">Otvori kada se završi</translation>
-<translation id="3724279623330129812">Automatsko zumiranje centriralo je kameru</translation>
+<translation id="3724279623330129812">Automatsko zumiranje je centriralo kameru</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> aplikacije(a) nisu na ovom uređaju.</translation>
 <translation id="3735740477244556633">Poredaj po</translation>
 <translation id="3742055079367172538">Snimak ekrana je napravljen</translation>
@@ -634,6 +635,7 @@
 <translation id="4628757576491864469">Uređaji</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, ocjena zvjezdicama <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Vratite uređaj na prethodnu verziju u roku od jednog dana}one{Vratite uređaj na prethodnu verziju u roku od # dana}few{Vratite uređaj na prethodnu verziju u roku od # dana}other{Vratite uređaj na prethodnu verziju u roku od # dana}}</translation>
+<translation id="4633636853437260449">Pritisnite Ctrl+W da izbrišete</translation>
 <translation id="4642092649622328492">Napravite djelomičan snimak ekrana</translation>
 <translation id="4644727592819780893">Regija je premala da stane kamera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, preporučena aplikacija</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 86cea15..cdb7ad1 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">És possible que el cable afecti el rendiment</translation>
 <translation id="2903844815300039659">Estàs connectat a <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Captures de pantalla</translation>
+<translation id="2925246975070834767">Prova el zoom automàtic per ser al centre de la pantalla. Activa'l a la configuració ràpida.</translation>
 <translation id="2941112035454246133">Baixa</translation>
 <translation id="2942350706960889382">Lupa acoblada</translation>
 <translation id="2942516765047364088">Posició del prestatge</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">Dispositius</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />; puntuació en estrelles: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Canvia el dispositiu a la versió anterior que tenia fa un dia}other{Canvia el dispositiu a la versió anterior que tenia fa # dies}}</translation>
+<translation id="4633636853437260449">Prem Ctrl+W per suprimir</translation>
 <translation id="4642092649622328492">Fes una captura de pantalla parcial</translation>
 <translation id="4644727592819780893">La zona és massa petita perquè s'ajusti a la càmera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, recomanació d'aplicació</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb
index 24a2f93..66bbcd2 100644
--- a/ash/strings/ash_strings_cy.xtb
+++ b/ash/strings/ash_strings_cy.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Mae'n bosib bod y cebl yn effeithio ar berfformiad</translation>
 <translation id="2903844815300039659">Wedi cysylltu â <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Sgrinluniau</translation>
+<translation id="2925246975070834767">Rhowch gynnig ar awtochwyddo fel y byddwch yng nghanol y sgrîn. Trowch ef ymlaen yn y Gosodiadau Cyflym.</translation>
 <translation id="2941112035454246133">Isel</translation>
 <translation id="2942350706960889382">Chwyddwr sydd wedi'i Docio</translation>
 <translation id="2942516765047364088">lleoliad y silff</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Wedi cysylltu'n flaenorol</translation>
 <translation id="371370241367527062">Meicroffon blaen</translation>
 <translation id="3713734891607377840">Agor pan fydd wedi'i gwblhau</translation>
+<translation id="3724279623330129812">Gwnaeth awtochwyddo ganoli'r camera</translation>
 <translation id="3726171378575546917">Nid yw <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, a <ph name="UNAVAILABLE_APPS_COUNT" /> arall ar y ddyfais hon.</translation>
 <translation id="3735740477244556633">Trefnu yn ôl</translation>
 <translation id="3742055079367172538">Wedi tynnu sgrinlun</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">Dyfeisiau</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Sgôr seren <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Newid dyfais i'r fersiwn flaenorol o fewn diwrnod}zero{Newid dyfais i'r fersiwn flaenorol o fewn # diwrnod}two{Newid dyfais i'r fersiwn flaenorol o fewn # ddiwrnod}few{Newid dyfais i'r fersiwn flaenorol o fewn # diwrnod}many{Newid dyfais i'r fersiwn flaenorol o fewn # diwrnod}other{Newid dyfais i'r fersiwn flaenorol o fewn # diwrnod}}</translation>
+<translation id="4633636853437260449">Pwyswch Ctrl+W i ddileu</translation>
 <translation id="4642092649622328492">Tynnu sgrinlun rhannol</translation>
 <translation id="4644727592819780893">Rhanbarth yn rhy fach i ffitio camera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Argymhelliad ap</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 518ce4d..a95af1bb 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kabel beeinträchtigt eventuell die Leistung</translation>
 <translation id="2903844815300039659">Verbunden mit <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Screenshots</translation>
+<translation id="2925246975070834767">Probiere den automatischen Zoom aus – dabei wird die Kamera so angepasst, dass du dich in der Mitte des Bildschirm siehst. Du kannst die Funktion in den Schnelleinstellungen aktivieren.</translation>
 <translation id="2941112035454246133">Niedrig</translation>
 <translation id="2942350706960889382">Angedockte Lupe</translation>
 <translation id="2942516765047364088">Ablageposition</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">Geräte</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Bewertung von <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Gerät innerhalb von einem Tag auf eine frühere Version zurücksetzen}other{Gerät innerhalb von # Tagen auf eine frühere Version zurücksetzen}}</translation>
+<translation id="4633636853437260449">Drücke zum Löschen Strg + W</translation>
 <translation id="4642092649622328492">Screenshot eines Bildschirmausschnitts erstellen</translation>
 <translation id="4644727592819780893">Aufnahmebereich zu klein für Kamera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, App-Empfehlung</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 5b574f51..c277378 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">El cable podría afectar al rendimiento</translation>
 <translation id="2903844815300039659">Conectado a <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Capturas de pantalla</translation>
+<translation id="2925246975070834767">Prueba el zoom automático para estar en el centro de la pantalla. Actívalo en los ajustes rápidos.</translation>
 <translation id="2941112035454246133">Baja</translation>
 <translation id="2942350706960889382">Lupa fijada</translation>
 <translation id="2942516765047364088">Posición de la estantería</translation>
@@ -634,6 +635,7 @@
 <translation id="4628757576491864469">Dispositivos</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, valoración por estrellas de <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Cambia el dispositivo a la versión anterior en un plazo de 1 día}other{Cambia el dispositivo a la versión anterior en un plazo de # días}}</translation>
+<translation id="4633636853437260449">Pulsa Ctrl + W para eliminar</translation>
 <translation id="4642092649622328492">Hacer una captura de pantalla parcial</translation>
 <translation id="4644727592819780893">El área es demasiado pequeña para que la cámara la capte</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, aplicación recomendada</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 4d9e103d..93198c9f 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kaabel võib toimivust mõjutada</translation>
 <translation id="2903844815300039659">Ühendatud võrguga <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Ekraanipildid</translation>
+<translation id="2925246975070834767">Kasutage automaatset suumimist, et oleksite ekraanikuva keskel. Lülitage see sisse kiirseadete kaudu.</translation>
 <translation id="2941112035454246133">Madal</translation>
 <translation id="2942350706960889382">Dokitud luup</translation>
 <translation id="2942516765047364088">Riiuli positsioon</translation>
@@ -634,6 +635,7 @@
 <translation id="4628757576491864469">Seadmed</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, tärnhinnang <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Teil on seadme operatsioonisüsteemi eelmisele versioonile üleminekuks aega üks päev}other{Teil on seadme operatsioonisüsteemi eelmisele versioonile üleminekuks aega # päeva}}</translation>
+<translation id="4633636853437260449">Kustutamiseks vajutage klahve Ctrl + W</translation>
 <translation id="4642092649622328492">Osalise ekraanipildi jäädvustamine</translation>
 <translation id="4644727592819780893">Ala on kaamera mahutamiseks liiga väike</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, rakenduse soovitus</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index d2720ab..b07c3814 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -469,6 +469,7 @@
 <translation id="3708186454126126312">Aurretik konektatutakoak</translation>
 <translation id="371370241367527062">Aurreko mikrofonoa</translation>
 <translation id="3713734891607377840">Deskarga amaitzen denean irekiko da</translation>
+<translation id="3724279623330129812">Zoom automatikoak kamera erdiratu du</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> eta beste <ph name="UNAVAILABLE_APPS_COUNT" /> ez daude gailuan.</translation>
 <translation id="3735740477244556633">Ordenatzeko irizpidea</translation>
 <translation id="3742055079367172538">Pantaila-argazkia hartu da</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 7a7756a..f43cd96 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">کابل می‌تواند بر عملکرد تأثیر بگذارد</translation>
 <translation id="2903844815300039659">متصل به <ph name="NAME" /> با <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">نماگرفت‌ها</translation>
+<translation id="2925246975070834767">بزرگ‌نمایی خودکار را امتحان کنید تا در مرکز صفحه قرار بگیرید. آن را در «تنظیمات فوری» روشن کنید.</translation>
 <translation id="2941112035454246133">کم</translation>
 <translation id="2942350706960889382">ذره‌بین متصل</translation>
 <translation id="2942516765047364088">موقعیت قفسه</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">قبلاً متصل‌شده</translation>
 <translation id="371370241367527062">میکروفون جلو</translation>
 <translation id="3713734891607377840">بعداز تکمیل بارگیری باز می‌شود</translation>
+<translation id="3724279623330129812">بزرگ‌نمایی خودکار دوربین را در مرکز قرار داد</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، و <ph name="UNAVAILABLE_APPS_COUNT" /> برنامه دیگر در این دستگاه وجود ندارند.</translation>
 <translation id="3735740477244556633">مرتب کردن براساس</translation>
 <translation id="3742055079367172538">نماگرفت گرفته شد</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">دستگاه‌ها</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />، رده‌بندی با ستاره <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{ظرف یک روز آینده، دستگاه را به نسخه قبلی تغییر دهید}one{ظرف # روز آینده، دستگاه را به نسخه قبلی تغییر دهید}other{ظرف # روز آینده، دستگاه را به نسخه قبلی تغییر دهید}}</translation>
+<translation id="4633636853437260449">‏برای حذف، Ctrl+W را فشار دهید</translation>
 <translation id="4642092649622328492">گرفتن عکس از قسمتی از صفحه‌نمایش</translation>
 <translation id="4644727592819780893">ناحیه بسیار کوچک است و نمی‌توان آن را در پیش‌نمای دوربین نشان داد</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />، توصیه برنامه</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 5a228d61..c39936c 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -469,6 +469,7 @@
 <translation id="3708186454126126312">Aiemmin yhdistetyt</translation>
 <translation id="371370241367527062">Etumikrofoni</translation>
 <translation id="3713734891607377840">Avaa kun valmis</translation>
+<translation id="3724279623330129812">Automaattinen zoomaus on keskittänyt kameran</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja <ph name="UNAVAILABLE_APPS_COUNT" /> muuta puuttuvat laitteelta.</translation>
 <translation id="3735740477244556633">Lajitteluperuste</translation>
 <translation id="3742055079367172538">Kuvakaappaus otettu</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index be2f060f..7041b58 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Le câble peut avoir une incidence sur les performances</translation>
 <translation id="2903844815300039659">Connecté à <ph name="NAME" /> – <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Captures d'écran</translation>
+<translation id="2925246975070834767">Essayez le zoom automatique pour être au centre de l'écran. Activez-le dans les Réglages rapides.</translation>
 <translation id="2941112035454246133">Faible</translation>
 <translation id="2942350706960889382">Loupe ancrée</translation>
 <translation id="2942516765047364088">Position de l'étagère</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">Appareils</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, note : <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Rétablir une version antérieure de l'appareil d'ici 1 jour}one{Rétablir une version antérieure de l'appareil d'ici # jour}other{Rétablir une version antérieure de l'appareil d'ici # jours}}</translation>
+<translation id="4633636853437260449">Appuyez sur Ctrl+W pour supprimer</translation>
 <translation id="4642092649622328492">Faire une capture d'écran partielle</translation>
 <translation id="4644727592819780893">La surface de prise de vue est trop petite pour l'appareil photo</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, recommandation d'application</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index d09a1ce..941c571b 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kabel dapat memengaruhi performa</translation>
 <translation id="2903844815300039659">Terhubung ke <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Screenshot</translation>
+<translation id="2925246975070834767">Coba zoom otomatis agar Anda berada di tengah layar. Aktifkan di Setelan Cepat.</translation>
 <translation id="2941112035454246133">Rendah</translation>
 <translation id="2942350706960889382">Kaca Pembesar Tersemat</translation>
 <translation id="2942516765047364088">Posisi rak</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Terhubung sebelumnya</translation>
 <translation id="371370241367527062">Mikrofon depan</translation>
 <translation id="3713734891607377840">Buka saat selesai</translation>
+<translation id="3724279623330129812">Zoom otomatis memusatkan fokus kamera</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, dan <ph name="UNAVAILABLE_APPS_COUNT" /> lainnya tidak ada di perangkat ini.</translation>
 <translation id="3735740477244556633">Urutkan menurut</translation>
 <translation id="3742055079367172538">Screenshot telah diambil</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">Perangkat</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Rating bintang <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Ubah perangkat ke versi sebelumnya dalam 1 hari}other{Ubah perangkat ke versi sebelumnya dalam # hari}}</translation>
+<translation id="4633636853437260449">Tekan Ctrl+W untuk menghapus</translation>
 <translation id="4642092649622328492">Mengambil screenshot sebagian</translation>
 <translation id="4644727592819780893">Wilayah terlalu kecil untuk ditampilkan di pratinjau kamera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Rekomendasi aplikasi</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index fa1c2cde..b27116f 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -469,6 +469,7 @@
 <translation id="3708186454126126312">Áður tengt</translation>
 <translation id="371370241367527062">Fremri hljóðnemi</translation>
 <translation id="3713734891607377840">Opna þegar niðurhali lýkur</translation>
+<translation id="3724279623330129812">Myndavélin var miðjusett með sjálfvirkum aðdrætti</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> í viðbót eru ekki í þessu tæki.</translation>
 <translation id="3735740477244556633">Raða eftir</translation>
 <translation id="3742055079367172538">Skjámynd tekin</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 8d3aba8..9f43941 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Il cavo può influire sulle prestazioni</translation>
 <translation id="2903844815300039659">Connesso a <ph name="NAME" />, <ph name="STRENGTH" />.</translation>
 <translation id="2914580577416829331">Schermate acquisite</translation>
+<translation id="2925246975070834767">Prova lo zoom automatico in modo da essere al centro dello schermo. Attivalo nelle Impostazioni rapide.</translation>
 <translation id="2941112035454246133">Bassa</translation>
 <translation id="2942350706960889382">Lente d'ingrandimento ancorata</translation>
 <translation id="2942516765047364088">Posizione barra delle app</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Connessi in precedenza</translation>
 <translation id="371370241367527062">Microfono anteriore</translation>
 <translation id="3713734891607377840">Apri dopo il completamento</translation>
+<translation id="3724279623330129812">Lo zoom automatico ha centrato la fotocamera</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e altre <ph name="UNAVAILABLE_APPS_COUNT" /> app non sono disponibili su questo dispositivo.</translation>
 <translation id="3735740477244556633">Ordina per</translation>
 <translation id="3742055079367172538">Screenshot acquisito</translation>
@@ -634,6 +636,7 @@
 <translation id="4628757576491864469">Dispositivi</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, valutazione a stelle <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Ripristina la versione precedente del dispositivo entro un giorno}other{Ripristina la versione precedente del dispositivo entro # giorni}}</translation>
+<translation id="4633636853437260449">Premi Ctrl + W per eliminare</translation>
 <translation id="4642092649622328492">Acquisisce lo screenshot parziale</translation>
 <translation id="4644727592819780893">Area troppo piccola per mostrare l'anteprima della fotocamera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, consiglio applicazione</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index 4eb243c..72bba16 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -100,6 +100,7 @@
 <translation id="1455242230282523554">ენის პარამეტრების ჩვენება</translation>
 <translation id="1460620680449458626">ხმა დადუმებულია.</translation>
 <translation id="1467432559032391204">მარცხენა</translation>
+<translation id="146902737843070955">თქვენმა ადმინისტრატორმა მოითხოვა ეს ცვლილება</translation>
 <translation id="147310119694673958">ტელეფონის ბატარეა: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="1479909375538722835">მარტივი წვდომის მოლივლივე მენიუ</translation>
 <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, კალენდრის ხედის გასახსნელად დააჭირეთ კლავიშს „Enter“</translation>
@@ -837,6 +838,7 @@
 <translation id="5779721926447984944">ჩამაგრებული ფაილები</translation>
 <translation id="5788127256798019331">Play ფაილები</translation>
 <translation id="5790085346892983794">წარმატება</translation>
+<translation id="5804651031882187592">გამორთეთ „SIM ბარათის ჩაკეტვის“ პარამეტრი</translation>
 <translation id="5805809050170488595">დააწკაპუნეთ, <ph name="NETWORK_NAME" /> რომ გაააქტიუროთ</translation>
 <translation id="5825969630400862129">დაკავშირებული მოწყობილობების პარამეტრები</translation>
 <translation id="5837036133683224804"><ph name="ROUTE_TITLE" />-ის შეწყვეტა „<ph name="RECEIVER_NAME" />“-ში</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 6a9d46b..24d4ad8 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -470,6 +470,7 @@
 <translation id="3708186454126126312">Бұған дейін жалғанғандар</translation>
 <translation id="371370241367527062">Алдыңғы микрофон</translation>
 <translation id="3713734891607377840">Жүктеп алынған соң ашу</translation>
+<translation id="3724279623330129812">Автоматты масштабтау функциясы камераны ортасына туралады.</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> және тағы <ph name="UNAVAILABLE_APPS_COUNT" /> қолданба бұл құрылғыда жоқ.</translation>
 <translation id="3735740477244556633">Сұрыптау шарты</translation>
 <translation id="3742055079367172538">Скриншот түсірілді</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index c572dd7..e33b877 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">케이블이 성능에 영향을 줄 수 있습니다</translation>
 <translation id="2903844815300039659"><ph name="NAME" />에 연결됨, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">화면 캡처</translation>
+<translation id="2925246975070834767">화면 중앙에 콘텐츠가 표시되도록 자동 확대를 사용해 보세요. 빠른 설정에서 사용 설정하면 됩니다.</translation>
 <translation id="2941112035454246133">낮음</translation>
 <translation id="2942350706960889382">고정 돋보기</translation>
 <translation id="2942516765047364088">실행기 위치</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">이전에 연결된 기기</translation>
 <translation id="371370241367527062">전면 마이크</translation>
 <translation id="3713734891607377840">완료되면 열기</translation>
+<translation id="3724279623330129812">카메라 중앙에서 자동 확대</translation>
 <translation id="3726171378575546917">이 기기에 <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> 외 앱 <ph name="UNAVAILABLE_APPS_COUNT" />개가 없습니다.</translation>
 <translation id="3735740477244556633">정렬 기준</translation>
 <translation id="3742055079367172538">찍은 스크린샷</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">기기</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, 별표 평점 <ph name="RATING_SCORE" />점</translation>
 <translation id="4633185660152240791">{0,plural, =1{하루 안에 기기를 이전 버전으로 되돌리세요}other{#일 이내에 기기를 이전 버전으로 되돌리세요}}</translation>
+<translation id="4633636853437260449">Ctrl+W를 눌러 삭제</translation>
 <translation id="4642092649622328492">부분 스크린샷 찍기</translation>
 <translation id="4644727592819780893">영역이 너무 작아서 카메라 미리보기를 표시할 수 없습니다.</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, 앱 추천</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index dfc1a87..4ff58ea 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Кабель майнаптуулукка кедергисин тийгизиши мүмкүн</translation>
 <translation id="2903844815300039659"><ph name="NAME" /> тармагына туташып турат, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Экрандан тартылып алынгандар</translation>
+<translation id="2925246975070834767">Камераны сиз экрандын борборунда болгудай кылып автоматтык түрдө чоңойтуп көрүңүз. Аны Ыкчам параметрлерден колдонуп көрүңүз.</translation>
 <translation id="2941112035454246133">Төмөн</translation>
 <translation id="2942350706960889382">Жалгаштырылган лупа</translation>
 <translation id="2942516765047364088">Текченин жайгашуусу</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Буга чейин туташкан түзмөктөр</translation>
 <translation id="371370241367527062">Маңдайкы микрофон</translation>
 <translation id="3713734891607377840">Жүктөлүп бүткөндөн кийин ачылсын</translation>
+<translation id="3724279623330129812">Камеранын ортосун автоматтык түрдө чоңойтуу</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> жана дагы<ph name="UNAVAILABLE_APPS_COUNT" /> колдонмо бул түзмөктө жок.</translation>
 <translation id="3735740477244556633">Төмөнкү боюнча иргөө</translation>
 <translation id="3742055079367172538">Скриншот тартылды</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">Түзмөктөр</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Рейтинги: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Түзмөктү бир күндүн ичинде мурунку версияга өзгөртүңүз}other{Түзмөктү # күндүн ичинде мурунку версияга өзгөртүңүз}}</translation>
+<translation id="4633636853437260449">Өчүрүү үчүн Ctrl+W баскычтарын басыңыз</translation>
 <translation id="4642092649622328492">Экрандын бир бөлүгүн тартып алуу</translation>
 <translation id="4644727592819780893">Аймак камера үчүн өтө кичинекей</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Сунушталган колдонмо</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index 5f6e2a4..aa83adb 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -100,6 +100,7 @@
 <translation id="1455242230282523554">Хэлний тохиргоог харуулах</translation>
 <translation id="1460620680449458626">Дууг хаасан.</translation>
 <translation id="1467432559032391204">Зүүн</translation>
+<translation id="146902737843070955">Таны администратор энэ өөрчлөлтийг хүссэн</translation>
 <translation id="147310119694673958">Утасны батарей <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="1479909375538722835">Хөвж буй хандалтын цэс</translation>
 <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Календарийн харагдах байдлыг нээхийн тулд enter товчийг дарна уу</translation>
@@ -838,6 +839,7 @@
 <translation id="5779721926447984944">Бэхэлсэн файлууд</translation>
 <translation id="5788127256798019331">Файлуудыг тоглуулах</translation>
 <translation id="5790085346892983794">Амжилттай гүйцэтгэлээ</translation>
+<translation id="5804651031882187592">"SIM-г түгжих" тохиргоог унтраах</translation>
 <translation id="5805809050170488595"><ph name="NETWORK_NAME" />-г идэвхжүүлэхийн тулд товших</translation>
 <translation id="5825969630400862129">Холбогдсон төхөөрөмжүүдийн тохиргоо</translation>
 <translation id="5837036133683224804"><ph name="RECEIVER_NAME" />-г <ph name="ROUTE_TITLE" />-д дамжуулахаа зогсоох</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 7ca0509..9172a7e 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">केबलमुळे परफॉर्मन्सवर परिणाम होऊ शकतो</translation>
 <translation id="2903844815300039659"><ph name="NAME" />, <ph name="STRENGTH" /> शी कनेक्ट केलेले</translation>
 <translation id="2914580577416829331">स्क्रीन कॅप्चर</translation>
+<translation id="2925246975070834767">ऑटोझूम वापरून पहा, जेणेकरून तुम्ही स्क्रीनच्या मध्यभागी राहाल. ते क्विक सेटिंग्जमध्ये सुरू करा.</translation>
 <translation id="2941112035454246133">निम्न</translation>
 <translation id="2942350706960889382">डॉक केलेले मॅग्निफायर</translation>
 <translation id="2942516765047364088">शेल्फ स्थिती</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">डिव्हाइस</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, तारा रेटिंग <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{एक दिवसामध्ये डिव्हाइस मागील आवृत्तीवर बदला}other{# दिवसांमध्ये डिव्हाइस मागील आवृत्तीवर बदला}}</translation>
+<translation id="4633636853437260449">हटवण्यासाठी Ctrl+W दाबा</translation>
 <translation id="4642092649622328492">अर्धा स्क्रीनशॉट घ्या</translation>
 <translation id="4644727592819780893">कॅमेरा बसवण्यासाठी जागा खूप लहान आहे</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, ॲप शिफारस</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 54c3ce68..2ddab6478 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">ਕੇਬਲ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦੀ ਹੈ</translation>
 <translation id="2903844815300039659"><ph name="NAME" /> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">ਸਕ੍ਰੀਨ ਕੈਪਚਰ</translation>
+<translation id="2925246975070834767">ਸਵੈ ਜ਼ੂਮ ਵਰਤ ਕੇ ਦੇਖੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਸਕ੍ਰੀਨ ਦੇ ਕੇਂਦਰ ਵਿੱਚ ਹੋਵੋਗੇ। ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸਨੂੰ ਚਾਲੂ ਕਰੋ।</translation>
 <translation id="2941112035454246133">ਘੱਟ</translation>
 <translation id="2942350706960889382">ਡੌਕ ਕੀਤਾ ਵਿਸਤਾਰਕ</translation>
 <translation id="2942516765047364088">ਸ਼ੈਲਫ ਪੋਜੀਸ਼ਨ</translation>
@@ -634,6 +635,7 @@
 <translation id="4628757576491864469">ਡਿਵਾਈਸਾਂ</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, ਤਾਰਾ ਰੇਟਿੰਗ <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{ਡੀਵਾਈਸ ਨੂੰ ਇੱਕ ਦਿਨ ਵਿੱਚ ਹੀ ਪਿਛਲੇ ਵਰਜਨ 'ਤੇ ਬਦਲੋ}one{ਡੀਵਾਈਸ ਨੂੰ # ਦਿਨ ਵਿੱਚ ਹੀ ਪਿਛਲੇ ਵਰਜਨ 'ਤੇ ਬਦਲੋ}other{ਡੀਵਾਈਸ ਨੂੰ # ਦਿਨਾਂ ਵਿੱਚ ਹੀ ਪਿਛਲੇ ਵਰਜਨ 'ਤੇ ਬਦਲੋ}}</translation>
+<translation id="4633636853437260449">ਮਿਟਾਉਣ ਲਈ Ctrl+W ਦਬਾਓ</translation>
 <translation id="4642092649622328492">ਛੋਟਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਵੋ</translation>
 <translation id="4644727592819780893">ਕੈਮਰਾ ਪੂਰਵ-ਝਲਕ ਵਿੱਚ ਫਿੱਟ ਆਉਣ ਲਈ ਇਲਾਕਾ ਬਹੁਤ ਛੋਟਾ ਹੈ</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, ਐਪ ਸਿਫ਼ਾਰਸ਼</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 8982a3e..ffd7a31a6 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kabel może wpływać na wydajność</translation>
 <translation id="2903844815300039659">Połączono z siecią <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Zrzuty ekranu</translation>
+<translation id="2925246975070834767">Włącz funkcję automatycznego powiększenia, aby na obrazie z kamery znaleźć się pośrodku ekranu. Znajdziesz ją w Szybkich ustawieniach.</translation>
 <translation id="2941112035454246133">Niski</translation>
 <translation id="2942350706960889382">Lupa zadokowana</translation>
 <translation id="2942516765047364088">Pozycja półki</translation>
@@ -634,6 +635,7 @@
 <translation id="4628757576491864469">Urządzenia</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, liczba gwiazdek <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Przywróć na tym urządzeniu wcześniejszą wersję systemu operacyjnego w ciągu 1 dnia}few{Przywróć na tym urządzeniu wcześniejszą wersję systemu operacyjnego w ciągu # dni}many{Przywróć na tym urządzeniu wcześniejszą wersję systemu operacyjnego w ciągu # dni}other{Przywróć na tym urządzeniu wcześniejszą wersję systemu operacyjnego w ciągu # dnia}}</translation>
+<translation id="4633636853437260449">Aby usunąć, naciśnij Ctrl+W</translation>
 <translation id="4642092649622328492">Zrób zrzut części ekranu</translation>
 <translation id="4644727592819780893">Region jest za mały i nie można go pokazać na podglądzie z aparatu</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, rekomendowana aplikacja</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index cb105e2..2d40865a 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Kebo inaweza kuathiri utendaji wa kifaa</translation>
 <translation id="2903844815300039659">Imeunganishwa kwenye <ph name="NAME" />, <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Picha za skrini</translation>
+<translation id="2925246975070834767">Jaribu kukuza kiotomatiki ili uangalie maudhui katikati ya skrini. Washa kipengele cha kukuza kiotomatiki kwenye Mipangilio ya Haraka.</translation>
 <translation id="2941112035454246133">Chini</translation>
 <translation id="2942350706960889382">Kikuzaji Kilichoambatishwa</translation>
 <translation id="2942516765047364088">Nafasi ya rafu</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Vilivyounganishwa awali</translation>
 <translation id="371370241367527062">Maikrofoni ya mbele</translation>
 <translation id="3713734891607377840">Ifungue ikimaliza kupakuliwa</translation>
+<translation id="3724279623330129812">Kipengele cha kukuza kiotomatiki kimeweka kamera katikati</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> na zingine <ph name="UNAVAILABLE_APPS_COUNT" /> hazipo kwenye kifaa hiki.</translation>
 <translation id="3735740477244556633">Panga kwa</translation>
 <translation id="3742055079367172538">Picha ya skrini imepigwa</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">Vifaa</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Ukadiriaji wa nyota <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Badilisha utumie toleo la awali kwenye kifaa ndani ya siku moja}other{Badilisha utumie toleo la awali kwenye kifaa ndani ya siku #}}</translation>
+<translation id="4633636853437260449">Bonyeza Ctrl+W ili ufute</translation>
 <translation id="4642092649622328492">Piga picha ya sehemu ya skrini</translation>
 <translation id="4644727592819780893">Eneo ni dogo sana kuweka onyesho la kamera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Pendekezo la programu</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 0fbebb2..11e5f5c 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">செயல்திறனை, கேபிள் பாதிக்கக்கூடும்</translation>
 <translation id="2903844815300039659"><ph name="NAME" /> உடன் இணைக்கப்பட்டுள்ளீர்கள், <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">ஸ்கிரீன்ஷாட்டுகள்</translation>
+<translation id="2925246975070834767">'தானியங்கு அளவு மாற்றம்' அம்சத்தைப் பயன்படுத்துவதன் மூலம் திரையின் நடுவில் தெரிவீர்கள். விரைவு அமைப்புகளுக்குச் சென்று இதை இயக்கலாம்.</translation>
 <translation id="2941112035454246133">குறைவு</translation>
 <translation id="2942350706960889382">டாக் செய்யப்பட்ட பெரிதாக்கி</translation>
 <translation id="2942516765047364088">அடுக்கின் நிலை</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">சாதனங்கள்</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, நட்சத்திர மதிப்பீடு: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{சாதனத்தை ஒரு நாளுக்குள் முந்தைய பதிப்பிற்கு மாற்றுங்கள்}other{சாதனத்தை # நாட்களுக்குள் முந்தைய பதிப்பிற்கு மாற்றுங்கள்}}</translation>
+<translation id="4633636853437260449">நீக்க Ctrl+W அழுத்தவும்</translation>
 <translation id="4642092649622328492">பகுதியளவு ஸ்கிரீன்ஷாட்டை எடுக்கும்</translation>
 <translation id="4644727592819780893">கேமராவில் பொருந்த முடியாத அளவுக்கு மிகவும் சிறிய பகுதி</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, ஆப்ஸ் பரிந்துரை</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index eeff3af..23073e4 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -469,6 +469,7 @@
 <translation id="3708186454126126312">ఇంతకు మునుపు కనెక్ట్ చేయబడినవి</translation>
 <translation id="371370241367527062">ముందువైపు మైక్రోఫోన్</translation>
 <translation id="3713734891607377840">పూర్తయినప్పుడు తెరవండి</translation>
+<translation id="3724279623330129812">ఆటోమేటిక్ జూమ్ కెమెరాను మధ్య భాగంలో ఉంచింది</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, మరో<ph name="UNAVAILABLE_APPS_COUNT" /> యాప్‌లు ఈ పరికరంలో అందుబాటులో లేవు.</translation>
 <translation id="3735740477244556633">దీని ద్వారా క్రమీకరించు</translation>
 <translation id="3742055079367172538">స్క్రీన్‌షాట్ తీసినప్పుడు</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index a364a6fb..0ff1db8 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -100,6 +100,7 @@
 <translation id="1455242230282523554">แสดงการตั้งค่าภาษา</translation>
 <translation id="1460620680449458626">ระดับเสียงปิดเสียงอยู่</translation>
 <translation id="1467432559032391204">ซ้าย</translation>
+<translation id="146902737843070955">ผู้ดูแลระบบขอให้ทำการเปลี่ยนแปลงนี้</translation>
 <translation id="147310119694673958">แบตเตอรี่โทรศัพท์ <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="1479909375538722835">เมนูการช่วยเหลือพิเศษแบบลอย</translation>
 <translation id="1480845547124508962"><ph name="CURRENT_TIME" /> กดปุ่ม Enter เพื่อเปิดมุมมองปฏิทิน</translation>
@@ -837,6 +838,7 @@
 <translation id="5779721926447984944">ไฟล์ที่ปักหมุดไว้</translation>
 <translation id="5788127256798019331">ไฟล์ Play</translation>
 <translation id="5790085346892983794">สำเร็จ</translation>
+<translation id="5804651031882187592">ปิดการตั้งค่า "ล็อกซิม"</translation>
 <translation id="5805809050170488595">คลิกเพื่อเปิดใช้ <ph name="NETWORK_NAME" /></translation>
 <translation id="5825969630400862129">การตั้งค่าอุปกรณ์ที่เชื่อมต่อ</translation>
 <translation id="5837036133683224804">หยุด <ph name="ROUTE_TITLE" /> ใน<ph name="RECEIVER_NAME" /></translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 21efe888..2cb9faa 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -470,6 +470,7 @@
 <translation id="3708186454126126312">Daha önce bağlanılmış cihazlar</translation>
 <translation id="371370241367527062">Ön mikrofon</translation>
 <translation id="3713734891607377840">Tamamlandığında aç</translation>
+<translation id="3724279623330129812">Otomatik yakınlaştırma, kamerayı ortaladı</translation>
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ve <ph name="UNAVAILABLE_APPS_COUNT" /> uygulama daha bu cihazda yok.</translation>
 <translation id="3735740477244556633">Sıralama ölçütü</translation>
 <translation id="3742055079367172538">Ekran görüntüsü alındı</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index d82af97..29e341b 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">Через кабель може знизитися продуктивність</translation>
 <translation id="2903844815300039659">Під’єдано до мережі "<ph name="NAME" />", <ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">Знімки екрана</translation>
+<translation id="2925246975070834767">Щоб ваше обличчя було в центрі екрана, спробуйте автомасштабування. Увімкніть цю функцію в меню "Швидкі налаштування".</translation>
 <translation id="2941112035454246133">Низький</translation>
 <translation id="2942350706960889382">Закріплена лупа</translation>
 <translation id="2942516765047364088">Розташування полиці</translation>
@@ -469,6 +470,7 @@
 <translation id="3708186454126126312">Підключені раніше</translation>
 <translation id="371370241367527062">Мікрофон на передній панелі</translation>
 <translation id="3713734891607377840">Відкриється після завершення</translation>
+<translation id="3724279623330129812">Автомасштабування по центру кадру камери</translation>
 <translation id="3726171378575546917">На цьому пристрої не встановлено додатки <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> і ще <ph name="UNAVAILABLE_APPS_COUNT" />.</translation>
 <translation id="3735740477244556633">Параметри сортування</translation>
 <translation id="3742055079367172538">Знімок екрана зроблено</translation>
@@ -633,6 +635,7 @@
 <translation id="4628757576491864469">Пристрої</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, оцінка – <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Поверніться до попередньої версії на пристрої протягом дня}one{Поверніться до попередньої версії на пристрої протягом # дня}few{Поверніться до попередньої версії на пристрої протягом # днів}many{Поверніться до попередньої версії на пристрої протягом # днів}other{Поверніться до попередньої версії на пристрої протягом # дня}}</translation>
+<translation id="4633636853437260449">Щоб видалити, натисніть Ctrl + W</translation>
 <translation id="4642092649622328492">Зробити частковий знімок екрана</translation>
 <translation id="4644727592819780893">Область замала для попереднього перегляду зображення з камери</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, рекомендований додаток</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index 9f52197..e8c1649 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">کیبل کارکردگی پر اثرانداز ہو سکتی ہے</translation>
 <translation id="2903844815300039659"><ph name="NAME" />، <ph name="STRENGTH" /> سے منسلک ہو گیا</translation>
 <translation id="2914580577416829331">اسکرین کیپچرز</translation>
+<translation id="2925246975070834767">خودکار زوم کو آزمائیں تاکہ آپ اسکرین کے بیچ میں رہیں۔ فوری ترتیبات میں اسے آن کریں۔</translation>
 <translation id="2941112035454246133">کم</translation>
 <translation id="2942350706960889382">ڈاک کردہ میگنیفائر</translation>
 <translation id="2942516765047364088">شیلف پوزیشن</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">آلات</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />، ستارہ کی درجہ بندی <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{ایک دن کے اندر آلہ کو گزشتہ ورژن میں تبدیل کریں}other{# دن کے اندر آلہ کو گزشتہ ورژن میں تبدیل کریں}}</translation>
+<translation id="4633636853437260449">‏حذف کرنے کے لیے Ctrl+W دبائیں</translation>
 <translation id="4642092649622328492">جزوی اسکرین شاٹ لیں</translation>
 <translation id="4644727592819780893">کیمرا فٹ کرنے کے لیے علاقہ بہت چھوٹا ہے</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />، ایپ کی تجویز</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index c8fe41b..166c4199 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -327,6 +327,7 @@
 <translation id="2894949423239620203">数据线可能会影响性能</translation>
 <translation id="2903844815300039659">已连接到网络“<ph name="NAME" />”,<ph name="STRENGTH" /></translation>
 <translation id="2914580577416829331">屏幕截图</translation>
+<translation id="2925246975070834767">欢迎试用“自动缩放”功能,使自己位于屏幕中央。您可在“快捷设置”中开启此功能。</translation>
 <translation id="2941112035454246133">低</translation>
 <translation id="2942350706960889382">停靠的放大镜</translation>
 <translation id="2942516765047364088">任务栏位置</translation>
@@ -633,6 +634,7 @@
 <translation id="4628757576491864469">设备</translation>
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />,星级评分为 <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{请在 1 天内将设备回滚到上一个版本}other{请在 # 天内将设备回滚到上一个版本}}</translation>
+<translation id="4633636853437260449">按 Ctrl+W 即可删除</translation>
 <translation id="4642092649622328492">截取局部屏幕截图</translation>
 <translation id="4644727592819780893">区域太小,无法显示相机预览画面</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />,推荐的应用</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
index 9cce9db..b2231253 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Saat əqrəbi istiqamətində 90 dərəcə fırladın</translation>
 <translation id="1276998909102132017">Qalereya şəkilləri</translation>
 <translation id="1300209025925956156">Sənədinizi skanlayın</translation>
+<translation id="1309250603447638106">Sənədin skan edilməsi üçün güncəlləmələr endirilir</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Daxil olmaq üçün Axtarış + Sol ox.</translation>
 <translation id="1393338179284529051">Dördqat HD</translation>
 <translation id="1430915738399379752">Çap edin</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Önizləməni əks etdirin</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> kabeli birləşdirilib.</translation>
+<translation id="2904654629665923749">Sənəd skanı əlçatandır</translation>
 <translation id="2968794441791257519">Kamera ilə çəkilmiş foto və videolar Endirmələr qovluğuna köçürüləcək. Onlara Fayllardan daxil ola bilərsiniz. Yaddaş icazəsi olan tətbiqlər foto və videolara daxil ola biləcək.</translation>
 <translation id="3067436040345934772">Sağı görüntüləyin</translation>
 <translation id="3081586908890909590">"Video çəkin" rejiminə keçin</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
index 1296173..f9474c0 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -48,7 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Pregled preslikavanja</translation>
 <translation id="2879583609344924966">Kamera <ph name="CAMERA" /> je priključena.</translation>
-<translation id="2904654629665923749">Dostupno je skeniranje dokumenata</translation>
+<translation id="2904654629665923749">Skeniranje dokumenata je dostupno</translation>
 <translation id="2968794441791257519">Fotografije i videozapisi snimljeni kamerom premjestit će se u folder Preuzimanja. Možete im pristupiti u aplikaciji Files.
 
         Aplikacije s odobrenjem za pohranu moći će pristupiti vašim fotografijama i videozapisima.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
index 802f3ac..4871e79 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Cylchdroi 90 gradd yn glocwedd</translation>
 <translation id="1276998909102132017">Lluniau'r oriel</translation>
 <translation id="1300209025925956156">Sganio eich dogfen</translation>
+<translation id="1309250603447638106">Lawrlwytho diweddariadau ar gyfer sganio dogfennau</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Search + Saeth dde i gael mynediad.</translation>
 <translation id="1393338179284529051">HD Cwad</translation>
 <translation id="1430915738399379752">Argraffu</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Rhagolwg adlewyrchu</translation>
 <translation id="2879583609344924966">Mae <ph name="CAMERA" /> wedi'i blygio i mewn.</translation>
+<translation id="2904654629665923749">Mae sganio dogfennau ar gael</translation>
 <translation id="2968794441791257519">Bydd lluniau a fideos a dynnir gyda'r camera yn cael eu symud i'r ffolder Lawrlwythiadau. Gallwch gael mynediad atynt yn Files.
 
         Bydd apiau sydd â chaniatadau storio yn gallu cael mynediad at eich lluniau a'ch fideos.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
index 831799e..15184c2d 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Biratu 90 gradu eskuinetara</translation>
 <translation id="1276998909102132017">Galeriako irudiak</translation>
 <translation id="1300209025925956156">Eskaneatu dokumentua</translation>
+<translation id="1309250603447638106">Dokumentua eskaneatzeko eguneratzeak deskargatzen</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Atzitzeko, sakatu bilaketa-tekla + ezkerrera egiteko gezi-tekla.</translation>
 <translation id="1393338179284529051">Quad bereizmen handia</translation>
 <translation id="1430915738399379752">Inprimatu</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">Bereizmen handia</translation>
 <translation id="28682968802727151">Ispilu moduaren aurrebista</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> konektatuta dago.</translation>
+<translation id="2904654629665923749">Dokumentua eskanea daiteke</translation>
 <translation id="2968794441791257519">Deskargak karpetara eramango dira kamerarekin ateratako argazkiak eta grabatutako bideoak. Fitxategiak aplikazioan atzi ditzakezu.
 
         Memoria atzitzeko baimena duten aplikazioek atzi ditzakete argazkiak eta bideoak.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
index 172495a..cbc2271 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">چرخش ۹۰ درجه ساعت‌گرد</translation>
 <translation id="1276998909102132017">تصاویر گالری</translation>
 <translation id="1300209025925956156">اسکن سند</translation>
+<translation id="1309250603447638106">درحال بارگیری به‌روزرسانی‌های مربوط به اسکن سند</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. برای دسترسی، «جستجو + جهت‌نمای چپ» را فشار دهید.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">چاپ</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">پیش‌نمایش بازتاب</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> متصل شد.</translation>
+<translation id="2904654629665923749">اسکن سند دردسترس است</translation>
 <translation id="2968794441791257519">‏عکس‌ها و ویدیوهایی که با دوربین گرفته شده است، به پوشه «بارگیری‌ها» منتقل خواهد شد. می‌توانید در Files به آن‌ها دسترسی داشته باشید.
 
         برنامه‌هایی که مجوز فضای ذخیره‌سازی دارند، به عکس‌ها و ویدیوهایتان دسترسی خواهند داشت.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
index 14bb029..601373dac 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Kierrä 90 astetta myötäpäivään</translation>
 <translation id="1276998909102132017">Gallerian kuvat</translation>
 <translation id="1300209025925956156">Skannaa dokumenttisi</translation>
+<translation id="1309250603447638106">Ladataan dokumenttien skannauksen päivityksiä</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Käytä valitsemalla Haku + vasen nuoli.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Tulosta</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Peilin esikatselu</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> on kytketty.</translation>
+<translation id="2904654629665923749">Dokumenttien skannaus käytettävissä</translation>
 <translation id="2968794441791257519">Kameralla otetut kuvat ja videot siirretään Lataukset-kansioon. Voit käyttää niitä avaamalla Tiedostot.
 
         Jos sovelluksella on tallennustilan käyttöoikeus, se voi käyttää kuvia ja videoita.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
index b49ca412..6261bd9 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Putar 90 derajat searah jarum jam</translation>
 <translation id="1276998909102132017">Foto galeri</translation>
 <translation id="1300209025925956156">Pindai dokumen Anda</translation>
+<translation id="1309250603447638106">Mendownload update untuk pemindaian dokumen</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Penelusuran + Panah kiri untuk mengakses.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Cetak</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Pratinjau cermin</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> dicolokkan.</translation>
+<translation id="2904654629665923749">Pemindaian dokumen tersedia</translation>
 <translation id="2968794441791257519">Foto dan video yang diambil dengan kamera akan dipindahkan ke folder Download. Anda dapat mengaksesnya di File.
 
         Aplikasi yang memiliki izin penyimpanan dapat mengakses foto dan video.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
index 36ad84e..6aad613aa 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Snúa um 90 gráður réttsælis</translation>
 <translation id="1276998909102132017">Myndir úr galleríi</translation>
 <translation id="1300209025925956156">Skannaðu skjalið</translation>
+<translation id="1309250603447638106">Sækir uppfærslur fyrir skjalaskönnun</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Leit + Vinstri ör til að opna.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Prenta</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Forskoðun speglunar</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> er í sambandi.</translation>
+<translation id="2904654629665923749">Skjalaskönnun tiltæk</translation>
 <translation id="2968794441791257519">Myndir og myndskeið sem tekin eru með myndavélinni verða flutt í niðurhalsmöppuna. Þú getur fengið aðgang að þeim í „Skrár“.
 
         Forrit sem hafa heimild fyrir aðgangi að geymslu hafa aðgang að myndunum þínum og myndskeiðum.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
index cc42fe7..c94332c3 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Ruota di 90 gradi in senso orario</translation>
 <translation id="1276998909102132017">Immagini della galleria</translation>
 <translation id="1300209025925956156">Scansiona il tuo documento</translation>
+<translation id="1309250603447638106">Download degli aggiornamenti per la funzionalità di scansione dei documenti in corso…</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Tasto per la ricerca + Freccia sinistra per accedere.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Stampa</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Anteprima specchio</translation>
 <translation id="2879583609344924966">Videocamera <ph name="CAMERA" /> collegata.</translation>
+<translation id="2904654629665923749">Funzionalità di scansione dei documenti disponibile</translation>
 <translation id="2968794441791257519">Le foto e i video acquisiti con la fotocamera verranno spostati nella cartella Download e potrai accedervi dall'app File.
 
 Le app con autorizzazioni di accesso allo spazio di archiviazione potranno accedere alle foto e ai video.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
index 3ffbd9a..a82065c 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Сағат тілімен 90 градус бұру</translation>
 <translation id="1276998909102132017">Галерея суреттері</translation>
 <translation id="1300209025925956156">Құжатты сканерлеу</translation>
+<translation id="1309250603447638106">Құжатты сканерлеу функциясының жаңа нұсқалары жүктеп алынуда.</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Пайдалану үшін Search + сол жаққа бағыттауыш перне тіркесімін пайдаланыңыз.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Басып шығару</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Айна көрінісін алдын ала қарау</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> жалғанды.</translation>
+<translation id="2904654629665923749">Құжатты сканерлеуге болады.</translation>
 <translation id="2968794441791257519">Камерамен түсірілген фотосуреттер мен бейнелер "Жүктеп алынғандар" қалтасына тасымалданады. Оларға "Файлдар" қалтасынан кіре аласыз.
 
         Жадқа кіру рұқсаттары бар қолданбалар фотосуреттеріңіз бен бейнелеріңізді пайдалана алады.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
index 785a90b..253ce18 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">시계 방향으로 90도 회전</translation>
 <translation id="1276998909102132017">갤러리 이미지</translation>
 <translation id="1300209025925956156">문서 스캔</translation>
+<translation id="1309250603447638106">문서 스캔을 위한 업데이트 다운로드 중</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. 검색 + 왼쪽 화살표 키를 사용하여 액세스하세요.</translation>
 <translation id="1393338179284529051">쿼드 HD</translation>
 <translation id="1430915738399379752">인쇄</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">미러링 미리보기</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> 카메라가 연결되었습니다.</translation>
+<translation id="2904654629665923749">문서 스캔 기능 사용 가능</translation>
 <translation id="2968794441791257519">카메라로 촬영된 사진 및 동영상은 다운로드 폴더로 이동됩니다. 파일 앱에서 이러한 사진 및 동영상에 액세스할 수 있습니다.
 
         저장용량 권한이 있는 앱은 사진 및 동영상에 액세스할 수 있습니다.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
index 412586f9..1aacb79 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Сааттын жебеси боюнча 90 градуска буруу</translation>
 <translation id="1276998909102132017">Галерея сүрөттөрү</translation>
 <translation id="1300209025925956156">Документиңизди скандоо</translation>
+<translation id="1309250603447638106">Документти скандоо функциясы үчүн жаңыртуулар жүктөлүп алынууда</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Кирүү үчүн Search + солго жебени басыңыз.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Басып чыгаруу</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Чагылдырууну алдын ала көрүү</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> сайылып турат.</translation>
+<translation id="2904654629665923749">Документти скандоо функциясы жеткиликтүү</translation>
 <translation id="2968794441791257519">Бул камера менен тартылган сүрөттөр менен видеолор "Жүктөлүп алынгандар" папкасына жылдырылат. Аларды "Файлдар" папкасынан көрө аласыз.
 
        Түзмөктүн сактагычына кире алган колдонмолор сүрөттөрүңүз жана видеолоруңуз менен иштей алышат.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
index bd0aba1..cc1b6d3 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Zungusha kwa digrii 90 katika mzunguko wa saa</translation>
 <translation id="1276998909102132017">Picha za matunzio</translation>
 <translation id="1300209025925956156">Changanua hati yako</translation>
+<translation id="1309250603447638106">Kinapakua masasisho ya kuchanganua hati</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Bonyeza kitufe cha Utafutaji pamoja na kishale cha Kushoto ili uvifikie.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Chapisha</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Onyesho la kukagua hali ya kuakisi</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> imechomekwa.</translation>
+<translation id="2904654629665923749">Kipengele cha kuchanganua hati kinapatikana</translation>
 <translation id="2968794441791257519">Itahamishia picha na video ulizopigwa kwa kamera kwenye folda ya Vipakuliwa. Unaweza kuzifikia kwenye Faili.
 
         Programu zilizo na ruhusa za hifadhi zitaweza kufikia picha na video zako.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
index 252fdc4..8a3c7a5 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">90 డిగ్రీలు సవ్యదిశలో తిప్పండి</translation>
 <translation id="1276998909102132017">గ్యాలరీ చిత్రాలు</translation>
 <translation id="1300209025925956156">మీ డాక్యుమెంట్‌ను స్కాన్ చేయండి</translation>
+<translation id="1309250603447638106">డాక్యుమెంట్ స్కానింగ్ ఫీచర్ కోసం అప్‌డేట్‌లు డౌన్‌లోడ్ చేయబడుతున్నాయి</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. యాక్సెస్ చేయడానికి Search + ఎడమ వైపు బాణం గుర్తును క్లిక్ చేయండి.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">ప్రింట్</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">మిర్రర్ ప్రివ్యూ</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" /> ప్లగ్-ఇన్ చేశారు.</translation>
+<translation id="2904654629665923749">డాక్యుమెంట్ స్కాన్ అందుబాటులో ఉంది</translation>
 <translation id="2968794441791257519">కెమెరాతో తీసిన ఫోటోలు మరియు వీడియోలు డౌన్‌లోడ్‌లు ఫోల్డర్‌కు తరలించబడతాయి. మీరు వాటిని ఫైల్స్‌లో యాక్సెస్ చేయవచ్చు. 
 
 నిల్వ అనుమతులు కలిగిన యాప్‌లు మీ ఫోటోలు మరియు వీడియోలను యాక్సెస్ చేయగలుగుతాయి.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
index e949690..2dcd8450 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Saat yönünde 90 derece döndür</translation>
 <translation id="1276998909102132017">Galeri resimleri</translation>
 <translation id="1300209025925956156">Dokümanınızı tarayın</translation>
+<translation id="1309250603447638106">Doküman taramayla ilgili güncellemeler indiriliyor</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Erişmek için Arama + Sol ok tuşlarına basın.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Yazdır</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Yansıtma önizlemesi</translation>
 <translation id="2879583609344924966"><ph name="CAMERA" />, cihaza takılı.</translation>
+<translation id="2904654629665923749">Doküman tarama kullanılabilir</translation>
 <translation id="2968794441791257519">Kamerayla çekilen fotoğraflar ve videolar, İndirilenler klasörüne taşınacaktır. Bunlara Dosyalar uygulamasından erişebilirsiniz.
 
         Depolama iznine sahip uygulamalar fotoğraflarınıza ve videolarınıza erişebilecektir.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
index a662433..31d04d1a 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -7,6 +7,7 @@
 <translation id="1258009455399840361">Повернути на 90 градусів за годинниковою стрілкою</translation>
 <translation id="1276998909102132017">Зображення з галереї</translation>
 <translation id="1300209025925956156">Зіскануйте документ</translation>
+<translation id="1309250603447638106">Завантаження оновлень для сканування документів</translation>
 <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Щоб перейти, натисніть клавішу пошуку + стрілку вліво.</translation>
 <translation id="1393338179284529051">Quad HD</translation>
 <translation id="1430915738399379752">Друк</translation>
@@ -47,6 +48,7 @@
 <translation id="2816865716882637212">HD</translation>
 <translation id="28682968802727151">Попередній перегляд віддзеркаленого зображення</translation>
 <translation id="2879583609344924966">Камеру <ph name="CAMERA" /> підключено.</translation>
+<translation id="2904654629665923749">Доступне сканування документів</translation>
 <translation id="2968794441791257519">Фото й відео з камери перенесуться в папку "Завантаження", і ви зможете відкрити їх у Файлах.
 
         Також до них матимуть доступ додатки, яким дозволено використовувати пам’ять пристрою.</translation>
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index a887c91..d74c488 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -341,7 +341,7 @@
 
 // Contains information about the current user.
 struct UserInfo {
-  // The display email of the user.
+  // The display email of the user. It can be empty for guest users.
   string email;
 
   // The display name of the user.
diff --git a/ash/webui/personalization_app/resources/js/user/user_preview_element.html b/ash/webui/personalization_app/resources/js/user/user_preview_element.html
index d4fc762..8849fa9a 100644
--- a/ash/webui/personalization_app/resources/js/user/user_preview_element.html
+++ b/ash/webui/personalization_app/resources/js/user/user_preview_element.html
@@ -168,11 +168,13 @@
   <div id="infoContainer">
     <template is="dom-if" if="[[info_]]">
       <h2 id="name">[[info_.name]]</h2>
-      <a id="emailContainer" href="chrome://os-settings/accountManager" target="_blank"
-          aria-description="$i18n{ariaLabelGoToAccountSettings}">
-        <span id="email">[[info_.email]]</span>
-        <iron-icon icon="cr:open-in-new"></iron-icon>
-      </a>
+      <template is="dom-if" if="[[info_.email]]">
+        <a id="emailContainer" href="chrome://os-settings/accountManager" target="_blank"
+            aria-description="$i18n{ariaLabelGoToAccountSettings}">
+          <span id="email">[[info_.email]]</span>
+          <iron-icon icon="cr:open-in-new"></iron-icon>
+        </a>
+      </template>
     </template>
   </div>
 </div>
diff --git a/ash/webui/telemetry_extension_ui/services/BUILD.gn b/ash/webui/telemetry_extension_ui/services/BUILD.gn
index af6ce21..e650d0e 100644
--- a/ash/webui/telemetry_extension_ui/services/BUILD.gn
+++ b/ash/webui/telemetry_extension_ui/services/BUILD.gn
@@ -25,7 +25,6 @@
     "//chromeos/ash/components/dbus/debug_daemon",
     "//chromeos/ash/services/cros_healthd/public/cpp",
     "//chromeos/ash/services/cros_healthd/public/mojom",
-    "//chromeos/dbus",
   ]
 }
 
@@ -41,7 +40,6 @@
     "//chromeos/ash/components/dbus/debug_daemon",
     "//chromeos/ash/services/cros_healthd/public/cpp",
     "//chromeos/ash/services/cros_healthd/public/mojom",
-    "//chromeos/dbus",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/base/fuchsia/test.test-fidl b/base/fuchsia/test.test-fidl
index 56cea20e..fa63b16 100644
--- a/base/fuchsia/test.test-fidl
+++ b/base/fuchsia/test.test-fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library base.testfidl;
 
 @discoverable
diff --git a/buildtools/checkdeps/PRESUBMIT.py b/buildtools/checkdeps/PRESUBMIT.py
index d5bfb02d..6937199 100644
--- a/buildtools/checkdeps/PRESUBMIT.py
+++ b/buildtools/checkdeps/PRESUBMIT.py
@@ -9,12 +9,12 @@
 
 
 def CheckChange(input_api, output_api):
-  results = []
-  results.extend(input_api.canned_checks.RunUnitTests(
+  return input_api.canned_checks.RunUnitTests(
       input_api, output_api,
       [input_api.os_path.join(input_api.PresubmitLocalPath(),
-                              'checkdeps_test.py')]))
-  return results
+                              'checkdeps_test.py')],
+                              # `run_on_python3` defaults to `True`.
+                              run_on_python2=not USE_PYTHON3)
 
 
 # Mandatory entrypoint.
diff --git a/buildtools/checkdeps/checkdeps_test.py b/buildtools/checkdeps/checkdeps_test.py
index 006e3e4..9d7dae7 100755
--- a/buildtools/checkdeps/checkdeps_test.py
+++ b/buildtools/checkdeps/checkdeps_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/cc/input/input_handler.cc b/cc/input/input_handler.cc
index 1c6c93b..e6313f3 100644
--- a/cc/input/input_handler.cc
+++ b/cc/input/input_handler.cc
@@ -1084,8 +1084,7 @@
 
 void InputHandler::WillShutdown() {
   if (input_handler_client_) {
-    input_handler_client_->WillShutdown();
-    input_handler_client_ = nullptr;
+    input_handler_client_.ExtractAsDangling()->WillShutdown();
   }
 
   if (scroll_elasticity_helper_)
diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h
index 57e7e5d6..83e52afd 100644
--- a/cc/input/input_handler.h
+++ b/cc/input/input_handler.h
@@ -675,8 +675,7 @@
   // together.
   CompositorDelegateForInput& compositor_delegate_;
 
-  raw_ptr<InputHandlerClient, DanglingUntriaged> input_handler_client_ =
-      nullptr;
+  raw_ptr<InputHandlerClient> input_handler_client_ = nullptr;
 
   // An object to implement the ScrollElasticityHelper interface and
   // hold all state related to elasticity. May be nullptr if never requested.
diff --git a/chrome/VERSION b/chrome/VERSION
index 4c0e575..d1b52d3 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=106
 MINOR=0
-BUILD=5227
+BUILD=5228
 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromGsaTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromGsaTest.java
index f4ba49aa3..968aeb1 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromGsaTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromGsaTest.java
@@ -152,4 +152,47 @@
                                    .forceSettingsChangeNotificationForTesting());
         waitUntilViewMatchesCondition(withText("TriggerScript"), isDisplayed());
     }
+    /**
+     * Tests a simple trigger heuristic that checks URLs for the appearance of https://cowin.gov.in.
+     *
+     * {
+     *   "intent":"COWIN_VACCINATION",
+     *   "heuristics":[
+     *     {
+     *       "conditionSet":{
+     *         "urlMatches":".*cart.*"
+     *       }
+     *     }
+     *   ],
+     *   "enabledInCustomTabs:true,
+     * }
+     */
+    @Test
+    @MediumTest
+    // clang-format off
+    @CommandLineFlags.
+    Add({"enable-features=AutofillAssistantUrlHeuristic1<FakeStudyName",
+            "force-fieldtrials=FakeStudyName/Enabled",
+            "force-fieldtrial-params=FakeStudyName.Enabled:json_parameters/"
+              +"%7B%22intent%22%3A%22COWIN_VACCINATION%22%2C%22heuristics%22%3A%5B%7B%22"
+              +"conditionSet%22%3A%7B%22urlMatches%22%3A%22.%2Acart.%2A%22%7D%7D%5D%2C%22"
+              +"enabledInCustomTabs%22%3Atrue%2C%22enabledForSignedOutUsers%22%3Atrue%7D"})
+    // clang-format on
+    public void
+    triggerImplicitlyOnSupportedSiteNewConfig() {
+        AutofillAssistantTestServiceRequestSender testServiceRequestSender =
+                new AutofillAssistantTestServiceRequestSender();
+        testServiceRequestSender.setNextResponse(
+                /* httpStatus = */ 200, createDefaultTriggerScriptResponse("TriggerScript"));
+        testServiceRequestSender.scheduleForInjection();
+
+        mTestRule.loadUrl(getTargetWebsiteUrl(TEST_PAGE_UNSUPPORTED));
+        onView(withText("TriggerScript")).check(doesNotExist());
+
+        mTestRule.loadUrl(getTargetWebsiteUrl(TEST_PAGE_SUPPORTED));
+        // Note: allow for some extra time here to account for both the navigation and the start.
+        waitUntilViewMatchesCondition(
+                withText("TriggerScript"), isDisplayed(), 2 * DEFAULT_MAX_TIME_TO_POLL);
+
+        }
 }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
index 97be45e5..6d6e440 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -44,7 +44,7 @@
 import org.chromium.chrome.browser.suggestions.SuggestionsMetrics;
 import org.chromium.chrome.browser.ui.native_page.TouchEnabledDelegate;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
 import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger;
 import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger.StreamType;
 import org.chromium.components.browser_ui.widget.listmenu.ListMenu;
@@ -160,7 +160,7 @@
             // blocking the UI thread for several seconds if the accounts cache is not populated
             // yet.
             if (isVisible()) {
-                mSigninPromoController.setUpSyncPromoView(mProfileDataCache,
+                mSyncPromoController.setUpSyncPromoView(mProfileDataCache,
                         mCoordinator.getSigninPromoView().findViewById(
                                 R.id.signin_promo_view_container),
                         this::onDismissPromo);
@@ -638,9 +638,9 @@
      * @return Whether the SignPromo should be visible.
      */
     private boolean shouldShowSigninPromo() {
-        SigninPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
+        SyncPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
         if (!SignInPromo.shouldCreatePromo()
-                || !SigninPromoController.canShowSyncPromo(
+                || !SyncPromoController.canShowSyncPromo(
                         SigninAccessPoint.NTP_CONTENT_SUGGESTIONS)) {
             return false;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
index 09bab66..c8b236a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
@@ -33,7 +33,7 @@
 import org.chromium.chrome.browser.sync.SyncService;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
 import org.chromium.components.browser_ui.util.GlobalDiscardableReferencePool;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
index 135f05a..511b3f7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -26,8 +26,8 @@
 import org.chromium.chrome.browser.signin.services.SigninManager.SignInStateObserver;
 import org.chromium.chrome.browser.sync.SyncService;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
@@ -52,7 +52,7 @@
     private final Runnable mPromoHeaderChangeAction;
 
     private @Nullable ProfileDataCache mProfileDataCache;
-    private final @Nullable SigninPromoController mSigninPromoController;
+    private final @Nullable SyncPromoController mSyncPromoController;
     private @SyncPromoState int mPromoState = SyncPromoState.NO_PROMO;
     private final @Nullable SyncService mSyncService;
 
@@ -73,15 +73,15 @@
 
         mAccountManagerFacade = AccountManagerFacadeProvider.getInstance();
 
-        if (SigninPromoController.canShowSyncPromo(SigninAccessPoint.BOOKMARK_MANAGER)) {
+        if (SyncPromoController.canShowSyncPromo(SigninAccessPoint.BOOKMARK_MANAGER)) {
             mProfileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge(mContext);
             mProfileDataCache.addObserver(this);
-            mSigninPromoController = new SigninPromoController(
+            mSyncPromoController = new SyncPromoController(
                     SigninAccessPoint.BOOKMARK_MANAGER, SyncConsentActivityLauncherImpl.get());
             mAccountManagerFacade.addObserver(this);
         } else {
             mProfileDataCache = null;
-            mSigninPromoController = null;
+            mSyncPromoController = null;
         }
         updatePromoState();
     }
@@ -92,7 +92,7 @@
     void destroy() {
         if (mSyncService != null) mSyncService.removeSyncStateChangedListener(this);
 
-        if (mSigninPromoController != null) {
+        if (mSyncPromoController != null) {
             mAccountManagerFacade.removeObserver(this);
             mProfileDataCache.removeObserver(this);
         }
@@ -135,7 +135,7 @@
      * Sets up the sync promo view.
      */
     void setUpSyncPromoView(PersonalizedSigninPromoView view) {
-        mSigninPromoController.setUpSyncPromoView(
+        mSyncPromoController.setUpSyncPromoView(
                 mProfileDataCache, view, this::setPersonalizedSigninPromoDeclined);
     }
 
@@ -143,7 +143,7 @@
      * Detaches the previously configured {@link PersonalizedSigninPromoView}.
      */
     void detachPersonalizePromoView() {
-        if (mSigninPromoController != null) mSigninPromoController.detach();
+        if (mSyncPromoController != null) mSyncPromoController.detach();
     }
 
     /**
@@ -159,7 +159,7 @@
      */
     private boolean shouldShowBookmarkSigninPromo() {
         return mSignInManager.isSyncOptInAllowed()
-                && SigninPromoController.canShowSyncPromo(SigninAccessPoint.BOOKMARK_MANAGER);
+                && SyncPromoController.canShowSyncPromo(SigninAccessPoint.BOOKMARK_MANAGER);
     }
 
     private @SyncPromoState int calculatePromoState() {
@@ -198,14 +198,14 @@
         final @SyncPromoState int newState = calculatePromoState();
         if (newState == mPromoState) return;
 
-        // PROMO_SYNC state and it's impression counts is not tracked by SigninPromoController.
+        // PROMO_SYNC state and it's impression counts is not tracked by SyncPromoController.
         final boolean hasSyncPromoStateChangedtoShown =
                 (mPromoState == SyncPromoState.NO_PROMO
                         || mPromoState == SyncPromoState.PROMO_FOR_SYNC_TURNED_OFF_STATE)
                 && (newState == SyncPromoState.PROMO_FOR_SIGNED_OUT_STATE
                         || newState == SyncPromoState.PROMO_FOR_SIGNED_IN_STATE);
-        if (mSigninPromoController != null && hasSyncPromoStateChangedtoShown) {
-            mSigninPromoController.increasePromoShowCount();
+        if (mSyncPromoController != null && hasSyncPromoStateChangedtoShown) {
+            mSyncPromoController.increasePromoShowCount();
         }
         if (newState == SyncPromoState.PROMO_FOR_SYNC_TURNED_OFF_STATE) {
             SharedPreferencesManager.getInstance().incrementInt(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
index ce7b6fc..42ee253bf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
@@ -27,8 +27,8 @@
 import org.chromium.chrome.browser.ui.favicon.FaviconHelper;
 import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
@@ -76,7 +76,7 @@
     private boolean mIsDestroyed;
 
     private final ProfileDataCache mProfileDataCache;
-    private final SigninPromoController mSigninPromoController;
+    private final SyncPromoController mSyncPromoController;
     private final SyncService mSyncService;
 
     /**
@@ -112,7 +112,7 @@
         mSignInManager = IdentityServicesProvider.get().getSigninManager(mProfile);
 
         mProfileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge(context);
-        mSigninPromoController = new SigninPromoController(
+        mSyncPromoController = new SyncPromoController(
                 SigninAccessPoint.RECENT_TABS, SyncConsentActivityLauncherImpl.get());
         mSyncService = SyncService.get();
 
@@ -451,7 +451,7 @@
                 && (newState == SyncPromoState.PROMO_FOR_SIGNED_IN_STATE
                         || newState == SyncPromoState.PROMO_FOR_SIGNED_OUT_STATE);
         if (hasSyncPromoStateChangedtoShown) {
-            mSigninPromoController.increasePromoShowCount();
+            mSyncPromoController.increasePromoShowCount();
         }
         mPromoState = newState;
     }
@@ -460,7 +460,7 @@
      * Sets up the sync promo view.
      */
     void setUpSyncPromoView(PersonalizedSigninPromoView view) {
-        mSigninPromoController.setUpSyncPromoView(mProfileDataCache, view, null);
+        mSyncPromoController.setUpSyncPromoView(mProfileDataCache, view, null);
     }
 
     // SignInStateObserver implementation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
index c40d7d0..75c7447 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
@@ -35,7 +35,7 @@
 import org.chromium.chrome.browser.ui.favicon.FaviconHelper.DefaultFaviconHelper;
 import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback;
 import org.chromium.chrome.browser.ui.favicon.FaviconUtils;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
 import org.chromium.components.embedder_support.util.UrlUtilities;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
index 3be2ef7..388e9c90e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
@@ -17,7 +17,7 @@
 import org.chromium.chrome.browser.signin.services.SigninManager;
 import org.chromium.chrome.browser.signin.services.SigninManager.SignInStateObserver;
 import org.chromium.chrome.browser.signin.services.SigninPreferencesManager;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
@@ -48,7 +48,7 @@
 
     private final SigninObserver mSigninObserver;
     private final SigninManager mSigninManager;
-    protected final SigninPromoController mSigninPromoController;
+    protected final SyncPromoController mSyncPromoController;
     protected final ProfileDataCache mProfileDataCache;
 
     protected SignInPromo(SigninManager signinManager) {
@@ -58,7 +58,7 @@
         updateVisibility();
 
         mProfileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge(context);
-        mSigninPromoController = new SigninPromoController(
+        mSyncPromoController = new SyncPromoController(
                 SigninAccessPoint.NTP_CONTENT_SUGGESTIONS, SyncConsentActivityLauncherImpl.get());
 
         mSigninObserver = new SigninObserver();
@@ -135,7 +135,7 @@
      * Updates visibility status. Overridden by subclasses that want to track visibility changes.
      */
     protected void setVisibilityInternal(boolean visibility) {
-        if (!mIsVisible && visibility) mSigninPromoController.increasePromoShowCount();
+        if (!mIsVisible && visibility) mSyncPromoController.increasePromoShowCount();
         mIsVisible = visibility;
     }
 
@@ -147,7 +147,7 @@
     public void onDismissPromo() {
         SharedPreferencesManager.getInstance().writeBoolean(
                 ChromePreferenceKeys.SIGNIN_PROMO_NTP_PROMO_DISMISSED, true);
-        mSigninPromoController.detach();
+        mSyncPromoController.detach();
         setVisibilityInternal(false);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
index 532832ce..2db728e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
@@ -20,7 +20,7 @@
 import org.chromium.chrome.browser.signin.services.SigninManager;
 import org.chromium.chrome.browser.signin.services.SigninManager.SignInStateObserver;
 import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountsChangeObserver;
@@ -48,7 +48,7 @@
     private final AccountManagerFacade mAccountManagerFacade;
     private @State int mState;
     private Runnable mStateChangedCallback;
-    private @Nullable SigninPromoController mSigninPromoController;
+    private @Nullable SyncPromoController mSyncPromoController;
 
     /**
      * Constructor for inflating from XML.
@@ -74,7 +74,7 @@
         mAccountManagerFacade.addObserver(this);
         signinManager.addSignInStateObserver(this);
         mProfileDataCache.addObserver(this);
-        mSigninPromoController = new SigninPromoController(
+        mSyncPromoController = new SyncPromoController(
                 SigninAccessPoint.SETTINGS, SyncConsentActivityLauncherImpl.get());
 
         update();
@@ -89,7 +89,7 @@
         mAccountManagerFacade.removeObserver(this);
         signinManager.removeSignInStateObserver(this);
         mProfileDataCache.removeObserver(this);
-        mSigninPromoController = null;
+        mSyncPromoController = null;
     }
 
     /** Returns the state of the preference. Not valid until registerForUpdates is called. */
@@ -110,7 +110,7 @@
                 && (state == State.PERSONALIZED_SIGNIN_PROMO
                         || state == State.PERSONALIZED_SYNC_PROMO);
         if (hasStateChangedFromHiddenToShown) {
-            mSigninPromoController.increasePromoShowCount();
+            mSyncPromoController.increasePromoShowCount();
         }
 
         mState = state;
@@ -127,7 +127,7 @@
             return;
         }
 
-        if (SigninPromoController.canShowSyncPromo(SigninAccessPoint.SETTINGS)) {
+        if (SyncPromoController.canShowSyncPromo(SigninAccessPoint.SETTINGS)) {
             IdentityManager identityManager = IdentityServicesProvider.get().getIdentityManager(
                     Profile.getLastUsedRegularProfile());
             if (!identityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)) {
@@ -164,7 +164,7 @@
 
         PersonalizedSigninPromoView syncPromoView =
                 (PersonalizedSigninPromoView) holder.findViewById(R.id.signin_promo_view_container);
-        mSigninPromoController.setUpSyncPromoView(
+        mSyncPromoController.setUpSyncPromoView(
                 mProfileDataCache, syncPromoView, this::onPromoDismissClicked);
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
index 7f5dd33..f6fe8066e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -99,7 +99,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ActivityTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
index c94768a..0fbd383b0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
@@ -39,7 +39,7 @@
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.sync.SyncTestRule;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.BookmarkTestRule;
 import org.chromium.chrome.test.util.BookmarkTestUtil;
@@ -71,7 +71,7 @@
     @Before
     public void setUp() throws Exception {
         BookmarkPromoHeader.forcePromoStateForTests(null);
-        SigninPromoController.setPrefSigninPromoDeclinedBookmarksForTests(false);
+        SyncPromoController.setPrefSigninPromoDeclinedBookmarksForTests(false);
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             BookmarkModel bookmarkModel = new BookmarkModel(Profile.fromWebContents(
@@ -84,11 +84,11 @@
     @After
     public void tearDown() {
         SharedPreferencesManager.getInstance().removeKey(
-                SigninPromoController.getPromoShowCountPreferenceName(
+                SyncPromoController.getPromoShowCountPreferenceName(
                         SigninAccessPoint.BOOKMARK_MANAGER));
         SharedPreferencesManager.getInstance().removeKey(
                 ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT);
-        SigninPromoController.setPrefSigninPromoDeclinedBookmarksForTests(false);
+        SyncPromoController.setPrefSigninPromoDeclinedBookmarksForTests(false);
     }
 
     @Test
@@ -129,9 +129,9 @@
     @MediumTest
     public void testPromoNotExistWhenImpressionLimitReached() {
         SharedPreferencesManager.getInstance().writeInt(
-                SigninPromoController.getPromoShowCountPreferenceName(
+                SyncPromoController.getPromoShowCountPreferenceName(
                         SigninAccessPoint.BOOKMARK_MANAGER),
-                SigninPromoController.getMaxImpressionsBookmarksForTests());
+                SyncPromoController.getMaxImpressionsBookmarksForTests());
         mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity());
         onView(withId(R.id.signin_promo_view_container)).check(doesNotExist());
     }
@@ -148,7 +148,7 @@
                         ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT));
         assertEquals(0,
                 SharedPreferencesManager.getInstance().readInt(
-                        SigninPromoController.getPromoShowCountPreferenceName(
+                        SyncPromoController.getPromoShowCountPreferenceName(
                                 SigninAccessPoint.BOOKMARK_MANAGER)));
         HistogramDelta showCountHistogram =
                 new HistogramDelta("Signin.SyncPromo.Shown.Count.Bookmarks", 1);
@@ -158,7 +158,7 @@
 
         assertEquals(1,
                 SharedPreferencesManager.getInstance().readInt(
-                        SigninPromoController.getPromoShowCountPreferenceName(
+                        SyncPromoController.getPromoShowCountPreferenceName(
                                 SigninAccessPoint.BOOKMARK_MANAGER)));
         Assert.assertEquals(1,
                 SharedPreferencesManager.getInstance().readInt(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
index 941adb6..0095b80 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
@@ -44,8 +44,8 @@
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.signin.SyncConsentActivityLauncherImpl;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState;
 import org.chromium.chrome.browser.ui.signin.SyncConsentActivityLauncher;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController.SyncPromoState;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
index 76d517ed..86fceef 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
@@ -248,7 +248,7 @@
     }
 
     // TODO(crbug.com/1334912): This test should be removed, since we have a similar test in
-    // SigninPromoControllerRenderTest.
+    // SyncPromoControllerRenderTest.
     @Test
     @LargeTest
     @Feature("RenderTest")
@@ -272,7 +272,7 @@
     }
 
     // TODO(crbug.com/1334912): This test should be removed, since we have a similar test in
-    // SigninPromoControllerRenderTest.
+    // SyncPromoControllerRenderTest.
     @Test
     @LargeTest
     @Feature("RenderTest")
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 04d7cd6d..7244dcc 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
@@ -17,8 +17,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.Log;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -309,31 +309,14 @@
     }
 
     private void setPermission(final @ContentSettingValues int setting) {
+        PermissionInfo infoHttps =
+                new PermissionInfo(ContentSettingsType.GEOLOCATION, SEARCH_URL_1, null, false);
+
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            Profile profile = Profile.getLastUsedRegularProfile();
-            PermissionInfo infoHttps =
-                    new PermissionInfo(ContentSettingsType.GEOLOCATION, SEARCH_URL_1, null, false);
-            Log.i(TAG,
-                    "[crbug/1338183] Before Settting|isNativeInitialized: "
-                            + profile.isNativeInitialized());
-            Log.i(TAG,
-                    "[crbug/1338183] Before Settting|getBrowserProfileTypeFromProfile: "
-                            + Profile.getBrowserProfileTypeFromProfile(profile));
-            Log.i(TAG,
-                    "[crbug/1338183] Before Settting|getNativeBrowserContextPointer: "
-                            + profile.getNativeBrowserContextPointer());
-
-            infoHttps.setContentSetting(profile, setting);
-
-            Log.i(TAG,
-                    "[crbug/1338183] After Settting|isNativeInitialized: "
-                            + profile.isNativeInitialized());
-            Log.i(TAG,
-                    "[crbug/1338183] Before Settting|getBrowserProfileTypeFromProfile: "
-                            + Profile.getBrowserProfileTypeFromProfile(profile));
-            Log.i(TAG,
-                    "[crbug/1338183] Before Settting|getNativeBrowserContextPointer: "
-                            + profile.getNativeBrowserContextPointer());
+            infoHttps.setContentSetting(Profile.getLastUsedRegularProfile(), setting);
+        });
+        CriteriaHelper.pollUiThread(() -> {
+            return infoHttps.getContentSetting(Profile.getLastUsedRegularProfile()) == setting;
         });
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteTest.java
index 6596bcb..f4687811 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteTest.java
@@ -232,6 +232,7 @@
     @Test
     @MediumTest
     @Feature({"RenderTest"})
+    @Features.DisableFeatures(ChromeFeatureList.PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO)
     public void testAboutThisSiteSubPageRendering() {
         mockResponse(createDescription());
         openPageInfo();
@@ -242,6 +243,7 @@
 
     @Test
     @MediumTest
+    @Features.DisableFeatures(ChromeFeatureList.PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO)
     public void testAboutThisSiteSubPageSourceClicked()
             throws ExecutionException, TimeoutException {
         assertEquals(0, mHistogramTester.getHistogramTotalCount("WebsiteSettings.Action"));
@@ -272,6 +274,7 @@
 
     @Test
     @MediumTest
+    @Features.DisableFeatures(ChromeFeatureList.PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO)
     public void testAboutThisSiteSubPageSourceClickedWithoutEphemeralTabCreator()
             throws ExecutionException, TimeoutException {
         // Test the path without ephemeralTabCreator.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
index aa850b3da..ad2d2122 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
@@ -80,8 +80,8 @@
 import org.chromium.chrome.browser.sync.settings.SyncPromoPreference;
 import org.chromium.chrome.browser.sync.settings.SyncPromoPreference.State;
 import org.chromium.chrome.browser.tracing.settings.DeveloperSettings;
-import org.chromium.chrome.browser.ui.signin.SigninPromoController;
 import org.chromium.chrome.browser.ui.signin.SyncConsentActivityLauncher;
+import org.chromium.chrome.browser.ui.signin.SyncPromoController;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
@@ -167,7 +167,7 @@
             TemplateUrlServiceFactory.setInstanceForTesting(mActualTemplateUrlService);
         }
         SharedPreferencesManager.getInstance().removeKey(
-                SigninPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
+                SyncPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
         SharedPreferencesManager.getInstance().removeKey(
                 ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT);
     }
@@ -543,7 +543,7 @@
         HistogramDelta showCountHistogram =
                 new HistogramDelta("Signin.SyncPromo.Shown.Count.Settings", 1);
         int promoShowCount = SharedPreferencesManager.getInstance().readInt(
-                SigninPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
+                SyncPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
         Assert.assertEquals(0, promoShowCount);
         Assert.assertEquals(0,
                 SharedPreferencesManager.getInstance().readInt(
@@ -552,7 +552,7 @@
         onViewWaiting(allOf(withId(R.id.signin_promo_view_container), isDisplayed()));
 
         promoShowCount = SharedPreferencesManager.getInstance().readInt(
-                SigninPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
+                SyncPromoController.getPromoShowCountPreferenceName(SigninAccessPoint.SETTINGS));
         Assert.assertEquals(1, promoShowCount);
         Assert.assertEquals(1,
                 SharedPreferencesManager.getInstance().readInt(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java
index dad1f5e..1162614 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -32,7 +33,6 @@
 import android.content.res.Configuration;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.support.test.runner.lifecycle.Stage;
 import android.text.Spanned;
 import android.text.style.ClickableSpan;
 import android.view.View;
@@ -66,11 +66,9 @@
 import org.chromium.base.test.metrics.HistogramTestRule;
 import org.chromium.base.test.params.ParameterAnnotations;
 import org.chromium.base.test.params.ParameterizedRunner;
-import org.chromium.base.test.util.ApplicationTestUtils;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Matchers;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.enterprise.util.EnterpriseInfo;
@@ -891,10 +889,10 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "crbug.com/1348325")
     public void testNativePolicyAndChildStatusLoadMetricRecordedOnlyOnce() {
         launchActivityWithFragment();
-        verify(mFirstRunPageDelegateMock).recordNativePolicyAndChildStatusLoadedHistogram();
+        verify(mFirstRunPageDelegateMock, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
+                .recordNativePolicyAndChildStatusLoadedHistogram();
         verify(mFirstRunPageDelegateMock).recordNativeInitializedHistogram();
         Assert.assertEquals("Native initialization should be the slowest", 1,
                 mHistogramTestRule.getHistogramValueCount(
@@ -1130,8 +1128,9 @@
                     .add(android.R.id.content, mFragment)
                     .commit();
         });
-        ApplicationTestUtils.waitForActivityState(
-                mChromeActivityTestRule.getActivity(), Stage.RESUMED);
+        // Wait for fragment to be added to the activity.
+        CriteriaHelper.pollUiThread(() -> mFragment.isResumed());
+
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // Replace all the progress bars with dummies. Currently the progress bar cannot be
             // stopped otherwise due to some espresso issues (crbug/1115067).
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 5cfeb00..46c944e 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
@@ -7,7 +7,6 @@
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
@@ -16,6 +15,7 @@
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RequiresRestart;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
@@ -35,7 +35,6 @@
 import org.chromium.content_public.common.ContentSwitches;
 
 import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
 /** Tests for the PermissionInfoTest. */
@@ -86,35 +85,15 @@
                                 /*createIfNeeded=*/true));
     }
 
-    private void setGeolocation(
-            String origin, String embedder, @ContentSettingValues int setting, Profile profile) {
-        PermissionInfo info = new PermissionInfo(ContentSettingsType.GEOLOCATION, origin, embedder);
+    private void setSettingAndExpectValue(@ContentSettingsType int type, String origin,
+            String embedder, @ContentSettingValues int setting, Profile profile,
+            @ContentSettingValues int expectedSetting) {
+        PermissionInfo info = new PermissionInfo(type, origin, embedder);
+
         TestThreadUtils.runOnUiThreadBlocking(() -> info.setContentSetting(profile, setting));
-    }
 
-    private @ContentSettingValues int getGeolocation(
-            String origin, String embedder, Profile profile) throws ExecutionException {
-        return TestThreadUtils.runOnUiThreadBlocking(() -> {
-            PermissionInfo info =
-                    new PermissionInfo(ContentSettingsType.GEOLOCATION, origin, embedder);
-            return info.getContentSetting(profile);
-        });
-    }
-
-    private void setNotifications(
-            String origin, String embedder, @ContentSettingValues int setting, Profile profile) {
-        PermissionInfo info =
-                new PermissionInfo(ContentSettingsType.NOTIFICATIONS, origin, embedder);
-        TestThreadUtils.runOnUiThreadBlocking(() -> info.setContentSetting(profile, setting));
-    }
-
-    private @ContentSettingValues int getNotifications(
-            String origin, String embedder, Profile profile) throws ExecutionException {
-        return TestThreadUtils.runOnUiThreadBlocking(() -> {
-            PermissionInfo info =
-                    new PermissionInfo(ContentSettingsType.NOTIFICATIONS, origin, embedder);
-            return info.getContentSetting(profile);
-        });
+        CriteriaHelper.pollUiThread(
+                () -> { return info.getContentSetting(profile) == expectedSetting; });
     }
 
     private void resetNotificationsSettingsForTest() {
@@ -130,12 +109,10 @@
     public void testResetDSEGeolocation_InPrimaryOTRProfile_DefaultsToAskFromBlock()
             throws Throwable {
         Profile primaryOTRProfile = getPrimaryOTRProfile();
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.BLOCK, primaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.BLOCK, getGeolocation(DSE_ORIGIN, null, primaryOTRProfile));
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, primaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getGeolocation(DSE_ORIGIN, null, primaryOTRProfile));
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, primaryOTRProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, primaryOTRProfile, ContentSettingValues.ASK);
     }
 
     @Test
@@ -144,12 +121,10 @@
     public void testResetDSEGeolocation_InNonPrimaryOTRProfile_DefaultsToAskFromBlock()
             throws Throwable {
         Profile nonPrimaryOTRProfile = getNonPrimaryOTRProfile();
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.BLOCK, nonPrimaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.BLOCK, getGeolocation(DSE_ORIGIN, null, nonPrimaryOTRProfile));
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, nonPrimaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getGeolocation(DSE_ORIGIN, null, nonPrimaryOTRProfile));
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, nonPrimaryOTRProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, nonPrimaryOTRProfile, ContentSettingValues.ASK);
     }
 
     @Test
@@ -158,12 +133,10 @@
     @RequiresRestart
     public void testResetDSEGeolocation_RegularProfile_DefaultsToAskFromBlock() throws Throwable {
         Profile regularProfile = getRegularProfile();
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.BLOCK, regularProfile);
-        Assert.assertEquals(
-                ContentSettingValues.BLOCK, getGeolocation(DSE_ORIGIN, null, regularProfile));
-        setGeolocation(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, regularProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getGeolocation(DSE_ORIGIN, null, regularProfile));
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, regularProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.GEOLOCATION, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, regularProfile, ContentSettingValues.ASK);
     }
 
     @Test
@@ -175,12 +148,10 @@
 
         // Resetting in incognito should not have the same behavior.
         resetNotificationsSettingsForTest();
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.BLOCK, primaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.BLOCK, getNotifications(DSE_ORIGIN, null, primaryOTRProfile));
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, primaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getNotifications(DSE_ORIGIN, null, primaryOTRProfile));
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, primaryOTRProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, primaryOTRProfile, ContentSettingValues.ASK);
     }
 
     @Test
@@ -192,12 +163,10 @@
 
         // Resetting in incognito should not have the same behavior.
         resetNotificationsSettingsForTest();
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.BLOCK, nonPrimaryOTRProfile);
-        Assert.assertEquals(ContentSettingValues.BLOCK,
-                getNotifications(DSE_ORIGIN, null, nonPrimaryOTRProfile));
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, nonPrimaryOTRProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getNotifications(DSE_ORIGIN, null, nonPrimaryOTRProfile));
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, nonPrimaryOTRProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, nonPrimaryOTRProfile, ContentSettingValues.ASK);
     }
 
     @Test
@@ -207,11 +176,9 @@
     public void testResetDSENotification_RegularProfile_DefaultsToAskFromBlock() throws Throwable {
         Profile regularProfile = getRegularProfile();
         resetNotificationsSettingsForTest();
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.BLOCK, regularProfile);
-        Assert.assertEquals(
-                ContentSettingValues.BLOCK, getNotifications(DSE_ORIGIN, null, regularProfile));
-        setNotifications(DSE_ORIGIN, null, ContentSettingValues.DEFAULT, regularProfile);
-        Assert.assertEquals(
-                ContentSettingValues.ASK, getNotifications(DSE_ORIGIN, null, regularProfile));
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.BLOCK, regularProfile, ContentSettingValues.BLOCK);
+        setSettingAndExpectValue(ContentSettingsType.NOTIFICATIONS, DSE_ORIGIN, null,
+                ContentSettingValues.DEFAULT, regularProfile, ContentSettingValues.ASK);
     }
 }
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index ff3c395..f7333b1 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-106.0.5222.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-106.0.5225.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 9eb946c..f574f59b 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1441,8 +1441,8 @@
       <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_SUBTITLE" desc="A subtitle on the consent page. Consider this a tagline for the Privacy Sandbox project.* “exploring” conveys that this is a work in progress. * “new features” include settings that the user can turn on/off and also backend features that change the way Chrome works for everyone * “allow sites to deliver”: Privacy Sandbox is proposed by Google as a collaborative effort with the browser industry. We’re building and testing functionality that will live in the Chrome browser. In order to land the full promise of Privacy Sandbox, websites and advertisers need to adopt the new APIs / functionality that we’re developing. So “allow sites…” makes it clear to the user that we’re building something for the ecosystem. Typically a Google product builds something for the user, and that’s true in this case, but it’s bigger than that. * “same browsing experience using less of your info”: Another definition of the promise of Privacy Sandbox. Third-party cookies are going away. In this new world, the user will have essentially the same browsing experience but it’s more private because it doesn’t expose so much of the user’s info.">
         Chromium is exploring new features that allow sites to deliver the same browsing experience using less of your info
       </message>
-      <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2" desc="A paragraph beneath the “More control over the ads you see” subtitle.* “During the trials”: The trials happens in addition to today’s current system based on third-party cookies. In other words, even by agreeing to or remaining in a trial,, the user’s core experience doesn’t change much. This is an experiment, and we need the user to understand as much. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
-        During the trials, you can see and remove topics of interest sites use to show you ads. Chromium estimates your interests based on your recent browsing history.
+      <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2" desc="A paragraph beneath the “More control over the ads you see” subtitle. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
+        You can see and remove topics of interest sites use to show you ads. Chromium estimates your interests based on your recent browsing history.
       </message>
       <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_LEARN_MORE_LABEL" desc="Learn more link * Unfolds content within the page * The text that appears describes 2 ways in which a site can target ads: the “Topics API” and the “FLEDGE API”. You can see what those are at www.privacysanbox.com or they’re described for the user’s benefit in other text. * “ad personalization” can mean different things in different contexts. Here, we’re using it as a simple noun. In other words, it’s not the name of a control but a descriptive term used to describe the personalization of ads in the Chrome browser. This “ad personalization” shouldn’t be confused with the setting in the Google Account called “Ad personalization”.">
         Learn more about ad personalization in Chromium
diff --git a/chrome/app/chromium_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1 b/chrome/app/chromium_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
index 8064dbf..c526e5c6 100644
--- a/chrome/app/chromium_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
+++ b/chrome/app/chromium_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
@@ -1 +1 @@
-e5f971f70df72c51805eb10e6476421b9c76f5d1
\ No newline at end of file
+f0d647258304f405a14f41f3a7abb2b06ecb1fd9
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index c0f60b2..eda9012 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5804,7 +5804,7 @@
        <message name="IDS_PASSWORD_GENERATION_EDITING_SUGGESTION" desc="Notification text next to the generated password assuring the user that the password has been saved.">
         Saved password
       </message>
-      <message name="IDS_SAVE_PASSWORD" desc="The title of the save password bubble when a password can be saved.">
+      <message name="IDS_SAVE_PASSWORD" desc="The title of the save password bubble when a password can be saved." formatter_data="android_java">
         Save password?
       </message>
       <message name="IDS_SAVE_ACCOUNT" desc="The title of the save password bubble when a federated credential can be saved.">
@@ -7775,7 +7775,7 @@
         </if>
       </if>
       <if expr="is_android">
-        <message name="IDS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Mobile: Button text for the 'Save Password' infobar's 'Remember password' option">
+        <message name="IDS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Mobile: Button text for the 'Save Password' infobar's 'Remember password' option"  formatter_data="android_java">
           Save
         </message>
         <message name="IDS_PASSWORD_MANAGER_BLOCKLIST_BUTTON" desc="Mobile: Button text for the 'Save Password' infobar's 'Never remember for this site' option">
@@ -13414,8 +13414,8 @@
     <message name="IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION_ESTIMATES_INTERESTS_LINK_A11Y_NAME" desc="The accessible text read for IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION_ESTIMATES_INTERESTS_LINK. * “estimate your interests”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). ">
       estimates your interests - Chrome can estimate your interests
     </message>
-    <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1" desc="* “restrict” means to lessen. We don’t want to suggest that we’re “eliminating” cross-site tracking. * “cross-site tracking”: An example: a user visits site A and then site B. Based on how third-party cookies work today, when that user later visits site C, site C can be aware that the user visited sites A and B, and can even have some sense for what they did on those sites. * “stop ad spam and fraud”:  This feature isn’t really related to restricting cross-site tracking but we combined these features in the same sentence / section for structural reasons.">
-      We’re exploring ways to restrict cross-site tracking while enabling sites to stop ad spam and fraud.
+    <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1" desc="The description beneath the “Limited sharing between sites” subtitle. * “exploring” conveys that this is a work in progress. * “restrict” means to lessen. We don’t want to suggest that we’re “eliminating” cross-site tracking. * “tracking”: An example: a user visits site A and then site B. Based on how third-party cookies work today, when that user later visits site C, site C can be aware that the user visited sites A and B, and can even have some sense for what they did on those sites. * “stop ad spam and fraud”:  This feature isn’t really related to restricting cross-site tracking but we combined these features in the same sentence / section for structural reasons.">
+      We’re exploring ways to restrict tracking while enabling sites to stop ad spam and fraud.
     </message>
     <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_HEADER_2" desc="2 of 2 subtitles on the page.That means that the page title, the sub titles, and the button label all work well together as a mini story: 1) Help us build a more private web How? 2) Limit sharing between sites 3) More control over the ads you see 4) Yes, I’ll try it">
       More control over the ads you see
diff --git a/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1.png.sha1 b/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1.png.sha1
index 28adee9..c526e5c6 100644
--- a/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_1.png.sha1
@@ -1 +1 @@
-d1862062fb7efbe7d9a2eaafb585ba0c5fbf3c42
\ No newline at end of file
+f0d647258304f405a14f41f3a7abb2b06ecb1fd9
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 211b62b..b3393214 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1543,8 +1543,8 @@
       <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_SUBTITLE" desc="A subtitle on the consent page. Consider this a tagline for the Privacy Sandbox project. * “exploring” conveys that this is a work in progress. * “new features” include settings that the user can turn on/off and also backend features that change the way Chrome works for everyone * “allow sites to deliver”: Privacy Sandbox is proposed by Google as a collaborative effort with the browser industry. We’re building and testing functionality that will live in the Chrome browser. In order to land the full promise of Privacy Sandbox, websites and advertisers need to adopt the new APIs / functionality that we’re developing. So “allow sites…” makes it clear to the user that we’re building something for the ecosystem. Typically a Google product builds something for the user, and that’s true in this case, but it’s bigger than that. * “same browsing experience using less of your info”: Another definition of the promise of Privacy Sandbox. Third-party cookies are going away. In this new world, the user will have essentially the same browsing experience but it’s more private because it doesn’t expose so much of the user’s info.">
         Chrome is exploring new features that allow sites to deliver the same browsing experience using less of your info
       </message>
-      <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2" desc="A paragraph beneath the “More control over the ads you see” subtitle. * “During the trials”: The trials happens in addition to today’s current system based on third-party cookies. In other words, even by agreeing to or remaining in a trial,, the user’s core experience doesn’t change much. This is an experiment, and we need the user to understand as much. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
-        During the trials, you can see and remove topics of interest sites use to show you ads. Chrome estimates your interests based on your recent browsing history.
+      <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2" desc="A paragraph beneath the “More control over the ads you see” subtitle. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
+        You can see and remove topics of interest sites use to show you ads. Chrome estimates your interests based on your recent browsing history.
       </message>
       <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_LEARN_MORE_LABEL" desc="Learn more link * Unfolds content within the page * The text that appears describes 2 ways in which a site can target ads: the “Topics API” and the “FLEDGE API”. You can see what those are at www.privacysanbox.com or they’re described for the user’s benefit in other text. * “ad personalization” can mean different things in different contexts. Here, we’re using it as a simple noun. In other words, it’s not the name of a control but a descriptive term used to describe the personalization of ads in the Chrome browser. This “ad personalization” shouldn’t be confused with the setting in the Google Account called “Ad personalization”.">
         Learn more about ad personalization in Chrome
diff --git a/chrome/app/google_chrome_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
index 8064dbf..c526e5c6 100644
--- a/chrome/app/google_chrome_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
+++ b/chrome/app/google_chrome_strings_grd/IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_DESCRIPTION_2.png.sha1
@@ -1 +1 @@
-e5f971f70df72c51805eb10e6476421b9c76f5d1
\ No newline at end of file
+f0d647258304f405a14f41f3a7abb2b06ecb1fd9
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 403915a..c669aef4 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -7974,6 +7974,7 @@
 <translation id="8666759526542103597">ব্ৰাউজাৰ ভিত্তিক বিজ্ঞাপনৰ ব্যক্তিগতকৰণৰ বিষয়ে</translation>
 <translation id="8667328578593601900">বর্তমান <ph name="FULLSCREEN_ORIGIN" /> পূর্ণ স্ক্ৰীণ অৱস্থাত আছে আৰু আপোনাৰ মাউছৰ কাৰ্জৰ অক্ষম কৰিছে।</translation>
 <translation id="8667760277771450375">আমি বিজ্ঞাপনৰ স্পাম আৰু প্ৰৱঞ্চনা ৰোধ কৰিবলৈ ছাইটসমূহক সক্ষম কৰাৰ লগতে ক্ৰছ-ছাইট ট্ৰেকিং সীমিত কৰাৰ উপায় অন্বেষণ কৰি আছোঁ।</translation>
+<translation id="8668378421690365723">আপোনাৰ ডিভাইচটোৱে আৰু সঠিককৈ কাম নকৰিব পাৰে আৰু আপুনি সুৰক্ষা আৰু কাৰ্যক্ষমতা সম্পৰ্কীয় সমস্যাৰ সন্মুখীন হ’ব পাৰে।</translation>
 <translation id="8669284339312441707">উষ্ম</translation>
 <translation id="8670537393737592796">ইয়ালৈ দ্ৰুতভাৱে উভতি আহিবলৈ ইনষ্টল কৰক বুটামটোত ক্লিক কৰি <ph name="APP_NAME" /> ইনষ্টল কৰক</translation>
 <translation id="867085395664725367">ছাৰ্ভাৰত সাময়িকভাৱে কোনো আসোঁৱাহ হৈছে।</translation>
@@ -8458,6 +8459,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />শ্ৰেষ্ঠ অভিজ্ঞতা লাভ কৰিবলৈ আপোনাৰ অভ্যন্তৰীণ ডিস্কত <ph name="DEVICE_OS" /> ইনষ্টল কৰক। আপুনি লগ ইনৰ স্ক্ৰীনখনৰ পৰাও পাছত এইটো ইনষ্টল কৰিব পাৰে।<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />যদি আপুনি ইনষ্টল কৰিবলৈ সাজু নহয়, তেন্তে আপুনি এইটো ব্যৱহাৰ কৰি চাবলৈ ইয়াক ইউএছবিৰ পৰা চলাব পাৰে। এইটোৱে আপোনাৰ আগৰে পৰা থকা OS আৰু ডেটা ৰাখিব, কিন্তু আপোনাৰ ষ্ট’ৰেজ আৰু কাৰ্যক্ষমতাৰ ক্ষেত্ৰত সীমাবদ্ধতা আহিব পাৰে।<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">পিন কৰি থোৱা টেব হিচাপে খোলক</translation>
+<translation id="9123287046453017203">আপোনাৰ ডিভাইচটো আপ টু ডে’ট হৈ থকা নাই</translation>
 <translation id="9124003689441359348">ছেভ কৰি থোৱা পাছৱৰ্ডসমূহ ইয়াত দেখা যাব</translation>
 <translation id="9126149354162942022">কাৰ্ছৰৰ ৰং</translation>
 <translation id="9128317794749765148">ছেট আপ সম্পূৰ্ণ কৰিব পৰা নগ’ল</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 9e144622..622d73d 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -7975,6 +7975,7 @@
 <translation id="8666759526542103597">Всичко за персонализирането на рекламите въз основа на браузъра</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> сега е на цял екран и курсорът на мишката ви е деактивиран.</translation>
 <translation id="8667760277771450375">Проучваме начини да ограничим проследяването в различни сайтове, като същевременно даваме възможност на сайтовете да спират нежеланите реклами и измамите.</translation>
+<translation id="8668378421690365723">Възможно е устройството ви вече да не работи правилно и да има проблеми със сигурността и производителността.</translation>
 <translation id="8669284339312441707">По-топли цветове</translation>
 <translation id="8670537393737592796">За да се връщате тук бързо, инсталирайте <ph name="APP_NAME" />, като кликнете върху съответния бутон</translation>
 <translation id="867085395664725367">Възникна временна грешка в сървъра.</translation>
@@ -8458,6 +8459,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />За най-добра практическа работа инсталирайте <ph name="DEVICE_OS" /> на вътрешния си диск. Можете да направите това и по-късно от екрана за вход.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Ако нямате готовност да инсталирате операционната система, можете да я изпробвате, като я стартирате от USB. По този начин ще запазите съществуващите си операционна система и данни, но може да забележите ограничения по отношение на хранилището и производителността.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Отваряне като фиксиран раздел</translation>
+<translation id="9123287046453017203">Устройството ви не е актуално</translation>
 <translation id="9124003689441359348">Тук ще се покажат запазените пароли</translation>
 <translation id="9126149354162942022">Цвят на курсора</translation>
 <translation id="9128317794749765148">Настройването не можа да бъде завършено</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index adc49ac..b763457d 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3807,6 +3807,7 @@
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> কাস্ট করতে ব্যর্থ হয়েছে।</translation>
 <translation id="4579876313423027742">ব্রাউজার সংক্রান্ত বিজ্ঞপ্তির জন্য, <ph name="LINK_BEGIN" />Chrome ব্রাউজার সেটিংস<ph name="LINK_END" /> বিভাগে যান</translation>
 <translation id="4580596421317071374">এই ডিভাইসে পাসওয়ার্ড <ph name="GOOGLE_PASSWORD_MANAGER" />-এ সেভ করা হয়।</translation>
+<translation id="4580626299762849806">পাসওয়ার্ড ইমপোর্ট করা যাচ্ছে না। <ph name="FILENAME" /> চেক করুন এবং এটি সঠিকভাবে ফর্ম্যাট করা আছে কিনা কনফার্ম করুন।</translation>
 <translation id="4581774856936278355">Linux ফিরিয়ে আনার সময় সমস্যা হয়েছে</translation>
 <translation id="4582297591746054421">আপনার কপি করা টেক্সটের ফর্ম্যাটিং বজায় রাখার মতো ফিচারের জন্য সাইট সাধারণত ক্লিপবোর্ড পড়ে নেয়</translation>
 <translation id="4582563038311694664">সব সেটিংস রিসেট করুন</translation>
@@ -4573,6 +4574,7 @@
 <translation id="5350293332385664455">Google Assistant অ্যাপ বন্ধ করুন</translation>
 <translation id="535123479159372765">অন্য ডিভাইস থেকে টেক্সট কপি করা হয়েছে</translation>
 <translation id="5352033265844765294">Time Stamping</translation>
+<translation id="5352257124367865087">সাইট সংক্রান্ত অনুমতি ম্যানেজ করুন</translation>
 <translation id="5353252989841766347">Chrome থেকে পাসওয়ার্ড রপ্তানি করুন</translation>
 <translation id="5355099869024327351">আপনাকে বিজ্ঞপ্তি দেখানোর জন্য অ্যাসিস্ট্যান্টকে অনুমতি দিন</translation>
 <translation id="5355191726083956201">"উন্নত সুরক্ষা" ফিচার চালু করা আছে</translation>
@@ -5074,6 +5076,7 @@
 <translation id="5843706793424741864">ফারেনহাইট</translation>
 <translation id="5844574845205796324">নতুন কন্টেন্ট চেক করে দেখতে সাজেস্ট করুন</translation>
 <translation id="5846200638699387931">রিলেশন সিন্ট্যাক্সে সমস্যা হয়েছে: <ph name="ERROR_LINE" /></translation>
+<translation id="5846504156837627898">সাইট সংক্রান্ত অনুমতি ম্যানেজ করুন</translation>
 <translation id="5846807460505171493">আপডেট এবং অ্যাপ ইনস্টল করুন। চালিয়ে যাওয়ার অর্থ, আপনি সম্মতি দিচ্ছেন যে, এই ডিভাইসটি অটোমেটিক Google, আপনার পরিষেবা প্রদানকারী এবং আপনার ডিভাইসের প্রস্তুতকারকের থেকে হয়ত মোবাইল ডেটা ব্যবহার করে অ্যাপ এবং আপডেট ডাউনলোড করে ইনস্টল করতে পারে। এই অ্যাপগুলির মধ্যে কয়েকটিতে অ্যাপ-মধ্যস্থ কেনাকাটার সুবিধা থাকতে পারে।</translation>
 <translation id="5849212445710944278">আগেই যোগ করা হয়েছে</translation>
 <translation id="5851868085455377790">ইস্যুকারী</translation>
@@ -5114,6 +5117,7 @@
 <translation id="5877064549588274448">চ্যানেল পরিবর্তিত হয়েছে৷ পরিবর্তনগুলি প্রয়োগ করার জন্য আপনার ডিভাইস আবার শুরু করুন৷</translation>
 <translation id="5877584842898320529">বেছে নেওয়া প্রিন্টারটি উপলভ্য নয় অথবা সেটি সঠিকভাবে ইনস্টল করা নেই। <ph name="BR" /> আপনার প্রিন্টারটি পরীক্ষা করুন অথবা অন্য একটি প্রিন্টার বেছে নিন।</translation>
 <translation id="5878945009165002849">পরিচয় পরিষেবা প্রদানকারী থেকে সাইন-ইন প্রম্পট ব্লক করুন</translation>
+<translation id="5882449899683447569">কোনও সমস্যা হয়েছে এবং আপনার পাসওয়ার্ড ইমপোর্ট করা যায়নি</translation>
 <translation id="5882919346125742463">পরিচিত নেটওয়ার্কগুলি</translation>
 <translation id="5883356647197510494"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> অটোমেটিক ব্লক করা হয়েছে</translation>
 <translation id="5884474295213649357">এই ট্যাব একটি USB ডিভাইসের সাথে সংযুক্ত করা আছে।</translation>
@@ -5639,6 +5643,7 @@
 <translation id="6398715114293939307">Google Play Store সরান</translation>
 <translation id="6398765197997659313">পূর্ণ স্ক্রীণ বন্ধ করুন</translation>
 <translation id="6399774419735315745">গুপ্তচর</translation>
+<translation id="6400360390396538896"><ph name="ORIGIN" /> সবসময় চালু রাখা</translation>
 <translation id="6401458660421980302">এই ট্যাবটিকে অন্য ডিভাইসে পাঠাতে, সেখানে Chrome-এ সাইন-ইন করুন</translation>
 <translation id="6401597285454423070">আপনার কম্পিউটারে একটি বিশ্বস্ত প্ল্যাটফর্ম মডিউল (TPM) নিরাপত্তা ডিভাইস রয়েছে, যা ChromeOS-এ অনেকগুলি জটিল সুরক্ষা ফিচার প্রয়োগ করতে ব্যবহৃত হয়। আরও জানতে Chromebook সহায়তা কেন্দ্রে যান: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6404187344102273690">Chromebook গেমিং</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 49c7967..0d7fb56a 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -7982,6 +7982,7 @@
 <translation id="8666759526542103597">O personalizaciji oglasa zasnovanoj na pregledniku</translation>
 <translation id="8667328578593601900">Stranica <ph name="FULLSCREEN_ORIGIN" /> sada je na cijelom zaslonu i onemogućila je pokazivač miša.</translation>
 <translation id="8667760277771450375">Istražujemo načine da ograničimo unakrsno praćenje web lokacija pružajući mogućnost web lokacijama da zaustave neželjene sadržaje i prevare.</translation>
+<translation id="8668378421690365723">Vaš uređaj možda više neće funkcionirati ispravno i možete naići na probleme sa sigurnošću i performansama.</translation>
 <translation id="8669284339312441707">Toplije</translation>
 <translation id="8670537393737592796">Da se brzo vratite ovdje, instalirajte aplikaciju <ph name="APP_NAME" /> klikom na dugme za instaliranje</translation>
 <translation id="867085395664725367">Došlo je do privremene greške servera.</translation>
@@ -8467,6 +8468,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Da dobijete najbolje iskustvo, instalirajte <ph name="DEVICE_OS" /> na interni disk. Također ga možete instalirati kasnije s ekrana za prijavu.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Ako niste spremni da instalirate, možete ga pokrenuti s USB-a da isprobate. Na taj način ćete zadržati postojeći OS i podatke, ali su moguća ograničenja pohrane i performansi.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Otvori kao zakačenu karticu</translation>
+<translation id="9123287046453017203">Vaš uređaj nije ažuriran</translation>
 <translation id="9124003689441359348">Sačuvane lozinke će se prikazati ovdje</translation>
 <translation id="9126149354162942022">Boja kursora</translation>
 <translation id="9128317794749765148">Postavljanje nije dovršeno</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 2c6949f..92ad2f6 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -7960,6 +7960,7 @@
 <translation id="8666759526542103597">Sobre la personalització d'anuncis basada en el navegador</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> es visualitza a pantalla completa i ha desactivat el cursor del ratolí.</translation>
 <translation id="8667760277771450375">Estem explorant maneres de restringir el seguiment entre llocs web i de, alhora, permetre que els llocs web aturin el frau i el contingut brossa publicitari.</translation>
+<translation id="8668378421690365723">És possible que el dispositiu ja no funcioni correctament i que tinguis problemes de seguretat i de rendiment.</translation>
 <translation id="8669284339312441707">Més càlid</translation>
 <translation id="8670537393737592796">Per tornar aquí ràpidament, instal·la <ph name="APP_NAME" /> fent clic al botó d'instal·lació</translation>
 <translation id="867085395664725367">S'ha produït un error temporal del servidor.</translation>
@@ -8443,6 +8444,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Per gaudir de la millor experiència possible, instal·la <ph name="DEVICE_OS" /> al disc intern. També pots instal·lar-lo més tard des de la pantalla d'inici de sessió.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Si no estàs a punt per instal·lar-lo, pots executar-lo des de l'USB per provar-lo. Aquesta acció conservarà el teu sistema operatiu i les teves dades actuals, però és possible que vegis límits d'emmagatzematge i de rendiment.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Obre-ho com a pestanya reduïda</translation>
+<translation id="9123287046453017203">El dispositiu no està actualitzat</translation>
 <translation id="9124003689441359348">Les contrasenyes desades es mostraran aquí</translation>
 <translation id="9126149354162942022">Color del cursor</translation>
 <translation id="9128317794749765148">No s'ha pogut completar la configuració</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index da24a5e..25ddef0 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -7987,6 +7987,7 @@
 <translation id="8666759526542103597">Ynglŷn â phersonoleiddio hysbysebion ar sail Porwr</translation>
 <translation id="8667328578593601900">Mae <ph name="FULLSCREEN_ORIGIN" /> bellach yn sgrîn lawn ac wedi analluogi cyrchwr eich llygoden.</translation>
 <translation id="8667760277771450375">Rydym yn archwilio ffyrdd i gyfyngu ar olrhain traws-wefan tra'n galluogi gwefannau i stopio sothach hysbysebion a thwyll.</translation>
+<translation id="8668378421690365723">Mae'n bosib na fydd eich dyfais yn gweithio'n iawn mwyach, ac mae'n bosib y bydd yn profi problemau diogelwch a pherfformiad.</translation>
 <translation id="8669284339312441707">Cynhesach</translation>
 <translation id="8670537393737592796">I ddychwelyd yma'n gyflym, gosodwch <ph name="APP_NAME" /> drwy glicio'r botwm gosod</translation>
 <translation id="867085395664725367">Bu gwall gweinydd dros dro.</translation>
@@ -8474,6 +8475,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Am y profiad gorau, gosodwch <ph name="DEVICE_OS" /> i'ch disg mewnol. Gallwch hefyd ei osod yn nes ymlaen o'r sgrîn mewngofnodi.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Os nad ydych yn barod i'w osod, gallwch ei redeg o USB i roi cynnig arni. Bydd hyn yn cadw eich data ac OS presennol, ond mae'n bosib y byddwch yn gweld cyfyngiadau o ran storfa a pherfformiad.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Ar agor fel tab a biniwyd</translation>
+<translation id="9123287046453017203">Nid yw'ch dyfais yn gyfredol</translation>
 <translation id="9124003689441359348">Bydd cyfrineiriau sydd wedi'u cadw yn ymddangos yma</translation>
 <translation id="9126149354162942022">Lliw'r cyrchwr</translation>
 <translation id="9128317794749765148">Methu â chwblhau gosod</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 1937c42f..35c743f 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -7954,6 +7954,7 @@
 <translation id="8666759526542103597">Informationen zu browserbasierter personalisierter Werbung</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> wird nun im Vollbildmodus angezeigt und hat deinen Cursor deaktiviert.</translation>
 <translation id="8667760277771450375">Wir probieren neue Optionen aus, um websiteübergreifendes Tracking einzuschränken. Gleichzeitig geben wir Websites die Möglichkeit, Werbespam und Betrug zu bekämpfen.</translation>
+<translation id="8668378421690365723">Dein Gerät funktioniert dann möglicherweise nicht mehr richtig und es können Sicherheits- und Leistungsprobleme auftreten.</translation>
 <translation id="8669284339312441707">Wärmer</translation>
 <translation id="8670537393737592796">Installiere <ph name="APP_NAME" />, um schnell hierher zurückzukehren, indem du oben auf die Installationsschaltfläche klickst</translation>
 <translation id="867085395664725367">Ein temporärer Serverfehler ist aufgetreten.</translation>
@@ -8437,6 +8438,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Für optimale Leistung solltest du <ph name="DEVICE_OS" /> auf dem internen Laufwerk installieren. Eine Installation ist aber auch später über den Anmeldebildschirm möglich.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Zum Ausprobieren kannst du es erst einmal über den USB-Stick ausführen. So behältst du dein vorhandenes Betriebssystem und deine Daten. Speicherplatz und Leistung sind jedoch möglicherweise begrenzt.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">In angepinntem Tab öffnen</translation>
+<translation id="9123287046453017203">Dein Gerät ist nicht auf dem neuesten Stand</translation>
 <translation id="9124003689441359348">Hier werden gespeicherte Passwörter angezeigt</translation>
 <translation id="9126149354162942022">Cursorfarbe</translation>
 <translation id="9128317794749765148">Einrichtung nicht abgeschlossen</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index b1cea96..4278075 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -7961,6 +7961,7 @@
 <translation id="8666759526542103597">Acerca de la personalización de anuncios basada en el navegador</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> se muestra ahora en pantalla completa y ha inhabilitado el cursor del ratón.</translation>
 <translation id="8667760277771450375">Estamos explorando formas de restringir el seguimiento entre sitios, así como que los sitios puedan detener el spam publicitario y el fraude.</translation>
+<translation id="8668378421690365723">Es posible que tu dispositivo ya no funcione correctamente y que tenga problemas de seguridad y rendimiento.</translation>
 <translation id="8669284339312441707">Más cálido</translation>
 <translation id="8670537393737592796">Para volver aquí rápidamente, instala <ph name="APP_NAME" /> haciendo clic en el botón Instalar</translation>
 <translation id="867085395664725367">Se ha producido un error temporal en el servidor.</translation>
@@ -8444,6 +8445,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Para disfrutar de la mejor experiencia posible, instala <ph name="DEVICE_OS" /> en tu disco interno. También puedes instalarlo más adelante desde la pantalla de inicio de sesión.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Si no puedes instalarlo ahora, tienes la opción de ejecutarlo desde un USB para probarlo. De este modo, conservarás tu SO y tus datos actuales, pero es posible que encuentres limitaciones de almacenamiento y rendimiento.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Abrir como pestaña fija</translation>
+<translation id="9123287046453017203">Tu dispositivo no está actualizado</translation>
 <translation id="9124003689441359348">Las contraseñas guardadas aparecerán aquí</translation>
 <translation id="9126149354162942022">Color del cursor</translation>
 <translation id="9128317794749765148">No se ha podido completar la configuración</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 458ae70f..fed0ae17 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -7967,6 +7967,7 @@
 <translation id="8666759526542103597">Teave brauseripõhise reklaamide isikupärastamise kohta</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> on nüüd täisekraanil ja teie hiirekursor on keelatud.</translation>
 <translation id="8667760277771450375">Katsetame uusi viise, kuidas piirata saitidevahelist jälgimist, võimaldades saitidel samas blokeerida rämpsreklaamid ja pettused.</translation>
+<translation id="8668378421690365723">Teie seade ei pruugi enam korralikult töötada ning võib esineda turva- ja toimivusprobleeme.</translation>
 <translation id="8669284339312441707">Soojem</translation>
 <translation id="8670537393737592796">Kiirelt siia naasmiseks installige rakendus <ph name="APP_NAME" />, klõpsates installimisnupul</translation>
 <translation id="867085395664725367">Ilmnes serveri ajutine viga.</translation>
@@ -8450,6 +8451,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Parima kasutuskogemuse saamiseks installige <ph name="DEVICE_OS" /> oma sisemisele kettale. Saate selle hiljem installida ka sisselogimiskuval.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Kui te pole installimiseks valmis, saate rakendust proovida, käitades selle USB-seadmelt. See säilitab teie olemasoleva operatsioonisüsteemi ja andmed, kuid kehtida võivad salvestusruumi- ja jõudluspiirangud.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Ava kinnitatud vahelehel</translation>
+<translation id="9123287046453017203">Teie seade pole ajakohane</translation>
 <translation id="9124003689441359348">Salvestatud paroolid kuvatakse siin</translation>
 <translation id="9126149354162942022">Kursori värv</translation>
 <translation id="9128317794749765148">Seadistust ei õnnestunud lõpule viia</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index b25f556..3d5faa3 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -7975,6 +7975,7 @@
 <translation id="8666759526542103597">درباره «شخصی‌سازی آگهی مبتنی بر مرورگر»</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> در حال حاضر تمام صفحه است و مکان‌نمای ماوس شما را غیرفعال کرده است.</translation>
 <translation id="8667760277771450375">درحال کاوش روش‌هایی برای محدود کردن ردیابی بین‌سایتی و درعین‌حال امکان دادن به سایت‌ها برای متوقف کردن هرزآگهی و تقلب هستیم.</translation>
+<translation id="8668378421690365723">ممکن است دستگاهتان دیگر به‌درستی کار نکند و احتمال دارد با مشکلات عملکردی و امنیتی مواجه شود.</translation>
 <translation id="8669284339312441707">گرم‌تر</translation>
 <translation id="8670537393737592796">برای اینکه سریع به اینجا برگردید، روی دکمه نصب کلیک کنید و برنامه <ph name="APP_NAME" /> را نصب کنید</translation>
 <translation id="867085395664725367">خطای موقت سرور رخ داد.</translation>
@@ -8459,6 +8460,7 @@
 <translation id="9120693811286642342">‏<ph name="BEGIN_PARAGRAPH1" />برای دریافت بهترین تجربه، <ph name="DEVICE_OS" /> را در دیسک داخلی دستگاه نصب کنید. بعداً هم می‌توانید آن را از صفحه ورود به سیستم نصب کنید.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />اگر آماده نصب نیستید و می‌خواهید اول آن را امتحان کنید، می‌توانید آن را از USB اجرا کنید. با این کار، سیستم‌عامل فعلی و داده‌هایتان حفظ خواهند شد اما ممکن است با محدودیت فضای ذخیره‌سازی و عملکرد مواجه شوید.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">باز کردن به‌عنوان برگه الصاق شده</translation>
+<translation id="9123287046453017203">دستگاهتان به‌روز نیست</translation>
 <translation id="9124003689441359348">گذرواژه‌های ذخیره‌شده در اینجا ظاهر خواهند شد</translation>
 <translation id="9126149354162942022">رنگ نشانگر</translation>
 <translation id="9128317794749765148">راه‌اندازی تکمیل نشد</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index cd207f5..bcd032b 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -7965,6 +7965,7 @@
 <translation id="8666759526542103597">À propos de la personnalisation des annonces basée sur un navigateur</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> est maintenant en mode plein écran et a désactivé le curseur de votre souris.</translation>
 <translation id="8667760277771450375">Nous étudions différents moyens de limiter le suivi intersites tout en permettant aux sites de lutter contre le spam publicitaire et la fraude.</translation>
+<translation id="8668378421690365723">Votre appareil risque de ne plus fonctionner correctement et pourra rencontrer des problèmes de sécurité et de performances.</translation>
 <translation id="8669284339312441707">Plus chaud</translation>
 <translation id="8670537393737592796">Pour revenir rapidement sur cette page, installez <ph name="APP_NAME" /> en cliquant sur le bouton d'installation</translation>
 <translation id="867085395664725367">Erreur temporaire de serveur.</translation>
@@ -8449,6 +8450,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Pour une expérience optimale, installez <ph name="DEVICE_OS" /> sur votre disque interne. Vous pouvez aussi le faire plus tard depuis l'écran de connexion.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Si vous ne voulez pas l'installer maintenant, vous pouvez l'exécuter depuis une clé USB pour l'essayer. Vous conserverez ainsi votre OS et vos données, mais vous serez peut-être limité en termes de stockage et de performances.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Ouvrir dans un onglet épinglé</translation>
+<translation id="9123287046453017203">Votre appareil n'est pas à jour</translation>
 <translation id="9124003689441359348">Les mots de passe enregistrés s'afficheront ici</translation>
 <translation id="9126149354162942022">Couleur du curseur</translation>
 <translation id="9128317794749765148">Impossible de terminer la configuration</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index c81ba0ff..1c00275 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -7977,6 +7977,7 @@
 <translation id="8666759526542103597">Tentang Personalisasi iklan berbasis browser</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> sekarang dalam mode layar penuh dan telah menonaktifkan kursor mouse Anda.</translation>
 <translation id="8667760277771450375">Kami sedang mengembangkan cara untuk membatasi pelacakan lintas situs sekaligus memungkinkan situs menghentikan penipuan dan spam iklan.</translation>
+<translation id="8668378421690365723">Perangkat Anda mungkin tidak lagi berfungsi dengan baik serta mungkin mengalami masalah keamanan dan performa.</translation>
 <translation id="8669284339312441707">Hangat</translation>
 <translation id="8670537393737592796">Agar dapat kembali ke sini dengan cepat, instal <ph name="APP_NAME" /> dengan mengklik tombol instal</translation>
 <translation id="867085395664725367">Terjadi error server sementara.</translation>
@@ -8460,6 +8461,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Untuk mendapatkan pengalaman terbaik, instal <ph name="DEVICE_OS" /> ke disk internal Anda. Anda juga dapat menginstalnya nanti dari layar login.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Jika belum siap menginstal, Anda dapat menjalankannya dari USB untuk mencobanya. Tindakan ini akan menyimpan OS dan data yang ada, tetapi Anda dapat melihat batas penyimpanan dan performa.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Buka sebagai tab terpasang</translation>
+<translation id="9123287046453017203">Perangkat Anda belum diupdate</translation>
 <translation id="9124003689441359348">Sandi yang disimpan akan muncul di sini</translation>
 <translation id="9126149354162942022">Warna kursor</translation>
 <translation id="9128317794749765148">Tidak dapat menyelesaikan penyiapan</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 02b66455..4bf2502 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -7958,6 +7958,7 @@
 <translation id="8666759526542103597">Informazioni sull'impostazione Personalizzazione degli annunci basata sul browser</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ora è a schermo intero e ha disattivato il puntatore del mouse.</translation>
 <translation id="8667760277771450375">Stiamo esaminando dei metodi per limitare il tracciamento tra siti e consentire ai siti di contrastare spam negli annunci e attività fraudolente.</translation>
+<translation id="8668378421690365723">Il tuo dispositivo potrebbe non funzionare più correttamente e potresti riscontrare problemi di prestazioni e sicurezza.</translation>
 <translation id="8669284339312441707">Più calda</translation>
 <translation id="8670537393737592796">Per tornare qui rapidamente, installa <ph name="APP_NAME" /> facendo clic sul pulsante per l'installazione</translation>
 <translation id="867085395664725367">Si è verificato un errore temporaneo del server.</translation>
@@ -8441,6 +8442,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Per un'esperienza ottimale, installa <ph name="DEVICE_OS" /> sul disco interno. Puoi anche installarlo in un secondo momento dalla schermata di accesso.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Se non vuoi installarlo ora, puoi eseguirlo da un'unità USB per provarlo. In questo modo manterrai il tuo attuale sistema operativo e i tuoi dati, ma potresti riscontrare limiti relativi allo spazio di archiviazione e alle prestazioni.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Apri in una scheda bloccata</translation>
+<translation id="9123287046453017203">Il dispositivo non è aggiornato</translation>
 <translation id="9124003689441359348">Le password salvate verranno visualizzate qui</translation>
 <translation id="9126149354162942022">Colore cursore</translation>
 <translation id="9128317794749765148">Impossibile completare la configurazione</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 35796ca..dacf5f7 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -3790,6 +3790,7 @@
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> ვერ ტრანსლირდება.</translation>
 <translation id="4579876313423027742">ბრაუზერიდან მიღებული შეტყობინებებისთვის გადადით <ph name="LINK_BEGIN" />Chrome ბრაუზერის პარამეტრებზე<ph name="LINK_END" /></translation>
 <translation id="4580596421317071374">პაროლები ინახება სექციაში „<ph name="GOOGLE_PASSWORD_MANAGER" />“ ამ მოწყობილობაზე.</translation>
+<translation id="4580626299762849806">პაროლების იმპორტირება ვერ მოხერხდა. შეამოწმეთ <ph name="FILENAME" /> და დარწმუნდით, რომ ის სწორად არის ფორმატირებული.</translation>
 <translation id="4581774856936278355">შეცდომა Linux-ის აღდგენისას</translation>
 <translation id="4582297591746054421">როგორც წესი, საიტებს თქვენი გაცვლის ბუფერის წაკითხვა სჭირდება ისეთი ფუნქციების უზრუნველსაყოფად, როგორიცაა, მაგალითად, დაკოპირებული ტექსტის ფორმატირების შენარჩუნება</translation>
 <translation id="4582563038311694664">ყველა პარამეტრის აღდგენა</translation>
@@ -4555,6 +4556,7 @@
 <translation id="5350293332385664455">Google ასისტენტის გამორთვა</translation>
 <translation id="535123479159372765">სხვა მოწყობილობიდან დაკოპირდა ტექსტი</translation>
 <translation id="5352033265844765294">დროის აღბეჭდვა</translation>
+<translation id="5352257124367865087">საიტების ნებართვების მართვა</translation>
 <translation id="5353252989841766347">პაროლების ექსპორტი Chrome-იდან</translation>
 <translation id="5355099869024327351">ასისტენტისთვის შეტყობინებების ჩვენების დაშვება</translation>
 <translation id="5355191726083956201">გაძლიერებული დაცვა ჩართულია</translation>
@@ -5055,6 +5057,7 @@
 <translation id="5843706793424741864">ფარენჰაიტი</translation>
 <translation id="5844574845205796324">გასაცნობი ახალი კონტენტის შემოთავაზება</translation>
 <translation id="5846200638699387931">კავშირის სინტაქსის შეცდომა: <ph name="ERROR_LINE" /></translation>
+<translation id="5846504156837627898">საიტების ნებართვების მართვა</translation>
 <translation id="5846807460505171493">განახლებებისა და აპების ინსტალაცია. გაგრძელებით თანახმა ხართ, ამ მოწყობილობამ ავტომატურად ჩამოტვირთოს და დააინსტალიროს Google-ის, თქვენი ოპერატორის და მოწყობილობის მწარმოებლის განახლებები/აპები (მათ შორის, მობილური ინტერნეტის მეშვეობით). ზოგიერთი ზემოაღნიშნული აპი შეიძლება გთავაზობდეთ კონტენტის აპიდან შეძენის შესაძლებლობას.</translation>
 <translation id="5849212445710944278">უკვე დამატებულია</translation>
 <translation id="5851868085455377790">გამცემი</translation>
@@ -5095,6 +5098,7 @@
 <translation id="5877064549588274448">არხი შეიცვალა. გადატვირთეთ მოწყობილობა ცვლილებების გამოსაყენებლად.</translation>
 <translation id="5877584842898320529">არჩეული პრინტერი მიუწვდომელია ან სწორად არ არის დაინსტალირებული. <ph name="BR" /> შეამოწმეთ პრინტერი ან ცადეთ სხვა პრინტერის არჩევა.</translation>
 <translation id="5878945009165002849">სისტემაში შესვლის მოთხოვნების დაბლოკვა პირადობის მონაცემების სერვისებიდან</translation>
+<translation id="5882449899683447569">თქვენი პაროლების იმპორტირება ვერ მოხერხდა შეფერხების გამო</translation>
 <translation id="5882919346125742463">ცნობილი ქსელები</translation>
 <translation id="5883356647197510494">ავტომატურად დაბლოკილია <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">ეს ჩანართი USB მოწყობილობასთან არის დაკავშირებული.</translation>
@@ -5619,6 +5623,7 @@
 <translation id="6398715114293939307">Google Play Store-ის ამოშლა</translation>
 <translation id="6398765197997659313">სრულეკრანიანი რეჟიმიდან გამოსვლა</translation>
 <translation id="6399774419735315745">ჯაშუში</translation>
+<translation id="6400360390396538896">ყოველთვის <ph name="ORIGIN" />-ზე</translation>
 <translation id="6401458660421980302">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით იქიდან Chrome-ში</translation>
 <translation id="6401597285454423070">თქვენი კომპიუტერი შეიცავს სანდო პლატფორმის მოდულის (TPM) უსაფრთხოების მოწყობილობას, რომელიც ChromeOS-ში უსაფრთხოებასთან დაკავშირებული მრავალი კრიტიკული ფუნქციის შესასრულებლად გამოიყენება. დამატებითი ინფორმაციისთვის ეწვიეთ Chromebook-ის დახმარების ცენტრს: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6404187344102273690">თამაში Chromebook-ებზე</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 59bee2e..95103f7a 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -7977,6 +7977,7 @@
 <translation id="8666759526542103597">브라우저 기반 광고 개인 최적화 알아보기</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" />이(가) 현재 전체화면으로 전환되었으며 마우스 커서가 사용 중지되었습니다.</translation>
 <translation id="8667760277771450375">Chrome은 크로스 사이트 추적을 제한하면서도 사이트에서 광고 스팸과 사기를 근절할 수 있도록 도움을 줄 수 있는 방안을 모색하고 있습니다.</translation>
+<translation id="8668378421690365723">기기가 더 이상 정상 작동하지 않을 수 있으며 보안 및 성능 문제가 발생할 수 있습니다.</translation>
 <translation id="8669284339312441707">따뜻함</translation>
 <translation id="8670537393737592796">이곳으로 빠르게 이동하려면 설치 버튼을 클릭하여 <ph name="APP_NAME" /> 앱을 설치하세요.</translation>
 <translation id="867085395664725367">일시적인 서버 오류가 발생했습니다.</translation>
@@ -8460,6 +8461,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />최적의 환경에서 이용하려면 <ph name="DEVICE_OS" />을 내부 디스크에 설치하세요. 나중에 로그인 화면에서 설치할 수도 있습니다.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />아직 설치할 준비가 되지 않았다면 USB에서 실행하여 사용해 볼 수도 있습니다. 기존 OS와 데이터는 그대로 유지되지만 저장용량과 성능이 제한될 수 있습니다<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">고정 탭으로 열기</translation>
+<translation id="9123287046453017203">기기가 최신 상태가 아님</translation>
 <translation id="9124003689441359348">저장한 비밀번호가 여기에 표시됩니다.</translation>
 <translation id="9126149354162942022">커서 색상</translation>
 <translation id="9128317794749765148">설정을 완료할 수 없음</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index f57f631a..8978b04f 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -7976,6 +7976,7 @@
 <translation id="8666759526542103597">Серепчиге негизделген жарнаманы жекелештирүү жөнүндө</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> азыр толук экранда жана чычкан курсоруңузду өчүрүп койду.</translation>
 <translation id="8667760277771450375">Сайттарга жарнама спамын жана шылуундукту токтотуу мүмкүнчүлүгүн берүү менен башка сайттарга көз салууну чектөө жолдорун изилдеп жатабыз.</translation>
+<translation id="8668378421690365723">Түзмөгүңүз туура иштебей, коопсуздук жана майнаптуулук көйгөйлөрү чыгышы мүмкүн.</translation>
 <translation id="8669284339312441707">Жылуураак</translation>
 <translation id="8670537393737592796">Бул жерге тезирээк кайтуу үчүн <ph name="APP_NAME" /> колдонмосун орнотуңуз</translation>
 <translation id="867085395664725367">Серверде убактылуу ката кетти.</translation>
@@ -8459,6 +8460,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Майнаптуу иштеши үчүн <ph name="DEVICE_OS" /> түзмөгүн ички дискиңизге орнотуп алыңыз. Аны кийинчерээк кирүү экранынан да орното аласыз.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Орнотууга даяр эмес болсоңуз, аны байкап көрүү үчүн USB түзмөгүнөн иштете аласыз. Учурдагы OS тутумуңуз жана дайын-даректериңиз өчпөйт, бирок сактагыч жана иштин майнаптуулугу чектелиши мүмкүн.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Кадалган өтмөк катары ачуу</translation>
+<translation id="9123287046453017203">Түзмөгүңүз жаңыртылган эмес</translation>
 <translation id="9124003689441359348">Сакталган сырсөздөр бул жерде көрүнөт</translation>
 <translation id="9126149354162942022">Курсордун түсү</translation>
 <translation id="9128317794749765148">Жөндөө аягына чыккан жок</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 19b8388..db55211 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -4566,6 +4566,7 @@
 <translation id="5350293332385664455">Google Туслахыг унтраах</translation>
 <translation id="535123479159372765">Өөр төхөөрөмжөөс хуулсан текст</translation>
 <translation id="5352033265844765294">Цагаар тамгалах</translation>
+<translation id="5352257124367865087">Сайтын зөвшөөрлүүдийг удирдах</translation>
 <translation id="5353252989841766347">Нууц үгийг Chrome-с экспортлох</translation>
 <translation id="5355099869024327351">Туслахад танд мэдэгдэл харуулахыг зөвшөөрөх</translation>
 <translation id="5355191726083956201">Сайжруулсан хамгаалалт асаалттай байна</translation>
@@ -5067,6 +5068,7 @@
 <translation id="5843706793424741864">Фаренгейт</translation>
 <translation id="5844574845205796324">Судлах шинэ контент санал болгох</translation>
 <translation id="5846200638699387931">Холбоосын дүрмийн алдаа: <ph name="ERROR_LINE" /></translation>
+<translation id="5846504156837627898">Сайтын зөвшөөрлүүдийг удирдах</translation>
 <translation id="5846807460505171493">Шинэчлэлт болон аппыг суулгана уу. Үргэлжлүүлснээр та энэ төхөөрөмж нь мөн мобайл дата ашиглан Google, таны оператор компани, таны төхөөрөмжийн үйлдвэрлэгчээс шинэчлэлт болон аппыг автоматаар татаж суулгаж болохыг зөвшөөрч байна. Эдгээр аппын зарим нь апликейшний худалдан авалтыг санал болгож болзошгүй.</translation>
 <translation id="5849212445710944278">Аль хэдийн нэмсэн</translation>
 <translation id="5851868085455377790">Сертификатыг олгосон</translation>
@@ -5630,6 +5632,7 @@
 <translation id="6398715114293939307">Google Play дэлгүүрийг устгах</translation>
 <translation id="6398765197997659313">Дэлгэц дүүрэн харах горимоос гарах</translation>
 <translation id="6399774419735315745">Тагнуулч</translation>
+<translation id="6400360390396538896">Үргэлж <ph name="ORIGIN" /> дээр</translation>
 <translation id="6401458660421980302">Энэ табыг өөр төхөөрөмж рүү илгээхийн тулд тэндээс Chrome-д нэвтэрнэ үү</translation>
 <translation id="6401597285454423070">Таны компьютер ChromeOS-т аюулгүй байдлын чухал онцлогуудыг хэрэгжүүлэхэд ашигладаг Итгэмжлэгдсэн платформын модуль (TPM)-ийн аюулгүй байдлын төхөөрөмж агуулж байна. Нэмэлт мэдээлэл авах бол Chromebook-н Тусламжийн төвд зочилно уу: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6404187344102273690">Chromebook-н тоглоом</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 19099e7c..271babd4 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -7973,6 +7973,7 @@
 <translation id="8666759526542103597">ब्राउझरवर आधारित जाहिरात पर्सनलायझेशनविषयी</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> आता फुल स्क्रीन असून तुमचा माउस कर्सर बंद केला आहे.</translation>
 <translation id="8667760277771450375">जाहिरात स्पॅम आणि घोटाळा थांबवण्यासाठी साइट सुरू करताना आम्ही क्रॉस-साइट ट्रॅकिंग प्रतिबंधित करण्याचे मार्ग एक्सप्लोर करत आहोत.</translation>
+<translation id="8668378421690365723">तुमचे डिव्हाइस यापुढे कदाचित योग्यरीत्या काम करणार नाही आणि सुरक्षा व परफॉर्मन्सशी संबंधित समस्या येऊ शकतात.</translation>
 <translation id="8669284339312441707">गरम</translation>
 <translation id="8670537393737592796">येथे झटपट परत येण्यासाठी, इंस्टॉल करा बटण क्लिक करून <ph name="APP_NAME" /> इंस्टॉल करा</translation>
 <translation id="867085395664725367">तात्पुरती सर्व्हर एरर आली.</translation>
@@ -8457,6 +8458,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />सर्वोत्तम अनुभवासाठी, <ph name="DEVICE_OS" /> हे तुमच्या अंतर्गत डिस्कवर इंस्टॉल करा. तुम्ही नंतर लॉग इन स्क्रीनवरूनदेखील इंस्टॉल करू शकता.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />तुम्ही इंस्टॉल करण्यासाठी तयार नसल्यास, तुम्ही ते वापरून पाहण्याकरिता USB वरून रन करू शकता. हे तुमचे आधीपासून असलेले OS आणि डेटा ठेवेल, पण तुम्हाला कदाचित स्टोरेज आणि परफॉर्मन्स मर्यादा दिसतील.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">पिन केलेला टॅब म्हणून उघडा</translation>
+<translation id="9123287046453017203">तुमचे डिव्हाइस अप टू डेट नाही</translation>
 <translation id="9124003689441359348">सेव्ह केलेले पासवर्ड येथे दिसून येतील</translation>
 <translation id="9126149354162942022">कर्सर रंग</translation>
 <translation id="9128317794749765148">सेट करणे पूर्ण करू शकलो नाही</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index ef20e4d..9d078d590 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1884,6 +1884,7 @@
 <translation id="2727633948226935816">Jangan ingatkan saya lagi</translation>
 <translation id="2727712005121231835">Saiz Sebenar</translation>
 <translation id="2729314457178420145">Kosongkan data semakan imbas (<ph name="URL" />) juga, yang mungkin melog anda keluar daripada Google.com. <ph name="LEARN_MORE" /></translation>
+<translation id="2729327310379176711">Chrome sedang mencari cara baharu untuk mengurangkan penjejakan dan memastikan anda lebih selamat semasa anda menyemak imbas. Chrome juga <ph name="ESTIMATE_INTERESTS_LINK" /> dan membenarkan anda mengurusnya. Kemudian, laman yang anda lawati boleh menanyakan Chrome tentang minat anda untuk memaparkan iklan kepada anda.</translation>
 <translation id="2730029791981212295">Menyandarkan apl dan fail Linux</translation>
 <translation id="2730901670247399077">Cadangan emoji</translation>
 <translation id="273093730430620027">Halaman ini mengakses kamera anda.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 6c56d47..51dee32c 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1882,6 +1882,7 @@
 <translation id="2727633948226935816">ထပ်ပြီးသတိမပေးပါနှင့်</translation>
 <translation id="2727712005121231835">မူရင်းဆိုဒ်</translation>
 <translation id="2729314457178420145">ဖွင့်ကြည့်ထားသည့် မှတ်တမ်းဒေတာ (<ph name="URL" />) ကိုလည်း ရှင်းထုတ်မည်ဖြစ်ပြီး Google.com မှ ထွက်သွားပါမည်။ <ph name="LEARN_MORE" /></translation>
+<translation id="2729327310379176711">Chrome က စောင့်ကြည့်ခြင်းကို လျှော့ချရန်နှင့် သင်ကြည့်ရှုနေစဉ် ပိုမိုလုံခြုံစေရန် နည်းလမ်းအသစ်များရှာနေပါသည်။ Chrome က <ph name="ESTIMATE_INTERESTS_LINK" /> ပြီး ၎င်းတို့ကို သင့်အား စီမံခွင့်ပြုပါသည်။ သင်ဝင်ကြည့်သောဝဘ်ဆိုက်များက ကြော်ငြာပြရန်အတွက် Chrome တွင် သင့်စိတ်ဝင်စားမှုများကို ကြည့်ခွင့်တောင်းနိုင်ပါသည်။</translation>
 <translation id="2730029791981212295">Linux အက်ပ်နှင့် ဖိုင်များကို အရန်သိမ်းနေသည်</translation>
 <translation id="2730901670247399077">အီမိုဂျီ အကြံပြုချက်များ</translation>
 <translation id="273093730430620027">ဒီစာမျက်နှာသည် သင်၏ ကင်မရာကို ရယူသုံးနေသည်။</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 2d45392..5c7405c 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -7978,6 +7978,7 @@
 <translation id="8666759526542103597">ਬ੍ਰਾਊਜ਼ਰ-ਆਧਾਰਿਤ ਵਿਗਿਆਪਨ ਵਿਅਕਤੀਗਤਕਰਨ ਬਾਰੇ</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ਹੁਣ ਪੂਰੀ ਸਕ੍ਰੀਨ ਹੈ ਅਤੇ ਤੁਹਾਡਾ ਮਾਊਸ ਕਰਸਰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation>
 <translation id="8667760277771450375">ਅਸੀਂ ਸਾਈਟਾਂ ਨੂੰ ਵਿਗਿਆਪਨ ਸਪੈਮ ਅਤੇ ਧੋਖਾਧੜੀ ਬੰਦ ਕਰਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦੇ ਹੋਏ ਕ੍ਰਾਸ-ਸਾਈਟ ਟਰੈਕਿੰਗ ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਕਰਨ ਦੇ ਤਰੀਕਿਆਂ ਦੀ ਪੜਚੋਲ ਕਰ ਰਹੇ ਹਾਂ।</translation>
+<translation id="8668378421690365723">ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਸ਼ਾਇਦ ਹੁਣ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ ਅਤੇ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਆ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ।</translation>
 <translation id="8669284339312441707">ਵਧੇਰੇ ਗੂੜ੍ਹਾ</translation>
 <translation id="8670537393737592796">ਤੇਜ਼ੀ ਨਾਲ ਇੱਥੇ ਵਾਪਸ ਆਉਣ ਲਈ, ਸਥਾਪਤ ਕਰੋ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰਕੇ <ph name="APP_NAME" /> ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation>
 <translation id="867085395664725367">ਸਰਵਰ ਵਿੱਚ ਅਸਥਾਈ ਗੜਬੜ ਹੋ ਗਈ।</translation>
@@ -8462,6 +8463,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />ਬਿਹਤਰੀਨ ਅਨੁਭਵ ਲਈ, ਆਪਣੀ ਅੰਦਰੂਨੀ ਡਿਸਕ 'ਤੇ <ph name="DEVICE_OS" /> ਸਥਾਪਤ ਕਰੋ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਲੌਗ-ਇਨ ਸਕ੍ਰੀਨ ਤੋਂ ਵੀ ਸਥਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />ਜੇ ਤੁਸੀਂ ਸਥਾਪਤ ਕਰਨ ਲਈ ਤਿਆਰ ਨਹੀਂ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਇਸ ਨੂੰ ਅਜ਼ਮਾਉਣ ਲਈ USB ਤੋਂ ਚਲਾ ਸਕਦੇ ਹੋ। ਇਹ ਤੁਹਾਡੇ ਮੌਜੂਦਾ OS ਅਤੇ ਡਾਟੇ ਨੂੰ ਨਹੀਂ ਵਰਤੇਗਾ, ਪਰ ਤੁਸੀਂ ਸਟੋਰੇਜ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਦੀਆਂ ਸੀਮਾਵਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ।<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">ਪਿੰਨ ਕੀਤੀ ਟੈਬ ਦੇ ਤੌਰ ਤੇ ਖੋਲ੍ਹੋ</translation>
+<translation id="9123287046453017203">ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਅੱਪ-ਟੂ-ਡੇਟ ਨਹੀਂ ਹੈ</translation>
 <translation id="9124003689441359348">ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੇ</translation>
 <translation id="9126149354162942022">ਕਰਸਰ ਦਾ ਰੰਗ</translation>
 <translation id="9128317794749765148">ਸੈੱਟਅੱਪ ਪੂਰਾ ਨਹੀਂ ਹੋ ਸਕਿਆ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index b8400c1..2c32d458 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -7949,6 +7949,7 @@
 <translation id="8666759526542103597">O personalizacji reklam na podstawie informacji z przeglądarki.</translation>
 <translation id="8667328578593601900">Strona <ph name="FULLSCREEN_ORIGIN" /> jest obecnie wyświetlana na pełnym ekranie i wyłączyła kursor myszy.</translation>
 <translation id="8667760277771450375">Pracujemy nad tym, jak ograniczyć śledzenie w witrynach, a jednocześnie umożliwić im zapobieganie oszustwom i spamowi reklamowemu.</translation>
+<translation id="8668378421690365723">Twoje urządzenie może przestać działać prawidłowo i możesz mieć problemy z bezpieczeństwem i wydajnością.</translation>
 <translation id="8669284339312441707">Cieplejsze</translation>
 <translation id="8670537393737592796">Aby szybko tu wrócić, zainstaluj aplikację <ph name="APP_NAME" /> (kliknij przycisk instalacji)</translation>
 <translation id="867085395664725367">Wystąpił tymczasowy błąd serwera.</translation>
@@ -8431,6 +8432,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />System operacyjny <ph name="DEVICE_OS" /> będzie działać najlepiej po zainstalowaniu na dysku wewnętrznym. Instalację możesz przeprowadzić też później z poziomu ekranu logowania.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Jeśli nie wszystko jest gotowe do instalacji, możesz uruchomić system z nośnika USB, aby go wypróbować. W takim przypadku Twój obecny system operacyjny i dane zostaną zachowane, ale możesz zauważyć ograniczenia dotyczące pamięci i wydajności.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Otwórz jako przypiętą kartę</translation>
+<translation id="9123287046453017203">Urządzenie używa nieaktualnej wersji oprogramowania</translation>
 <translation id="9124003689441359348">Tutaj pojawią się zapisane hasła</translation>
 <translation id="9126149354162942022">Kolor kursora</translation>
 <translation id="9128317794749765148">Nie udało się ukończyć konfiguracji</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 166d37a1..6ef7c39 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3791,6 +3791,7 @@
 <translation id="4579581181964204535">Nu se poate proiecta <ph name="HOST_NAME" />.</translation>
 <translation id="4579876313423027742">Pentru notificările din browser, accesează <ph name="LINK_BEGIN" />Setările browserului Chrome<ph name="LINK_END" /></translation>
 <translation id="4580596421317071374">Parolele se salvează în <ph name="GOOGLE_PASSWORD_MANAGER" /> pe acest dispozitiv.</translation>
+<translation id="4580626299762849806">Nu se pot importa parolele. Verifică <ph name="FILENAME" /> și asigură-te că este formatat corect.</translation>
 <translation id="4581774856936278355">Eroare la restabilirea Linux</translation>
 <translation id="4582297591746054421">Site-urile citesc de obicei clipboardul pentru a face acțiuni precum păstrarea formatării textului pe care l-ai copiat</translation>
 <translation id="4582563038311694664">Restabilește toate setările</translation>
@@ -5096,6 +5097,7 @@
 <translation id="5877064549588274448">Canalul a fost schimbat. Reporniți dispozitivul pentru a aplica modificările.</translation>
 <translation id="5877584842898320529">Imprimanta selectată nu este disponibilă sau nu este instalată corect. <ph name="BR" /> Verifică imprimanta sau încearcă să selectezi altă imprimantă.</translation>
 <translation id="5878945009165002849">Blochează solicitările de conectare de la serviciile de identitate</translation>
+<translation id="5882449899683447569">A apărut o eroare și parolele nu s-au importat</translation>
 <translation id="5882919346125742463">Rețele cunoscute</translation>
 <translation id="5883356647197510494">Permisiuni blocate automat: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Această filă este conectată la un dispozitiv USB.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 94ae794..5b2b4d5 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -3792,6 +3792,7 @@
 <translation id="4579581181964204535">Nie je možné prenášať hostiteľskú službu <ph name="HOST_NAME" />.</translation>
 <translation id="4579876313423027742">Ak chcete upraviť upozornenia prehliadača, prejdite do <ph name="LINK_BEGIN" />nastavení prehliadača Chrome<ph name="LINK_END" /></translation>
 <translation id="4580596421317071374">Heslá sa ukladajú do služby <ph name="GOOGLE_PASSWORD_MANAGER" /> v tomto zariadení.</translation>
+<translation id="4580626299762849806">Heslá sa nedajú importovať. Skontrolujte, či má súbor <ph name="FILENAME" /> správny formát.</translation>
 <translation id="4581774856936278355">Chyba pri obnovovaní systému Linux</translation>
 <translation id="4582297591746054421">Weby zvyčajne čítajú vašu schránku, aby mohli poskytovať funkcie, ako je ponechanie formátu kopírovaného textu</translation>
 <translation id="4582563038311694664">Resetovať všetky nastavenia</translation>
@@ -5097,6 +5098,7 @@
 <translation id="5877064549588274448">Kanál sa zmenil. Ak chcete zmeny použiť, reštartujte zariadenie.</translation>
 <translation id="5877584842898320529">Vybraná tlačiareň nie je k dispozícii alebo nie je správne nainštalovaná. <ph name="BR" />Skontrolujte tlačiareň alebo skúste vybrať inú.</translation>
 <translation id="5878945009165002849">Blokovať výzvy na prihlásenie zo služieb identity</translation>
+<translation id="5882449899683447569">Niečo sa pokazilo a vaše heslá sa neimportovali</translation>
 <translation id="5882919346125742463">Známe siete</translation>
 <translation id="5883356647197510494">Automaticky blokované: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Táto karta je pripojená k zariadeniu USB.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index c55e88b7..c55e8ccc 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -7973,6 +7973,7 @@
 <translation id="8666759526542103597">Maelezo kuhusu kuweka mapendeleo ya matangazo kwenye kivinjari</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> sasa ni skrini nzima na imelemaza kiteuzi chako cha kipanya.</translation>
 <translation id="8667760277771450375">Tunachunguza njia za kuzuia ufuatiliaji katika tovuti mbalimbali huku tukiziruhusu tovuti zizuie matangazo taka na ulaghai.</translation>
+<translation id="8668378421690365723">Huenda kifaa chako kisifanye kazi ipasavyo na kinaweza kukumbwa na hitilafu za kiutendaji na kiusalama.</translation>
 <translation id="8669284339312441707">Inayong'aa kidogo</translation>
 <translation id="8670537393737592796">Ili uweze kurudi hapa kwa haraka, sakinisha <ph name="APP_NAME" /> kwa kubofya kitufe cha kusakinisha</translation>
 <translation id="867085395664725367">Hitilafu ya seva ya muda imetokea.</translation>
@@ -8456,6 +8457,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Ili upate hali bora zaidi ya utumiaji, sakinisha <ph name="DEVICE_OS" /> kwenye diski yako ya ndani. Unaweza pia kuisakinisha baadaye kutoka kwenye skrini ya kuingia katika akaunti.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Ikiwa hauko tayari kusakinisha, unaweza kuitekeleza kutoka kwenye USB ili uijaribu. Hatua hii itadumisha mfumo wa uendeshaji na data yako iliyopo, lakini huenda ukaona vizuizi vya nafasi ya hifadhi na utendakazi.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Fungua kama kichupo kilichobanwa</translation>
+<translation id="9123287046453017203">Kifaa chako hakijasasishwa</translation>
 <translation id="9124003689441359348">Manenosiri yaliyohifadhiwa yataonekana hapa</translation>
 <translation id="9126149354162942022">Rangi ya kiteuzi</translation>
 <translation id="9128317794749765148">Imeshindwa kukamilisha shughuli ya kusakinisha</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 99b2df47..292bafdba 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -7978,6 +7978,7 @@
 <translation id="8666759526542103597">உலாவி அடிப்படையிலான விளம்பரப் பிரத்தியேகமாக்கல் குறித்த ஓர் அறிமுகம்</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> இப்போது முழுத்திரையில் உள்ளது. மேலும் உங்கள் இடஞ்சுட்டியை முடக்கியுள்ளது.</translation>
 <translation id="8667760277771450375">விளம்பர ஸ்பேம் &amp; மோசடியைத் தடுப்பதற்குத் தளங்களை அனுமதிப்பதுடன், தளங்களுக்கிடையே மாறும்போது கண்காணிப்பதைத் தடுப்பதற்கான வழிகளையும் கண்டறிந்து வருகிறோம்.</translation>
+<translation id="8668378421690365723">உங்கள் சாதனம் சரியாகச் செயல்படாமல் போகக்கூடும். அத்துடன் பாதுகாப்பு மற்றும் செயல்திறன் சிக்கல்களும் ஏற்படக்கூடும்.</translation>
 <translation id="8669284339312441707">குறைவான நீலம்</translation>
 <translation id="8670537393737592796">விரைவாக இந்தப் பக்கத்தை அணுக ‘நிறுவு’ பட்டனைக் கிளிக் செய்து <ph name="APP_NAME" /> ஐ நிறுவவும்</translation>
 <translation id="867085395664725367">சேவையகத்தில் தற்காலிகப் பிழை ஏற்பட்டது.</translation>
@@ -8461,6 +8462,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />சிறந்த அனுபவத்தைப் பெற, <ph name="DEVICE_OS" /> ஐச் சாதனத்தின் டிஸ்க்கில் நிறுவவும். பின்னர் எப்போது வேண்டுமானாலும் இதை உள்நுழைவுத் திரையில் இருந்தும் நிறுவலாம்.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />சாதனத்தில் நிறுவ விரும்பவில்லை எனில் USBயில் இருந்தே அதை இயக்கிப் பயன்படுத்திப் பார்க்கலாம். தற்போதுள்ள OSஸையும் தரவையும் இது பாதிக்காது. ஆனால், சேமிப்பகமும் செயல்திறனும் வரம்பிடப்படலாம்.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">பொருத்திய தாவலாகத் திற</translation>
+<translation id="9123287046453017203">உங்கள் சாதனம் சமீபத்தியதாக இல்லை</translation>
 <translation id="9124003689441359348">சேமித்த கடவுச்சொற்கள் இங்கே தோன்றும்</translation>
 <translation id="9126149354162942022">கர்சர் வண்ணம்</translation>
 <translation id="9128317794749765148">அமைவை நிறைவுசெய்ய இயலவில்லை</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index dee72eb..3d2f6f5 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1869,6 +1869,7 @@
 <translation id="2727633948226935816">ไม่ต้องเตือนฉันอีก</translation>
 <translation id="2727712005121231835">ขนาดจริง</translation>
 <translation id="2729314457178420145">รวมถึงล้างข้อมูลการท่องเว็บ (<ph name="URL" />) ซึ่งอาจนำคุณออกจากระบบของ Google.com <ph name="LEARN_MORE" /></translation>
+<translation id="2729327310379176711">Chrome พบวิธีใหม่ๆ ในการลดการติดตามและช่วยให้การท่องเว็บปลอดภัยยิ่งขึ้น Chrome ยัง<ph name="ESTIMATE_INTERESTS_LINK" />และให้คุณจัดการข้อมูลเหล่านั้นด้วย จากนั้นเว็บไซต์ที่คุณเข้าชมจะถาม Chrome ว่าคุณสนใจเรื่องอะไรเพื่อแสดงโฆษณาที่ตรงตามความต้องการ</translation>
 <translation id="2730029791981212295">กำลังสำรองข้อมูลแอปและไฟล์ Linux</translation>
 <translation id="2730901670247399077">คำแนะนำอีโมจิ</translation>
 <translation id="273093730430620027">หน้านี้กำลังเข้าถึงกล้องของคุณ</translation>
@@ -4555,6 +4556,7 @@
 <translation id="5350293332385664455">ปิด Google Assistant</translation>
 <translation id="535123479159372765">ข้อความคัดลอกมาจากอุปกรณ์อื่น</translation>
 <translation id="5352033265844765294">การระบุเวลา</translation>
+<translation id="5352257124367865087">จัดการสิทธิ์ของเว็บไซต์</translation>
 <translation id="5353252989841766347">ส่งออกรหัสผ่านจาก Chrome</translation>
 <translation id="5355099869024327351">อนุญาตให้ Assistant แสดงการแจ้งเตือน</translation>
 <translation id="5355191726083956201">การปกป้องที่ปรับปรุงแล้วเปิดอยู่</translation>
@@ -5053,6 +5055,7 @@
 <translation id="5843706793424741864">ฟาเรนไฮต์</translation>
 <translation id="5844574845205796324">แนะนำเนื้อหาใหม่ให้สำรวจ</translation>
 <translation id="5846200638699387931">ข้อผิดพลาดทางไวยากรณ์ที่แสดงความสัมพันธ์: <ph name="ERROR_LINE" /></translation>
+<translation id="5846504156837627898">จัดการสิทธิ์ของเว็บไซต์</translation>
 <translation id="5846807460505171493">ติดตั้งอัปเดตและแอป การดำเนินการต่อหมายความว่าคุณยินยอมให้อุปกรณ์เครื่องนี้ดาวน์โหลดและติดตั้งอัปเดตและแอปจาก Google, ผู้ให้บริการ และผู้ผลิตอุปกรณ์ของคุณโดยอัตโนมัติด้วย ซึ่งอาจมีการใช้อินเทอร์เน็ตมือถือ แอปบางแอปอาจมีการซื้อในแอป</translation>
 <translation id="5849212445710944278">เพิ่มแล้ว</translation>
 <translation id="5851868085455377790">ผู้ออกใบรับรอง</translation>
@@ -5616,6 +5619,7 @@
 <translation id="6398715114293939307">นำ Google Play Store ออก</translation>
 <translation id="6398765197997659313">ออกจากการแสดงแบบเต็มหน้าจอ</translation>
 <translation id="6399774419735315745">สายลับ</translation>
+<translation id="6400360390396538896">ตลอดเวลาใน <ph name="ORIGIN" /></translation>
 <translation id="6401458660421980302">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์นั้น</translation>
 <translation id="6401597285454423070">คอมพิวเตอร์ของคุณมีอุปกรณ์รักษาความปลอดภัย Trusted Platform Module (TPM) ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS ดูข้อมูลเพิ่มเติมได้จากศูนย์ช่วยเหลือของ Chromebook ซึ่งอยู่ที่ https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6404187344102273690">Chromebook สำหรับเล่นเกม</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index e141bff..697fdeae1 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -7983,6 +7983,7 @@
 <translation id="8666759526542103597">Про персоналізацію реклами на основі даних веб-переглядача</translation>
 <translation id="8667328578593601900">Сторінка <ph name="FULLSCREEN_ORIGIN" /> зараз відображається в повноекранному режимі та вимкнула курсор миші.</translation>
 <translation id="8667760277771450375">Ми досліджуємо способи обмежити міжсайтове відстеження, водночас допомагаючи сайтам протидіяти рекламному спаму та шахрайству.</translation>
+<translation id="8668378421690365723">Ваш пристрій може працювати неналежним чином, і у вас можуть виникати проблеми з безпекою та продуктивністю.</translation>
 <translation id="8669284339312441707">Тепло</translation>
 <translation id="8670537393737592796">Щоб швидко повертатися сюди, установіть додаток <ph name="APP_NAME" />, натиснувши цю кнопку</translation>
 <translation id="867085395664725367">Сталася тимчасова помилка сервера.</translation>
@@ -8469,6 +8470,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Для оптимальної роботи установіть <ph name="DEVICE_OS" /> на внутрішній диск. Ви також можете зробити це пізніше на екрані входу.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Якщо ви наразі не хочете встановлювати цю ОС, можете випробувати її, запустивши з носія USB. Наявні дані й ОС видалено не буде, але доступний обсяг пам’яті й продуктивність можуть знизитися.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">Відкрити як закріплену вкладку</translation>
+<translation id="9123287046453017203">На вашому пристрої встановлено застарілу ОС</translation>
 <translation id="9124003689441359348">Тут відображатимуться збережені паролі</translation>
 <translation id="9126149354162942022">Колір курсора</translation>
 <translation id="9128317794749765148">Не вдалося завершити встановлення</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 5128996..65fc47d 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -7960,6 +7960,7 @@
 <translation id="8666759526542103597">براؤزر کی بنیاد اشتہار کی ذاتی نوعیت سازی کے بارے میں</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> اب پوری اسکرین میں ہے اور اس نے آپ کا ماؤس کرسر غیر فعال کر دیا ہے۔</translation>
 <translation id="8667760277771450375">ہم اشتہاری اسپام اور دھوکہ دہی کو روکنے کے لیے سائٹس کو فعال کرتے وقت کراس سائٹ ٹریکنگ کو محدود کرنے کے طریقے دریافت کر رہے ہیں۔</translation>
+<translation id="8668378421690365723">ہو سکتا ہے کہ آپ کا آلہ اب ٹھیک سے کام نہ کرے اور اسے سیکیورٹی اور کارکردگی کے مسائل کا سامنا کرنا پڑے۔</translation>
 <translation id="8669284339312441707">گرم</translation>
 <translation id="8670537393737592796">فوری طور پر یہاں واپس آنے کے لیے، 'انسٹال کریں' بٹن پر کلک کر کے <ph name="APP_NAME" /> انسٹال کریں</translation>
 <translation id="867085395664725367">سرور کی عارضی خرابی پیش آگئی۔</translation>
@@ -8443,6 +8444,7 @@
 <translation id="9120693811286642342">‏<ph name="BEGIN_PARAGRAPH1" />بہترین تجربے کیلئے، اپنی اندرونی ڈسک میں <ph name="DEVICE_OS" /> انسٹال کریں۔ آپ بعد میں اسے لاگ ان اسکرین سے بھی انسٹال کر سکتے ہیں۔<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />اگر آپ انسٹال کرنے کیلئے تیار نہیں ہیں تو اسے آزمانے کیلئے، آپ اسے USB سے چلا سکتے ہیں۔ اس سے آپ کا موجودہ OS اور ڈیٹا محفوظ رہے گا، لیکن آپ کی اسٹوریج اور کارکردگی کی حدود کم ہو سکتی ہیں۔<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">پن کردہ ٹیب کے بطور کھولیں</translation>
+<translation id="9123287046453017203">آپ کا آلہ اپ ٹو ڈیٹ نہیں ہے</translation>
 <translation id="9124003689441359348">محفوظ کردہ پاس ورڈز یہاں ظاہر ہوں گے</translation>
 <translation id="9126149354162942022">کرسر کا رنگ</translation>
 <translation id="9128317794749765148">سیٹ اپ مکمل نہیں ہو سکا</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index fa03d5ba..3861e97 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -7946,6 +7946,7 @@
 <translation id="8666759526542103597">关于基于浏览器的广告个性化</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> 现处于全屏模式并已隐藏鼠标指针。</translation>
 <translation id="8667760277771450375">我们正在探索如何既能让网站阻止垃圾广告和欺诈行为,又能限制跨网站跟踪。</translation>
+<translation id="8668378421690365723">您的设备可能会无法继续正常运行,而且可能会遇到安全问题和性能问题。</translation>
 <translation id="8669284339312441707">暖色调</translation>
 <translation id="8670537393737592796">若要快速返回到这里,请点击安装按钮以安装“<ph name="APP_NAME" />”</translation>
 <translation id="867085395664725367">服务器发生了暂时性错误。</translation>
@@ -8429,6 +8430,7 @@
 <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />为获得最佳体验,请将 <ph name="DEVICE_OS" /> 安装到您的内部磁盘。您也可等到需要时再从登录屏幕安装它。<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />如果尚未做好安装前的准备工作,您可从 USB 运行它来试用一下。这样做不会更改您的现有操作系统和数据,但可能会在存储和性能方面受到限制。<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9121814364785106365">在固定标签页中打开</translation>
+<translation id="9123287046453017203">您设备上的 OS 不是最新版本</translation>
 <translation id="9124003689441359348">已保存的密码将显示在这里</translation>
 <translation id="9126149354162942022">光标颜色</translation>
 <translation id="9128317794749765148">无法完成设置</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 5d38d76..fb12264 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1869,6 +1869,7 @@
 <translation id="2727633948226935816">不要再提醒我</translation>
 <translation id="2727712005121231835">實際大小</translation>
 <translation id="2729314457178420145">一併清除瀏覽資料 (<ph name="URL" />)。這項操作可能會將你登出 Google.com。<ph name="LEARN_MORE" /></translation>
+<translation id="2729327310379176711">Chrome 正在尋找減少追蹤使用者活動的新方式,讓你上網時更安全。此外,Chrome 也會<ph name="ESTIMATE_INTERESTS_LINK" />,同時讓你自行管理這些資訊。你造訪的網站可在之後要求 Chrome 提供這類資訊,以便向你顯示廣告。</translation>
 <translation id="2730029791981212295">正在備份 Linux 應用程式和檔案</translation>
 <translation id="2730901670247399077">表情符號建議</translation>
 <translation id="273093730430620027">這個網頁正在存取你的攝影機。</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 04cb51e..93436e8 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1811,6 +1811,9 @@
   <message name="IDS_SETTINGS_SAFETY_CHECK_REVIEW" desc="Text for a button that allows users to review safety check findings, such as compromised passwords or blocklisted extensions.">
     Review
   </message>
+  <message name="IDS_SETTINGS_SAFETY_CHECK_UNUSED_SITE_PERMISSIONS_PRIMARY_LABEL" translateable="false" desc="The placeholder title for 'Unused Site Permissions' module. It is an element in safety check that shows the revoked permissions of unused websites.">
+    Permissions removed from unused websites.
+  </message>
   <message name="IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL" desc="'Updates' is an element in safety check that shows the update status of Chrome.">
     Updates
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 42f789d..3f1940b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1665,8 +1665,6 @@
     "signin/header_modification_delegate_impl.h",
     "signin/identity_manager_factory.cc",
     "signin/identity_manager_factory.h",
-    "signin/investigator_dependency_provider.cc",
-    "signin/investigator_dependency_provider.h",
     "signin/primary_account_policy_manager.cc",
     "signin/primary_account_policy_manager.h",
     "signin/primary_account_policy_manager_factory.cc",
@@ -5148,7 +5146,6 @@
       "//chrome/browser/ash/system_extensions/api/window_management",
       "//chrome/browser/ash/system_web_apps",
       "//chrome/browser/chromeos",
-      "//chrome/browser/chromeos/extensions/telemetry",
       "//chrome/browser/enterprise/connectors/device_trust/attestation/ash",
       "//chrome/browser/nearby_sharing:share_target",
       "//chrome/browser/nearby_sharing/certificates",
@@ -5181,7 +5178,6 @@
       "//chrome/browser/ui/webui/nearby_share/public/mojom",
       "//chrome/browser/ui/webui/settings/ash/os_apps_page/mojom",
       "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings",
-      "//chrome/common/chromeos/extensions",
       "//chrome/services/sharing/public/cpp",
       "//chrome/services/sharing/public/proto",
       "//chrome/services/speech:lib",
@@ -5734,11 +5730,13 @@
     ]
     deps += [
       "//ash/webui/projector_app/public/cpp",
+      "//chrome/browser/chromeos/extensions/telemetry",
       "//chrome/browser/metrics/structured",
       "//chrome/browser/policy:onc",
       "//chrome/browser/ui/quick_answers",
       "//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
       "//chrome/browser/webshare:storage",
+      "//chrome/common/chromeos/extensions",
       "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser",
       "//chromeos/components/disks:prefs",
       "//chromeos/components/onc:onc",
@@ -6072,6 +6070,8 @@
       "chrome_browser_main_mac.h",
       "chrome_browser_main_mac.mm",
       "component_updater/recovery_improved_component_installer_mac.cc",
+      "device_reauth/mac/biometric_authenticator_mac.h",
+      "device_reauth/mac/biometric_authenticator_mac.mm",
       "download/download_status_updater_mac.mm",
       "download/drag_download_item_mac.mm",
       "enterprise/signals/device_info_fetcher_mac.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9e6d463a..43660a8 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8898,9 +8898,9 @@
      FEATURE_VALUE_TYPE(syncer::kIgnoreSyncEncryptionKeysLongMissing)},
 
     {"autofill-parse-iban-fields",
-     flag_descriptions::kAutofillParseIbanFieldsName,
-     flag_descriptions::kAutofillParseIbanFieldsDescription, kOsAll,
-     FEATURE_VALUE_TYPE(autofill::features::kAutofillParseIbanFields)},
+     flag_descriptions::kAutofillParseIBANFieldsName,
+     flag_descriptions::kAutofillParseIBANFieldsDescription, kOsAll,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillParseIBANFields)},
 
 #if BUILDFLAG(IS_ANDROID)
     {"autofill-enable-fido-progress-dialog",
@@ -8956,14 +8956,14 @@
      kOsCrOS | kOsLacros,
      FEATURE_VALUE_TYPE(apps::features::kLinkCapturingAutoDisplayIntentPicker)},
 #endif  // BUILDFLAG(IS_CHROMEOS)
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-    {"enable-biometric-authentication-in-settings",
-     flag_descriptions::kEnableBiometricAuthenticationInSettingsName,
-     flag_descriptions::kEnableBiometricAuthenticationInSettingsDescription,
-     kOsMac | kOsWin,
+
+#if BUILDFLAG(IS_MAC)
+    {"biometric-authentication-in-settings",
+     flag_descriptions::kBiometricAuthenticationInSettingsName,
+     flag_descriptions::kBiometricAuthenticationInSettingsDescription, kOsMac,
      FEATURE_VALUE_TYPE(
-         password_manager::features::kEnableBiometricAuthenticationInSettings)},
-#endif
+         password_manager::features::kBiometricAuthenticationInSettings)},
+#endif  // BUILDFLAG(IS_MAC)
 
     {"autofill-enable-remade-downstream-metrics",
      flag_descriptions::kAutofillEnableRemadeDownstreamMetricsName,
diff --git a/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
index 4424801c..cea1de60 100644
--- a/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/ash/crostini/crostini_test_helper.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/test/base/testing_profile.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_update.h"
 #include "components/services/app_service/public/cpp/intent_filter.h"
@@ -31,7 +31,7 @@
   AppServiceProxy* app_service_proxy() { return app_service_proxy_; }
 
   void SetUp() override {
-    chromeos::DBusThreadManager::Initialize();
+    ash::CiceroneClient::InitializeFake();
     profile_ = std::make_unique<TestingProfile>();
     app_service_proxy_ = AppServiceProxyFactory::GetForProfile(profile_.get());
     web_app::test::AwaitStartWebAppProviderAndSubsystems(profile_.get());
@@ -43,7 +43,7 @@
   void TearDown() override {
     test_helper_.reset();
     profile_.reset();
-    chromeos::DBusThreadManager::Shutdown();
+    ash::CiceroneClient::Shutdown();
   }
 
  private:
diff --git a/chrome/browser/ash/account_manager/account_apps_availability.cc b/chrome/browser/ash/account_manager/account_apps_availability.cc
index 891fe828..ef99f21 100644
--- a/chrome/browser/ash/account_manager/account_apps_availability.cc
+++ b/chrome/browser/ash/account_manager/account_apps_availability.cc
@@ -60,9 +60,9 @@
 }
 
 bool IsPrefInitialized(PrefService* prefs) {
-  const base::Value* accounts =
-      prefs->GetDictionary(account_manager::prefs::kAccountAppsAvailability);
-  return accounts && (accounts->DictSize() > 0 || IsActiveDirectoryUser());
+  const base::Value::Dict& accounts =
+      prefs->GetValueDict(account_manager::prefs::kAccountAppsAvailability);
+  return accounts.size() > 0 || IsActiveDirectoryUser();
 }
 
 void CompleteFindAccountByGaiaId(
@@ -106,16 +106,11 @@
 
 base::flat_set<std::string> GetGaiaIdsAvailableInArc(PrefService* prefs) {
   base::flat_set<std::string> result;
-  const base::Value* accounts =
-      prefs->GetDictionary(account_manager::prefs::kAccountAppsAvailability);
-  if (!accounts) {
-    LOG(ERROR) << "Couldn't find "
-               << account_manager::prefs::kAccountAppsAvailability
-               << " dict in prefs";
-    return result;
-  }
+  const base::Value::Dict& accounts =
+      prefs->GetValueDict(account_manager::prefs::kAccountAppsAvailability);
+
   // See structure of `accounts` at the top of the file.
-  for (const auto dict : accounts->DictItems()) {
+  for (const auto dict : accounts) {
     absl::optional<bool> is_available =
         dict.second.FindBoolKey(account_manager::prefs::kIsAvailableInArcKey);
     if (!is_available.has_value() || !is_available.value())
@@ -133,22 +128,16 @@
 // `SetIsAccountAvailableInArc` wasn't called for this account yet).
 absl::optional<bool> IsAccountAvailableInArc(PrefService* prefs,
                                              const std::string& gaia_id) {
-  const base::Value* accounts =
-      prefs->GetDictionary(account_manager::prefs::kAccountAppsAvailability);
-  if (!accounts) {
-    LOG(ERROR) << "Couldn't find "
-               << account_manager::prefs::kAccountAppsAvailability
-               << " dict in prefs";
-    return absl::nullopt;
-  }
+  const base::Value::Dict& accounts =
+      prefs->GetValueDict(account_manager::prefs::kAccountAppsAvailability);
+
   // See structure of `accounts` at the top of the file.
-  const base::Value* account_entry = accounts->FindDictKey(gaia_id);
+  const base::Value::Dict* account_entry = accounts.FindDict(gaia_id);
   if (!account_entry)
     return absl::nullopt;
 
-  DCHECK(account_entry->is_dict());
   absl::optional<bool> is_available_in_arc =
-      account_entry->FindBoolKey(account_manager::prefs::kIsAvailableInArcKey);
+      account_entry->FindBool(account_manager::prefs::kIsAvailableInArcKey);
   DCHECK(is_available_in_arc);
   // If there is no `is_available_in_arc` key, assume that account is available
   // in ARC.
diff --git a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
index df757d2..171bc90 100644
--- a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
+++ b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
@@ -293,13 +293,10 @@
 void CertProvisioningSchedulerImpl::DeserializeWorkers() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  const base::Value* saved_workers =
-      pref_service_->Get(GetPrefNameForSerialization(cert_scope_));
-  if (!saved_workers) {
-    return;
-  }
+  const base::Value::Dict& saved_workers =
+      pref_service_->GetValueDict(GetPrefNameForSerialization(cert_scope_));
 
-  for (const auto kv : saved_workers->DictItems()) {
+  for (const auto kv : saved_workers) {
     const base::Value& saved_worker = kv.second;
 
     std::unique_ptr<CertProvisioningWorker> worker =
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index 4a45e46..813a3a1 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -255,6 +255,7 @@
     "//build/config/chromebox_for_meetings:buildflags",
     "//chrome/browser:browser_process",
     "//chrome/browser/ash/system_web_apps/types:types",
+    "//chrome/browser/ash/telemetry_extension",
     "//chrome/browser/chromeos:print_job_info_proto",
     "//chrome/browser/image_decoder:image_decoder",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc
index a451b290..b091718 100644
--- a/chrome/browser/ash/crosapi/browser_util.cc
+++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -628,16 +628,6 @@
   return base::FeatureList::IsEnabled(chromeos::features::kLacrosPrimary);
 }
 
-LacrosMode GetLacrosMode() {
-  if (!IsAshWebBrowserEnabled())
-    return LacrosMode::kOnly;
-  if (IsLacrosPrimaryBrowser())
-    return LacrosMode::kPrimary;
-  if (IsLacrosEnabled())
-    return LacrosMode::kSideBySide;
-  return LacrosMode::kDisabled;
-}
-
 void SetLacrosPrimaryBrowserForTest(absl::optional<bool> value) {
   g_lacros_primary_browser_for_test = value;
 }
diff --git a/chrome/browser/ash/crosapi/browser_util.h b/chrome/browser/ash/crosapi/browser_util.h
index 1bc08e1..d8edb49 100644
--- a/chrome/browser/ash/crosapi/browser_util.h
+++ b/chrome/browser/ash/crosapi/browser_util.h
@@ -97,24 +97,6 @@
   kMove = 1,  // Migrate using `MoveMigrator`.
 };
 
-// Specifies the mode Lacros is currently running.
-// This enum is different from LacrosAvailability in the way that
-// it describes the mode Lacros is running at a given point in time
-// which can be influenced by multiple factors such as flags,
-// while LacrosAvailability describes the policy that dictates how
-// Lacros is supposed to be launched.
-enum class LacrosMode {
-  // Indicates that Lacros is disabled. Ash is the only browser.
-  kDisabled = 0,
-  // Indicates that Lacros is enabled but Ash browser is the
-  // primary browser.
-  kSideBySide = 1,
-  // Indicates that Lacros is the primary browser. Ash is also available.
-  kPrimary = 2,
-  // Indicates that Lacros is the only available browser.
-  kOnly = 3,
-};
-
 extern const ComponentInfo kLacrosDogfoodCanaryInfo;
 extern const ComponentInfo kLacrosDogfoodDevInfo;
 extern const ComponentInfo kLacrosDogfoodBetaInfo;
@@ -225,10 +207,6 @@
 bool IsLacrosPrimaryBrowserForMigration(const user_manager::User* user,
                                         PolicyInitState policy_init_state);
 
-// Returns the current mode Lacros is running.
-// See LacrosMode definition for a full list of modes.
-LacrosMode GetLacrosMode();
-
 // Forces IsLacrosPrimaryBrowser() to return true or false for testing.
 // Passing absl::nullopt will reset the state.
 void SetLacrosPrimaryBrowserForTest(absl::optional<bool> value);
diff --git a/chrome/browser/ash/crosapi/browser_util_unittest.cc b/chrome/browser/ash/crosapi/browser_util_unittest.cc
index 3e987a4..f8f59c7 100644
--- a/chrome/browser/ash/crosapi/browser_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_util_unittest.cc
@@ -404,7 +404,7 @@
   }
 }
 
-TEST_F(LacrosSupportBrowserUtilTest, LacrosPrimaryOrOnlyBrowserByFlags) {
+TEST_F(LacrosSupportBrowserUtilTest, LacrosPrimaryBrowserByFlags) {
   AddRegularUser("user@test.com");
   const user_manager::User* const user =
       ash::ProfileHelper::Get()->GetUserByProfile(&testing_profile_);
@@ -412,19 +412,6 @@
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kDisabled,
-              browser_util::GetLacrosMode());
-  }
-
-  // Just enabling LacrosSupport feature is not enough.
-  {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndEnableFeature(chromeos::features::kLacrosSupport);
-    EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser());
-    EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowserForMigration(
-        user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kSideBySide,
-              browser_util::GetLacrosMode());
   }
 
   // Just enabling LacrosPrimary feature is not enough.
@@ -434,11 +421,9 @@
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kDisabled,
-              browser_util::GetLacrosMode());
   }
 
-  // Both LacrosPrimary and LacrosSupport are needed for LacrosPrimary
+  // Both LacrosPrimary and LacrosSupport are needed.
   {
     base::test::ScopedFeatureList feature_list;
     feature_list.InitWithFeatures({chromeos::features::kLacrosPrimary,
@@ -447,21 +432,6 @@
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kPrimary,
-              browser_util::GetLacrosMode());
-  }
-
-  // All LacrosPrimary, LacrosOnly and LacrosSupport are needed for LacrosOnly
-  {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitWithFeatures(
-        {chromeos::features::kLacrosPrimary, chromeos::features::kLacrosSupport,
-         chromeos::features::kLacrosOnly},
-        {});
-    EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
-    EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
-        user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kOnly, browser_util::GetLacrosMode());
   }
 }
 
@@ -479,7 +449,6 @@
   EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
   EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
       user, browser_util::PolicyInitState::kAfterInit));
-  EXPECT_EQ(browser_util::LacrosMode::kPrimary, browser_util::GetLacrosMode());
 }
 
 TEST_F(BrowserUtilTest, LacrosPrimaryBrowserAllowed) {
@@ -507,8 +476,6 @@
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kDisabled,
-              browser_util::GetLacrosMode());
   }
 
   {
@@ -519,8 +486,6 @@
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kSideBySide,
-              browser_util::GetLacrosMode());
   }
 
   {
@@ -531,8 +496,6 @@
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kPrimary,
-              browser_util::GetLacrosMode());
   }
 
   {
@@ -543,7 +506,6 @@
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
     EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
         user, browser_util::PolicyInitState::kAfterInit));
-    EXPECT_EQ(browser_util::LacrosMode::kOnly, browser_util::GetLacrosMode());
   }
 }
 
@@ -1035,36 +997,6 @@
   EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
   EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
       user, browser_util::PolicyInitState::kAfterInit));
-  // What you see here is Finch overrides policy.
-  // This is due to a special logic only to Googlers.
-  // See IsAshWebBrowserEnabled() impl for more details.
-  EXPECT_EQ(browser_util::LacrosMode::kOnly, browser_util::GetLacrosMode());
-  EXPECT_FALSE(browser_util::IsAshWebBrowserEnabled());
-  EXPECT_FALSE(browser_util::IsAshWebBrowserEnabledForMigration(
-      user, browser_util::PolicyInitState::kAfterInit));
-}
-
-TEST_F(BrowserUtilTest, LacrosGoogleRolloutOnly) {
-  AddRegularUser("user@google.com");
-  const user_manager::User* const user =
-      ash::ProfileHelper::Get()->GetUserByProfile(&testing_profile_);
-  // Lacros availability is set by policy to only.
-  ScopedLacrosAvailabilityCache cache(LacrosAvailability::kLacrosOnly);
-
-  // We enable 3 features: LacrosSupport, LacrosPrimary, LacrosOnly
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {chromeos::features::kLacrosSupport, chromeos::features::kLacrosPrimary,
-       chromeos::features::kLacrosOnly},
-      {});
-
-  // Check that Lacros is allowed, enabled, and set to lacros-only.
-  EXPECT_TRUE(browser_util::IsLacrosAllowedToBeEnabled());
-  EXPECT_TRUE(browser_util::IsLacrosEnabled());
-  EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowser());
-  EXPECT_TRUE(browser_util::IsLacrosPrimaryBrowserForMigration(
-      user, browser_util::PolicyInitState::kAfterInit));
-  EXPECT_EQ(browser_util::LacrosMode::kOnly, browser_util::GetLacrosMode());
   EXPECT_FALSE(browser_util::IsAshWebBrowserEnabled());
   EXPECT_FALSE(browser_util::IsAshWebBrowserEnabledForMigration(
       user, browser_util::PolicyInitState::kAfterInit));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index 8468372..5a453d8 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -98,6 +98,7 @@
 #include "chrome/browser/ash/remote_apps/remote_apps_manager_factory.h"
 #include "chrome/browser/ash/sync/sync_service_ash.h"
 #include "chrome/browser/ash/sync/sync_service_factory_ash.h"
+#include "chrome/browser/ash/telemetry_extension/probe_service_ash.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/profiles/profile.h"
@@ -229,6 +230,7 @@
 #if defined(USE_CUPS)
       printing_metrics_ash_(std::make_unique<PrintingMetricsAsh>()),
 #endif  // defined(USE_CUPS)
+      probe_service_ash_(std::make_unique<ash::ProbeServiceAsh>()),
       remoting_ash_(std::make_unique<RemotingAsh>()),
       resource_manager_ash_(std::make_unique<ResourceManagerAsh>()),
       screen_manager_ash_(std::make_unique<ScreenManagerAsh>()),
@@ -559,6 +561,11 @@
   task_manager_ash_->BindReceiver(std::move(receiver));
 }
 
+void CrosapiAsh::BindTelemetryProbeService(
+    mojo::PendingReceiver<mojom::TelemetryProbeService> receiver) {
+  probe_service_ash_->BindReceiver(std::move(receiver));
+}
+
 void CrosapiAsh::BindTimeZoneService(
     mojo::PendingReceiver<mojom::TimeZoneService> receiver) {
   time_zone_service_ash_->BindReceiver(std::move(receiver));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h
index 452194b..f142a18a 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.h
+++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -26,6 +26,10 @@
 class DigitalGoodsFactoryAsh;
 }
 
+namespace ash {
+class ProbeServiceAsh;
+}  // namespace ash
+
 namespace crosapi {
 
 class ArcAsh;
@@ -286,6 +290,8 @@
       mojo::PendingReceiver<mojom::WebPageInfoFactory> receiver) override;
   void BindTaskManager(
       mojo::PendingReceiver<mojom::TaskManager> receiver) override;
+  void BindTelemetryProbeService(
+      mojo::PendingReceiver<mojom::TelemetryProbeService> receiver) override;
   void BindTestController(
       mojo::PendingReceiver<mojom::TestController> receiver) override;
   void BindTimeZoneService(
@@ -480,6 +486,7 @@
   std::unique_ptr<PowerAsh> power_ash_;
   std::unique_ptr<PrefsAsh> prefs_ash_;
   std::unique_ptr<PrintingMetricsAsh> printing_metrics_ash_;
+  std::unique_ptr<ash::ProbeServiceAsh> probe_service_ash_;
   std::unique_ptr<RemotingAsh> remoting_ash_;
   std::unique_ptr<ResourceManagerAsh> resource_manager_ash_;
   std::unique_ptr<ScreenManagerAsh> screen_manager_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index c46ce89..632043e 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -92,6 +92,7 @@
 #include "chromeos/crosapi/mojom/power.mojom.h"
 #include "chromeos/crosapi/mojom/prefs.mojom.h"
 #include "chromeos/crosapi/mojom/printing_metrics.mojom.h"
+#include "chromeos/crosapi/mojom/probe_service.mojom.h"
 #include "chromeos/crosapi/mojom/remoting.mojom.h"
 #include "chromeos/crosapi/mojom/screen_manager.mojom.h"
 #include "chromeos/crosapi/mojom/sharesheet.mojom.h"
@@ -239,7 +240,7 @@
   return {T::Uuid_, T::Version_};
 }
 
-static_assert(crosapi::mojom::Crosapi::Version_ == 92,
+static_assert(crosapi::mojom::Crosapi::Version_ == 93,
               "If you add a new crosapi, please add it to "
               "kInterfaceVersionEntries below.");
 
@@ -310,6 +311,7 @@
     MakeInterfaceVersionEntry<crosapi::mojom::Power>(),
     MakeInterfaceVersionEntry<crosapi::mojom::Prefs>(),
     MakeInterfaceVersionEntry<crosapi::mojom::PrintingMetrics>(),
+    MakeInterfaceVersionEntry<crosapi::mojom::TelemetryProbeService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::Remoting>(),
     MakeInterfaceVersionEntry<crosapi::mojom::ResourceManager>(),
     MakeInterfaceVersionEntry<crosapi::mojom::ScreenManager>(),
diff --git a/chrome/browser/ash/crostini/crostini_test_helper.cc b/chrome/browser/ash/crostini/crostini_test_helper.cc
index ed787ae5..5e10627d 100644
--- a/chrome/browser/ash/crostini/crostini_test_helper.cc
+++ b/chrome/browser/ash/crostini/crostini_test_helper.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "chromeos/ash/components/dbus/vm_launch/launch.pb.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/scoped_user_manager.h"
 
@@ -89,9 +89,9 @@
 
 void CrostiniTestHelper::ReInitializeAppServiceIntegration() {
   // Some Crostini-related tests add apps to the registry, which queues
-  // (asynchronous) icon loading requests, which depends on D-Bus. These
-  // requests are merely queued, not executed, so without further action, D-Bus
-  // can be ignored.
+  // (asynchronous) icon loading requests, which depends on the Cicerone D-Bus
+  // client. These requests are merely queued, not executed, so without further
+  // action, D-Bus can be ignored.
   //
   // Separately, the App Service is a Mojo IPC service, and explicit
   // RunUntilIdle or FlushMojoCallsForTesting calls are required to pump the
@@ -99,13 +99,13 @@
   // Those calls have a side effect of executing those icon loading requests.
   //
   // It is simpler if those RunUntilIdle calls are unconditional, so we require
-  // D-Bus to be initialized by this point regardless of whether the App Service
+  // Cicerone to be initialized by this point, whether or not the App Service
   // is enabled. Note that we can't initialize it ourselves here because once it
   // has been initialized it must be shutdown, but it can't be shutdown until
   // after the profile (and all keyed services) have been destroyed, which we
   // can't manage because we don't own the profile.
-  CHECK(chromeos::DBusThreadManager::IsInitialized())
-      << "DBusThreadManager must be initialized before calling "
+  CHECK(ash::CiceroneClient::Get())
+      << "CiceroneClient must be initialized before calling "
          "ReInitializeAppServiceIntegration";
 
   // The App Service is originally initialized when the Profile is created,
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
index 276729f6..9ca9aae 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
@@ -18,16 +18,14 @@
 #include "chrome/browser/component_updater/fake_cros_component_manager.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 
 namespace ash {
 
 DemoModeTestHelper::DemoModeTestHelper()
     : browser_process_platform_part_test_api_(
           TestingBrowserProcess::GetGlobal()->platform_part()) {
-  if (!DBusThreadManager::IsInitialized()) {
-    DBusThreadManager::Initialize();
-    dbus_thread_manager_initialized_ = true;
+  if (!ConciergeClient::Get()) {
+    concierge_client_initialized_ = true;
     ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
   }
 
@@ -42,9 +40,8 @@
 }
 
 DemoModeTestHelper::~DemoModeTestHelper() {
-  if (dbus_thread_manager_initialized_) {
+  if (concierge_client_initialized_) {
     ConciergeClient::Shutdown();
-    DBusThreadManager::Shutdown();
   }
   DemoSession::ShutDownIfInitialized();
   DemoSession::ResetDemoConfigForTesting();
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.h b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.h
index 53757fc..1774f4d 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.h
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.h
@@ -70,8 +70,8 @@
   component_updater::FakeCrOSComponentManager* fake_cros_component_manager_ =
       nullptr;
 
-  // True if this class initialized the DBusThreadManager.
-  bool dbus_thread_manager_initialized_ = false;
+  // True if this class initialized the ConciergeClient.
+  bool concierge_client_initialized_ = false;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
index 069152e0..98f81d27 100644
--- a/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
@@ -48,7 +48,6 @@
 #include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
 #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h"
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/login/login_state/login_state.h"
@@ -201,7 +200,6 @@
 
     TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
 
-    chromeos::DBusThreadManager::Initialize();
     // Use FakeUpdateEngineClient.
     ash::UpdateEngineClient::InitializeFakeForTest();
     ash::CiceroneClient::InitializeFake();
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index 46d67630..b2a0842 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -81,7 +81,6 @@
 #include "chromeos/ash/services/cros_healthd/public/cpp/fake_cros_healthd.h"
 #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
 #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/shill/shill_device_client.h"
 #include "chromeos/dbus/shill/shill_ipconfig_client.h"
@@ -884,11 +883,7 @@
     ash::KioskCryptohomeRemover::RegisterPrefs(local_state_.registry());
 
     // Use FakeUpdateEngineClient.
-    chromeos::DBusThreadManager::Initialize();
     update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest();
-    // Async tasks posted when calling `chromeos::DBusThreadManager::Initialize`
-    // need to be flushed.
-    base::RunLoop().RunUntilIdle();
 
     chromeos::CrasAudioHandler::InitializeForTesting();
     ash::UserDataAuthClient::InitializeFake();
diff --git a/chrome/browser/ash/telemetry_extension/probe_service_ash.cc b/chrome/browser/ash/telemetry_extension/probe_service_ash.cc
index a3208fe..3cd32dd4 100644
--- a/chrome/browser/ash/telemetry_extension/probe_service_ash.cc
+++ b/chrome/browser/ash/telemetry_extension/probe_service_ash.cc
@@ -7,11 +7,13 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "chrome/browser/ash/telemetry_extension/probe_service_converters.h"
 #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h"
 #include "chromeos/ash/services/cros_healthd/public/cpp/service_connection.h"
 #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace ash {
@@ -25,14 +27,16 @@
 ProbeServiceAsh::Factory* ProbeServiceAsh::Factory::test_factory_ = nullptr;
 
 // static
-std::unique_ptr<crosapi::mojom::ProbeService> ProbeServiceAsh::Factory::Create(
-    mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver) {
+std::unique_ptr<crosapi::mojom::TelemetryProbeService>
+ProbeServiceAsh::Factory::Create(
+    mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver) {
   if (test_factory_) {
     return test_factory_->CreateInstance(std::move(receiver));
   }
 
-  return base::WrapUnique<ProbeService>(
-      new ProbeServiceAsh(std::move(receiver)));
+  auto probe_service = std::make_unique<ProbeServiceAsh>();
+  probe_service->BindReceiver(std::move(receiver));
+  return probe_service;
 }
 
 // static
@@ -43,19 +47,23 @@
 
 ProbeServiceAsh::Factory::~Factory() = default;
 
-ProbeServiceAsh::ProbeServiceAsh(
-    mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver)
-    : receiver_(this, std::move(receiver)) {}
+ProbeServiceAsh::ProbeServiceAsh() = default;
 
 ProbeServiceAsh::~ProbeServiceAsh() = default;
 
+void ProbeServiceAsh::BindReceiver(
+    mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver) {
+  receivers_.Add(this, std::move(receiver));
+}
+
 void ProbeServiceAsh::ProbeTelemetryInfo(
     const std::vector<crosapi::mojom::ProbeCategoryEnum>& categories,
     ProbeTelemetryInfoCallback callback) {
   GetService()->ProbeTelemetryInfo(
       converters::ConvertCategoryVector(categories),
       base::BindOnce(
-          [](crosapi::mojom::ProbeService::ProbeTelemetryInfoCallback callback,
+          [](crosapi::mojom::TelemetryProbeService::ProbeTelemetryInfoCallback
+                 callback,
              cros_healthd::mojom::TelemetryInfoPtr ptr) {
             std::move(callback).Run(
                 converters::ConvertProbePtr(std::move(ptr)));
diff --git a/chrome/browser/ash/telemetry_extension/probe_service_ash.h b/chrome/browser/ash/telemetry_extension/probe_service_ash.h
index d548844..cc02849 100644
--- a/chrome/browser/ash/telemetry_extension/probe_service_ash.h
+++ b/chrome/browser/ash/telemetry_extension/probe_service_ash.h
@@ -11,7 +11,7 @@
 #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
 #include "chromeos/crosapi/mojom/probe_service.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
 namespace ash {
@@ -21,33 +21,35 @@
 namespace mojom = ::chromeos::cros_healthd::mojom;
 }  // namespace cros_healthd
 
-class ProbeServiceAsh : public crosapi::mojom::ProbeService {
+class ProbeServiceAsh : public crosapi::mojom::TelemetryProbeService {
  public:
   class Factory {
    public:
-    static std::unique_ptr<crosapi::mojom::ProbeService> Create(
-        mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver);
+    static std::unique_ptr<crosapi::mojom::TelemetryProbeService> Create(
+        mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver);
     static void SetForTesting(Factory* test_factory);
 
     virtual ~Factory();
 
    protected:
-    virtual std::unique_ptr<crosapi::mojom::ProbeService> CreateInstance(
-        mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver) = 0;
+    virtual std::unique_ptr<crosapi::mojom::TelemetryProbeService>
+    CreateInstance(mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService>
+                       receiver) = 0;
 
    private:
     static Factory* test_factory_;
   };
 
+  ProbeServiceAsh();
   ProbeServiceAsh(const ProbeServiceAsh&) = delete;
   ProbeServiceAsh& operator=(const ProbeServiceAsh&) = delete;
   ~ProbeServiceAsh() override;
 
- private:
-  explicit ProbeServiceAsh(
-      mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver);
+  void BindReceiver(
+      mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver);
 
-  // crosapi::mojom::ProbeService override
+ private:
+  // crosapi::mojom::TelemetryProbeService override
   void ProbeTelemetryInfo(
       const std::vector<crosapi::mojom::ProbeCategoryEnum>& categories,
       ProbeTelemetryInfoCallback callback) override;
@@ -66,7 +68,9 @@
   // interface pipe before destroying pending response callbacks owned by
   // |service_|. It is an error to drop response callbacks which still
   // correspond to an open interface pipe.
-  mojo::Receiver<crosapi::mojom::ProbeService> receiver_;
+  //
+  // Support any number of connections.
+  mojo::ReceiverSet<crosapi::mojom::TelemetryProbeService> receivers_;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/telemetry_extension/probe_service_ash_unittest.cc b/chrome/browser/ash/telemetry_extension/probe_service_ash_unittest.cc
index b549bcb..ec77e900 100644
--- a/chrome/browser/ash/telemetry_extension/probe_service_ash_unittest.cc
+++ b/chrome/browser/ash/telemetry_extension/probe_service_ash_unittest.cc
@@ -33,15 +33,15 @@
     DebugDaemonClient::Shutdown();
   }
 
-  crosapi::mojom::ProbeServiceProxy* probe_service() const {
+  crosapi::mojom::TelemetryProbeServiceProxy* probe_service() const {
     return remote_probe_service_.get();
   }
 
  private:
   base::test::TaskEnvironment task_environment_;
 
-  mojo::Remote<crosapi::mojom::ProbeService> remote_probe_service_;
-  std::unique_ptr<crosapi::mojom::ProbeService> probe_service_{
+  mojo::Remote<crosapi::mojom::TelemetryProbeService> remote_probe_service_;
+  std::unique_ptr<crosapi::mojom::TelemetryProbeService> probe_service_{
       ProbeServiceAsh::Factory::Create(
           remote_probe_service_.BindNewPipeAndPassReceiver())};
 };
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 8d0a897..d666859 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -218,7 +218,7 @@
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/browser/chromeos/extensions/telemetry/chromeos_telemetry_extensions_browser_api_provider.h"
 #endif
 
@@ -302,11 +302,11 @@
       std::make_unique<chrome_apps::ChromeAppsBrowserAPIProvider>());
   extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   extensions_browser_client_->AddAPIProvider(
       std::make_unique<
           chromeos::ChromeOSTelemetryExtensionsBrowserAPIProvider>());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 9df752d..297d79b7 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -378,7 +378,6 @@
 #include "chrome/browser/speech/tts_chromeos.h"
 #include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h"
 #include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h"
 #include "chromeos/crosapi/cpp/lacros_startup_state.h"
 #include "components/crash/core/app/breakpad_linux.h"
 #include "components/user_manager/user.h"
@@ -435,6 +434,7 @@
 #include "chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h"
 #include "chrome/browser/policy/networking/policy_cert_service.h"
 #include "chrome/browser/policy/networking/policy_cert_service_factory.h"
+#include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h"
 #include "third_party/cros_system_api/switches/chrome_switches.h"
 #endif
 
@@ -2538,8 +2538,6 @@
       autofill::switches::kShowAutofillSignatures,
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       switches::kShortMergeSessionTimeoutForTest,  // For tests only.
-      chromeos::switches::
-          kTelemetryExtensionPwaOriginOverrideForTesting,  // For tests only.
 #endif
 #if BUILDFLAG(ENABLE_EXTENSIONS)
       extensions::switches::kAllowHTTPBackgroundPage,
@@ -2562,6 +2560,8 @@
 #endif
       switches::kEnableNetBenchmarking,
 #if BUILDFLAG(IS_CHROMEOS)
+      chromeos::switches::
+          kTelemetryExtensionPwaOriginOverrideForTesting,  // For tests only.
       switches::kForceAppMode,
 #endif
 #if BUILDFLAG(ENABLE_NACL)
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 88b887f..ef92d68 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1972,22 +1972,6 @@
   }
 }
 
-// static
-api::autotest_private::LacrosMode
-AutotestPrivateGetLacrosInfoFunction::ToLacrosMode(
-    crosapi::browser_util::LacrosMode lacrosMode) {
-  switch (lacrosMode) {
-    case crosapi::browser_util::LacrosMode::kDisabled:
-      return api::autotest_private::LacrosMode::LACROS_MODE_DISABLED;
-    case crosapi::browser_util::LacrosMode::kSideBySide:
-      return api::autotest_private::LacrosMode::LACROS_MODE_SIDEBYSIDE;
-    case crosapi::browser_util::LacrosMode::kPrimary:
-      return api::autotest_private::LacrosMode::LACROS_MODE_PRIMARY;
-    case crosapi::browser_util::LacrosMode::kOnly:
-      return api::autotest_private::LacrosMode::LACROS_MODE_ONLY;
-  }
-}
-
 ExtensionFunction::ResponseAction AutotestPrivateGetLacrosInfoFunction::Run() {
   DVLOG(1) << "AutotestPrivateGetLacrosInfoFunction";
   auto* browser_manager = crosapi::BrowserManager::Get();
@@ -1997,8 +1981,6 @@
   result->SetBoolKey("isKeepAlive", browser_manager->IsKeepAliveEnabled());
   result->SetStringKey("lacrosPath",
                        browser_manager->lacros_path().MaybeAsASCII());
-  result->SetStringKey("mode", api::autotest_private::ToString(ToLacrosMode(
-                                   crosapi::browser_util::GetLacrosMode())));
   return RespondNow(
       OneArgument(base::Value::FromUniquePtrValue(std::move(result))));
 }
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
index 246620d4..3e3986bc 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -336,8 +336,6 @@
   ResponseAction Run() override;
   static api::autotest_private::LacrosState ToLacrosState(
       crosapi::BrowserManager::State state);
-  static api::autotest_private::LacrosMode ToLacrosMode(
-      crosapi::browser_util::LacrosMode lacrosMode);
 };
 
 class AutotestPrivateGetArcAppFunction : public ExtensionFunction {
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index df9b1e4..dda9156 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -1117,14 +1117,14 @@
           converted_list)));
 }
 
-FileManagerPrivateShowDlpRestrictionDetailsFunction::
-    FileManagerPrivateShowDlpRestrictionDetailsFunction() = default;
+FileManagerPrivateGetDlpRestrictionDetailsFunction::
+    FileManagerPrivateGetDlpRestrictionDetailsFunction() = default;
 
-FileManagerPrivateShowDlpRestrictionDetailsFunction::
-    ~FileManagerPrivateShowDlpRestrictionDetailsFunction() = default;
+FileManagerPrivateGetDlpRestrictionDetailsFunction::
+    ~FileManagerPrivateGetDlpRestrictionDetailsFunction() = default;
 
 ExtensionFunction::ResponseAction
-FileManagerPrivateShowDlpRestrictionDetailsFunction::Run() {
+FileManagerPrivateGetDlpRestrictionDetailsFunction::Run() {
   if (!base::FeatureList::IsEnabled(
           features::kDataLeakPreventionFilesRestriction)) {
     return RespondNow(NoArguments());
@@ -1133,17 +1133,16 @@
   policy::DlpRulesManager* rules_manager =
       policy::DlpRulesManagerFactory::GetForPrimaryProfile();
   if (!rules_manager || !rules_manager->IsFilesPolicyEnabled()) {
-    return RespondNow(NoArguments());
+    return RespondNow(OneArgument(base::Value(base::Value::Type::LIST)));
   }
 
-  using extensions::api::file_manager_private::ShowDlpRestrictionDetails::
-      Params;
+  using extensions::api::file_manager_private::GetDlpRestrictionDetails::Params;
   const std::unique_ptr<Params> params(Params::Create(args()));
   EXTENSION_FUNCTION_VALIDATE(params);
 
-  // TODO(crbug.com/1346254): Show the modal.
+  // TODO(crbug.com/1346254): Call DlpFilesController to get the details.
 
-  return RespondNow(NoArguments());
+  return RespondNow(OneArgument(base::Value(base::Value::Type::LIST)));
 }
 
 FileManagerPrivateInternalStartCopyFunction::
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
index 243e9bb..302b5498 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
@@ -340,17 +340,17 @@
   std::vector<storage::FileSystemURL> source_urls_;
 };
 
-// Implements the chrome.fileManagerPrivate.showDlpRestrictionDetails method.
-class FileManagerPrivateShowDlpRestrictionDetailsFunction
+// Implements the chrome.fileManagerPrivate.getDlpRestrictionDetails method.
+class FileManagerPrivateGetDlpRestrictionDetailsFunction
     : public LoggedExtensionFunction {
  public:
-  FileManagerPrivateShowDlpRestrictionDetailsFunction();
+  FileManagerPrivateGetDlpRestrictionDetailsFunction();
 
-  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.showDlpRestrictionDetails",
-                             FILEMANAGERPRIVATE_SHOWDLPRESTRICTIONDETAILS)
+  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getDlpRestrictionDetails",
+                             FILEMANAGERPRIVATE_GETDLPRESTRICTIONDETAILS)
 
  protected:
-  ~FileManagerPrivateShowDlpRestrictionDetailsFunction() override;
+  ~FileManagerPrivateGetDlpRestrictionDetailsFunction() override;
 
   // ExtensionFunction overrides.
   ResponseAction Run() override;
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
index 5ecfc7f..42a654b 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chromeos/ui_mode.gni")
 import("//chrome/common/chromeos/extensions/api/api_sources.gni")
 import("//chrome/common/features.gni")
 import("//extensions/buildflags/buildflags.gni")
@@ -16,14 +17,8 @@
     "api_guard_delegate.h",
     "base_telemetry_extension_api_guard_function.cc",
     "base_telemetry_extension_api_guard_function.h",
-    "diagnostics_api.cc",
-    "diagnostics_api.h",
-    "diagnostics_api_converters.cc",
-    "diagnostics_api_converters.h",
     "hardware_info_delegate.cc",
     "hardware_info_delegate.h",
-    "remote_diagnostics_service_strategy.cc",
-    "remote_diagnostics_service_strategy.h",
     "remote_probe_service_strategy.cc",
     "remote_probe_service_strategy.h",
     "telemetry_api.cc",
@@ -33,10 +28,8 @@
   ]
 
   deps = [
-    "//ash/webui/telemetry_extension_ui/mojom",
-    "//ash/webui/telemetry_extension_ui/services:telemetry_services",
     "//base",
-    "//chrome/browser/ash/telemetry_extension",
+    "//build:chromeos_buildflags",
     "//chrome/browser/extensions",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui",
@@ -51,6 +44,32 @@
     "//extensions/common",
     "//url",
   ]
+
+  if (is_chromeos_ash) {
+    sources += [
+      "diagnostics_api.cc",
+      "diagnostics_api.h",
+      "diagnostics_api_converters.cc",
+      "diagnostics_api_converters.h",
+      "remote_diagnostics_service_strategy.cc",
+      "remote_diagnostics_service_strategy.h",
+    ]
+
+    deps += [
+      "//ash/webui/telemetry_extension_ui/mojom",
+      "//ash/webui/telemetry_extension_ui/services:telemetry_services",
+      "//chrome/browser/ash/crosapi",
+      "//chrome/browser/ash/telemetry_extension",
+      "//components/user_manager",
+    ]
+  }
+
+  if (is_chromeos_lacros) {
+    deps += [
+      "//chromeos/lacros",
+      "//components/policy/core/common",
+    ]
+  }
 }
 
 function_registration("api_registration") {
@@ -72,36 +91,24 @@
   testonly = true
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
   sources = [
-    "base_telemetry_extension_api_guard_function_browsertest.cc",
     "base_telemetry_extension_browser_test.cc",
     "base_telemetry_extension_browser_test.h",
-    "diagnostics_api_browsertest.cc",
     "fake_api_guard_delegate.cc",
     "fake_api_guard_delegate.h",
     "fake_diagnostics_service.cc",
     "fake_diagnostics_service.h",
-    "fake_diagnostics_service_factory.cc",
-    "fake_diagnostics_service_factory.h",
     "fake_probe_service.cc",
     "fake_probe_service.h",
-    "fake_probe_service_factory.cc",
-    "fake_probe_service_factory.h",
     "telemetry_api_browsertest.cc",
-    "telemetry_extension_capabilities_browser_test.cc",
   ]
 
   deps = [
     ":api",
     ":fake_hardware_info_delegate",
-    "//ash/webui/telemetry_extension_ui/services:telemetry_services",
     "//base",
-    "//chrome/browser/ash/telemetry_extension",
-    "//chrome/browser/ash/wilco_dtc_supportd:mojo_utils",
     "//chrome/common/chromeos/extensions",
     "//chrome/test:test_support",
-    "//chromeos/ash/components/dbus/debug_daemon",
     "//chromeos/crosapi/mojom",
-    "//chromeos/dbus",
     "//components/user_manager",
     "//content/test:test_support",
     "//extensions:test_support",
@@ -113,24 +120,47 @@
     "//testing/gtest",
     "//url",
   ]
+
+  if (is_chromeos_ash) {
+    sources += [
+      "base_telemetry_extension_api_guard_function_browsertest.cc",
+      "diagnostics_api_browsertest.cc",
+      "fake_diagnostics_service_factory.cc",
+      "fake_diagnostics_service_factory.h",
+      "fake_probe_service_factory.cc",
+      "fake_probe_service_factory.h",
+      "telemetry_extension_capabilities_browser_test.cc",
+    ]
+
+    deps += [
+      "//chrome/browser/ash/telemetry_extension",
+      "//chrome/browser/ash/wilco_dtc_supportd:mojo_utils",
+    ]
+  }
+
+  if (is_chromeos_lacros) {
+    deps += [ "//chromeos/lacros" ]
+  }
 }
 
 source_set("unit_tests") {
   testonly = true
-  sources = [
-    "diagnostics_api_converters_unittest.cc",
-    "telemetry_api_converters_unittest.cc",
-  ]
+  sources = [ "telemetry_api_converters_unittest.cc" ]
 
   deps = [
     ":api",
-    "//ash/webui/telemetry_extension_ui/mojom",
     "//base",
     "//chrome/common/chromeos/extensions/api",
     "//chrome/test:test_support",
     "//chromeos/crosapi/mojom",
     "//testing/gtest",
   ]
+
+  if (is_chromeos_ash) {
+    sources += [ "diagnostics_api_converters_unittest.cc" ]
+
+    deps += [ "//ash/webui/telemetry_extension_ui/mojom" ]
+  }
 }
 
 # This is needed as a dependency for api_guard_delegate_unittest.cc in
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
index 4e13237..a99218d 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
@@ -11,6 +11,7 @@
 #include "base/containers/flat_set.h"
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.h"
 #include "chrome/browser/extensions/extension_management.h"
 #include "chrome/browser/profiles/profile.h"
@@ -20,13 +21,20 @@
 #include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h"
 #include "components/security_state/content/content_utils.h"
 #include "components/security_state/core/security_state.h"
-#include "components/user_manager/user.h"
-#include "components/user_manager/user_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest_handlers/externally_connectable.h"
 #include "extensions/common/url_pattern_set.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "components/policy/core/common/policy_loader_lacros.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
 namespace content {
 class BrowserContext;
 }
@@ -69,7 +77,12 @@
         std::move(callback).Run("This extension is not installed by the admin");
         return;
       }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     } else if (!IsCurrentUserOwner()) {
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    } else if (!IsCurrentUserOwner(context)) {
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
       std::move(callback).Run("This extension is not run by the device owner");
       return;
     }
@@ -94,12 +107,25 @@
   }
 
   bool IsUserAffiliated() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     return user_manager::UserManager::Get()->GetActiveUser()->IsAffiliated();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    return policy::PolicyLoaderLacros::IsMainUserAffiliated();
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
   }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   bool IsCurrentUserOwner() {
     return user_manager::UserManager::Get()->IsCurrentUserOwner();
   }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  bool IsCurrentUserOwner(content::BrowserContext* context) {
+    return Profile::FromBrowserContext(context)->IsMainProfile();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
   bool IsPwaUiOpenAndSecure(content::BrowserContext* context,
                             const extensions::Extension* extension) {
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
index 50b54035..07f4e915a 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
@@ -7,15 +7,12 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/test/test_future.h"
-#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/fake_hardware_info_delegate.h"
 #include "chrome/browser/extensions/extension_management_test_util.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
-#include "components/account_id/account_id.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "components/user_manager/scoped_user_manager.h"
-#include "components/user_manager/user.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/ssl_status.h"
 #include "extensions/common/extension.h"
@@ -28,6 +25,19 @@
 #include "net/test/test_data_directory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "components/account_id/account_id.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "components/user_manager/user.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/crosapi/mojom/crosapi.mojom.h"
+#include "chromeos/startup/browser_init_params.h"
+#include "components/policy/core/common/policy_loader_lacros.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
 namespace chromeos {
 
 struct ExtensionInfoTestParams {
@@ -98,13 +108,21 @@
     // Make sure device manufacturer is allowlisted.
     SetDeviceManufacturer(manufacturer());
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     auto user_manager = std::make_unique<ash::FakeChromeUserManager>();
     scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
         std::move(user_manager));
     AddUserAndLogIn();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    profile()->SetIsMainProfile(true);
+    ASSERT_TRUE(profile()->IsMainProfile());
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
   }
 
   void TearDown() override {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     // Explicitly removing the user is required; otherwise ProfileHelper keeps a
     // dangling pointer to the User.
     // TODO(b/208629291): Consider removing all users from ProfileHelper in the
@@ -112,6 +130,7 @@
     GetFakeUserManager()->RemoveUserFromList(
         GetFakeUserManager()->GetActiveUser()->GetAccountId());
     scoped_user_manager_.reset();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
     BrowserWithTestWindowTest::TearDown();
   }
@@ -125,13 +144,14 @@
 
   std::string manufacturer() const { return GetParam().manufacturer; }
 
+  const extensions::Extension* extension() { return extension_.get(); }
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   ash::FakeChromeUserManager* GetFakeUserManager() const {
     return static_cast<ash::FakeChromeUserManager*>(
         user_manager::UserManager::Get());
   }
 
-  const extensions::Extension* extension() { return extension_.get(); }
-
   virtual void AddUserAndLogIn() {
     auto* const user_manager = GetFakeUserManager();
     // Make sure the current user is affiliated.
@@ -141,6 +161,7 @@
     user_manager->SwitchActiveUser(account_id);
     user_manager->SetOwnerId(account_id);
   }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   void SetDeviceManufacturer(std::string manufacturer) {
     hardware_info_delegate_factory_ =
@@ -188,14 +209,24 @@
   scoped_refptr<const extensions::Extension> extension_;
   std::unique_ptr<HardwareInfoDelegate::Factory>
       hardware_info_delegate_factory_;
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 
 TEST_P(ApiGuardDelegateTest, CurrentUserNotOwner) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   auto* const user_manager = GetFakeUserManager();
   // Make sure the current user is not the device owner.
   const AccountId regular_user = AccountId::FromUserEmail("regular@gmail.com");
   user_manager->SetOwnerId(regular_user);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  profile()->SetIsMainProfile(false);
+  ASSERT_FALSE(profile()->IsMainProfile());
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
   auto api_guard_delegate = ApiGuardDelegate::Factory::Create();
   base::test::TestFuture<std::string> future;
@@ -266,7 +297,20 @@
   ApiGuardDelegateAffiliatedUserTest() = default;
   ~ApiGuardDelegateAffiliatedUserTest() override = default;
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  void SetUp() override {
+    ApiGuardDelegateTest::SetUp();
+
+    // Make sure the main user is affiliated.
+    auto init_params = crosapi::mojom::BrowserInitParams::New();
+    init_params->session_type = crosapi::mojom::SessionType::kPublicSession;
+    chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
+    ASSERT_TRUE(policy::PolicyLoaderLacros::IsMainUserAffiliated());
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
  protected:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   void AddUserAndLogIn() override {
     auto* const user_manager = GetFakeUserManager();
     // Make sure the current user is affiliated.
@@ -275,6 +319,7 @@
     user_manager->LoginUser(account_id);
     user_manager->SwitchActiveUser(account_id);
   }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 
 TEST_P(ApiGuardDelegateAffiliatedUserTest, ExtensionNotForceInstalled) {
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.cc b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.cc
index 03d77e8..3b9393b20 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.cc
@@ -39,6 +39,15 @@
     return;
   }
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!IsCrosApiAvailable()) {
+    error = "Not supported by ash browser";
+    Respond(Error(
+        base::StringPrintf("API chrome.%s failed. %s", name(), error.c_str())));
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   RunIfAllowed();
 }
 
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.h b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.h
index e32f4fb5..9f63597 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.h"
 #include "extensions/browser/extension_function.h"
 
@@ -33,6 +34,10 @@
 
   virtual void RunIfAllowed() = 0;
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  virtual bool IsCrosApiAvailable() = 0;
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
  private:
   void OnCanAccessApi(std::string error);
 
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
index 1141c08..d147e91 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
@@ -6,16 +6,13 @@
 #include <string>
 
 #include "base/strings/string_util.h"
-#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/fake_api_guard_delegate.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/fake_hardware_info_delegate.h"
 #include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/user_manager/scoped_user_manager.h"
-#include "components/user_manager/user.h"
-#include "components/user_manager/user_manager.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/content_mock_cert_verifier.h"
 #include "net/base/net_errors.h"
@@ -25,6 +22,13 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 namespace chromeos {
 
 namespace {
@@ -367,9 +371,11 @@
 
     mock_cert_verifier()->set_default_result(net::OK);
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     // Must be initialized before dealing with UserManager.
     user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
         std::make_unique<ash::FakeChromeUserManager>());
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
     https_server_.StartAcceptingConnections();
 
@@ -380,6 +386,7 @@
     host_resolver()->AddRule("*", "127.0.0.1");
   }
   void TearDownOnMainThread() override {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     // Explicitly removing the user is required; otherwise ProfileHelper keeps
     // a dangling pointer to the User.
     // TODO(b/208629291): Consider removing all users from ProfileHelper in the
@@ -387,6 +394,7 @@
     GetFakeUserManager()->RemoveUserFromList(
         GetFakeUserManager()->GetActiveUser()->GetAccountId());
     user_manager_enabler_.reset();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
     ASSERT_TRUE(https_server_.ShutdownAndWaitUntilComplete());
 
@@ -410,10 +418,12 @@
   }
 
  protected:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   ash::FakeChromeUserManager* GetFakeUserManager() const {
     return static_cast<ash::FakeChromeUserManager*>(
         user_manager::UserManager::Get());
   }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   GURL GetPwaGURL() const { return https_server_.GetURL("/ssl/google.html"); }
 
@@ -422,14 +432,19 @@
   std::string matches_origin() const override { return GetPwaGURL().spec(); }
 
   FakeHardwareInfoDelegate::Factory fake_hardware_info_delegate_factory_;
-  std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
   net::EmbeddedTestServer https_server_;
   content::ContentMockCertVerifier mock_cert_verifier_;
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 
 // Smoke test to verify that real ApiGuardDelegate works in prod.
+// TODO(b/219514064): Make an equivalent test for Lacros.
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionApiGuardRealDelegateBrowserTest,
                        CanAccessRunBatteryCapacityRoutine) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   // Add a new user and make it owner.
   auto* const user_manager = GetFakeUserManager();
   const AccountId account_id = AccountId::FromUserEmail("user@example.com");
@@ -437,6 +452,7 @@
   user_manager->LoginUser(account_id);
   user_manager->SwitchActiveUser(account_id);
   user_manager->SetOwnerId(account_id);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   // Make sure PWA UI is open and secure.
   auto* pwa_page_rfh =
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc
index 7c80b4a6..b17af22 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc
@@ -18,13 +18,14 @@
 namespace chromeos {
 
 FakeProbeService::FakeProbeService() : receiver_(this) {}
+
 FakeProbeService::~FakeProbeService() {
   // Assert on the expectations.
   EXPECT_EQ(actual_requested_categories_, expected_requested_categories_);
 }
 
 void FakeProbeService::BindPendingReceiver(
-    mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver) {
+    mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver) {
   receiver_.Bind(std::move(receiver));
 }
 
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h
index 4f899db..2f38b5b 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h
@@ -14,7 +14,7 @@
 
 namespace chromeos {
 
-class FakeProbeService : public crosapi::mojom::ProbeService {
+class FakeProbeService : public crosapi::mojom::TelemetryProbeService {
  public:
   FakeProbeService();
   FakeProbeService(const FakeProbeService&) = delete;
@@ -22,9 +22,9 @@
   ~FakeProbeService() override;
 
   void BindPendingReceiver(
-      mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver);
+      mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver);
 
-  // crosapi::mojom::ProbeService overrides.
+  // crosapi::mojom::TelemetryProbeService overrides.
   void ProbeTelemetryInfo(
       const std::vector<crosapi::mojom::ProbeCategoryEnum>& categories,
       ProbeTelemetryInfoCallback callback) override;
@@ -44,7 +44,7 @@
           expected_requested_categories);
 
  private:
-  mojo::Receiver<crosapi::mojom::ProbeService> receiver_;
+  mojo::Receiver<crosapi::mojom::TelemetryProbeService> receiver_;
 
   // Response for a call to |ProbeTelemetryInfo|.
   crosapi::mojom::ProbeTelemetryInfoPtr telem_info_{
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc
index 714aac9c..6adc0aa 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc
@@ -20,9 +20,9 @@
   fake_service_ = std::move(fake_service);
 }
 
-std::unique_ptr<crosapi::mojom::ProbeService>
+std::unique_ptr<crosapi::mojom::TelemetryProbeService>
 FakeProbeServiceFactory::CreateInstance(
-    mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver) {
+    mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver) {
   fake_service_->BindPendingReceiver(std::move(receiver));
   return std::move(fake_service_);
 }
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h
index 821fb969..779b4ce4 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h
@@ -24,8 +24,9 @@
 
  protected:
   // ProbeServiceAsh::Factory:
-  std::unique_ptr<crosapi::mojom::ProbeService> CreateInstance(
-      mojo::PendingReceiver<crosapi::mojom::ProbeService> receiver) override;
+  std::unique_ptr<crosapi::mojom::TelemetryProbeService> CreateInstance(
+      mojo::PendingReceiver<crosapi::mojom::TelemetryProbeService> receiver)
+      override;
 
  private:
   std::unique_ptr<FakeProbeService> fake_service_;
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.cc b/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.cc
index 9d82d13..f58ae334 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.cc
@@ -14,6 +14,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
+#include "base/system/sys_info.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h"
@@ -48,7 +49,7 @@
       base::BindOnce(&GetManufacturerFromSysfsSync), std::move(callback));
 }
 
-// Callback from ProbeTelemetryService::ProbeTelemetryInfo().
+// Callback from ProbeServiceAsh::ProbeTelemetryInfo().
 std::string OnGetSystemInfo(crosapi::mojom::ProbeTelemetryInfoPtr ptr) {
   if (!ptr || !ptr->system_result || !ptr->system_result->is_system_info()) {
     return "";
@@ -87,23 +88,23 @@
     : remote_probe_service_strategy_(RemoteProbeServiceStrategy::Create()) {}
 HardwareInfoDelegate::~HardwareInfoDelegate() = default;
 
-mojo::Remote<crosapi::mojom::ProbeService>&
-HardwareInfoDelegate::GetRemoteService() {
-  return remote_probe_service_strategy_->GetRemoteService();
-}
-
 // GetManufacturer tries to get the manufacturer (or OEM name) from
-// ProbeTelemetryService[1] first. If no (or empty) information is returned,
+// ProbeServiceAsh[1] first. If no (or empty) information is returned,
 // GetManufacturer falls back to SysInfo[2].
-// [1] ProbeTelemetryService fetches the OEM name from cros_config.
+// [1] ProbeServiceAsh fetches the OEM name from cros_config.
 // [2] SysInfo fetches the manufacturer information from the
 // "/sys/devices/virtual/dmi/id/sys_vendor" system file.
 void HardwareInfoDelegate::GetManufacturer(ManufacturerCallback done_cb) {
   auto fallback = base::BindOnce(&HardwareInfoDelegate::FallbackHandler,
                                  base::Unretained(this), std::move(done_cb));
-  auto cb = base::BindOnce(&OnGetSystemInfo).Then(std::move(fallback));
-  GetRemoteService()->ProbeTelemetryInfo(
-      {crosapi::mojom::ProbeCategoryEnum::kSystem}, std::move(cb));
+
+  if (remote_probe_service_strategy_) {
+    auto cb = base::BindOnce(&OnGetSystemInfo).Then(std::move(fallback));
+    remote_probe_service_strategy_->GetRemoteService()->ProbeTelemetryInfo(
+        {crosapi::mojom::ProbeCategoryEnum::kSystem}, std::move(cb));
+  } else {
+    std::move(fallback).Run("");
+  }
 }
 
 void HardwareInfoDelegate::FallbackHandler(ManufacturerCallback done_cb,
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.h b/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.h
index 5cc72a6..90e15ca5 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/hardware_info_delegate.h
@@ -48,8 +48,6 @@
   void FallbackHandler(ManufacturerCallback done_cb,
                        std::string probe_service_result);
 
-  mojo::Remote<crosapi::mojom::ProbeService>& GetRemoteService();
-
   std::unique_ptr<RemoteProbeServiceStrategy> remote_probe_service_strategy_;
 };
 
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.cc b/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.cc
index 7465aab..b2ac1c72 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.cc
@@ -32,14 +32,15 @@
   ~RemoteProbeServiceStrategyAsh() override = default;
 
   // RemoteProbeServiceStrategy override:
-  mojo::Remote<crosapi::mojom::ProbeService>& GetRemoteService() override {
+  mojo::Remote<crosapi::mojom::TelemetryProbeService>& GetRemoteService()
+      override {
     return remote_probe_service_;
   }
 
  private:
-  mojo::Remote<crosapi::mojom::ProbeService> remote_probe_service_;
+  mojo::Remote<crosapi::mojom::TelemetryProbeService> remote_probe_service_;
 
-  std::unique_ptr<crosapi::mojom::ProbeService> probe_service_;
+  std::unique_ptr<crosapi::mojom::TelemetryProbeService> probe_service_;
 };
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -51,8 +52,10 @@
   ~RemoteProbeServiceStrategyLacros() override = default;
 
   // RemoteProbeServiceStrategy override:
-  mojo::Remote<ash::mojom::ProbeService>& GetRemoteService() override {
-    return LacrosService::Get()->GetRemote<crosapi::mojom::ProbeService>();
+  mojo::Remote<crosapi::mojom::TelemetryProbeService>& GetRemoteService()
+      override {
+    return LacrosService::Get()
+        ->GetRemote<crosapi::mojom::TelemetryProbeService>();
   }
 };
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -66,6 +69,10 @@
   return std::make_unique<RemoteProbeServiceStrategyAsh>();
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!LacrosService::Get()
+           ->IsAvailable<crosapi::mojom::TelemetryProbeService>()) {
+    return nullptr;
+  }
   return std::make_unique<RemoteProbeServiceStrategyLacros>();
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 }
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h b/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h
index 7744bfc..de24b0a8 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h
@@ -25,7 +25,8 @@
       delete;
   virtual ~RemoteProbeServiceStrategy();
 
-  virtual mojo::Remote<crosapi::mojom::ProbeService>& GetRemoteService() = 0;
+  virtual mojo::Remote<crosapi::mojom::TelemetryProbeService>&
+  GetRemoteService() = 0;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.cc b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.cc
index 9df3333..9df2d18 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/values.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_converters.h"
 #include "chrome/common/chromeos/extensions/api/telemetry.h"
@@ -27,11 +28,18 @@
 
 TelemetryApiFunctionBase::~TelemetryApiFunctionBase() = default;
 
-mojo::Remote<crosapi::mojom::ProbeService>&
+mojo::Remote<crosapi::mojom::TelemetryProbeService>&
 TelemetryApiFunctionBase::GetRemoteService() {
+  DCHECK(remote_probe_service_strategy_);
   return remote_probe_service_strategy_->GetRemoteService();
 }
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+bool TelemetryApiFunctionBase::IsCrosApiAvailable() {
+  return remote_probe_service_strategy_ != nullptr;
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
 // OsTelemetryGetBatteryInfoFunction -------------------------------------------
 
 OsTelemetryGetBatteryInfoFunction::OsTelemetryGetBatteryInfoFunction() =
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.h b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.h
index e7d7ae6..84d23a9 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/remote_probe_service_strategy.h"
 #include "chromeos/crosapi/mojom/probe_service.mojom.h"
@@ -26,7 +27,11 @@
  protected:
   ~TelemetryApiFunctionBase() override;
 
-  mojo::Remote<crosapi::mojom::ProbeService>& GetRemoteService();
+  mojo::Remote<crosapi::mojom::TelemetryProbeService>& GetRemoteService();
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  bool IsCrosApiAvailable() override;
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
  private:
   std::unique_ptr<RemoteProbeServiceStrategy> remote_probe_service_strategy_;
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc
index c04dff44..daa92d1 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc
@@ -6,20 +6,32 @@
 #include <string>
 #include <utility>
 
-#include "chrome/browser/ash/telemetry_extension/probe_service_ash.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h"
 #include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h"
-#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/telemetry_extension/probe_service_ash.h"
+#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/crosapi/mojom/probe_service.mojom.h"
+#include "chromeos/lacros/lacros_service.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
 namespace chromeos {
 
 class TelemetryExtensionTelemetryApiBrowserTest
     : public BaseTelemetryExtensionBrowserTest {
  public:
   TelemetryExtensionTelemetryApiBrowserTest() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     ash::ProbeServiceAsh::Factory::SetForTesting(&fake_probe_factory_);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   }
   ~TelemetryExtensionTelemetryApiBrowserTest() override = default;
 
@@ -29,17 +41,149 @@
       const TelemetryExtensionTelemetryApiBrowserTest&) = delete;
 
  protected:
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // Returns whether the Probe interface is available. It may
+  // not be available on earlier versions of ash-chrome.
+  bool IsServiceAvailable() const {
+    chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get();
+    return lacros_service &&
+           lacros_service->IsAvailable<crosapi::mojom::TelemetryProbeService>();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   void SetServiceForTesting(
       std::unique_ptr<FakeProbeService> fake_probe_service_impl) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     fake_probe_factory_.SetCreateInstanceResponse(
         std::move(fake_probe_service_impl));
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    // Replace the production Probe service with a mock for testing.
+    mojo::Remote<crosapi::mojom::TelemetryProbeService>& remote =
+        chromeos::LacrosService::Get()
+            ->GetRemote<crosapi::mojom::TelemetryProbeService>();
+    remote.reset();
+    fake_probe_service_impl->BindPendingReceiver(
+        remote.BindNewPipeAndPassReceiver());
+    fake_probe_service_impl_ = std::move(fake_probe_service_impl);
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
   }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   FakeProbeServiceFactory fake_probe_factory_;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  std::unique_ptr<FakeProbeService> fake_probe_service_impl_;
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 };
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
-                       GetBatteryInfo_Error) {
+                       LacrosServiceNotAvailableError) {
+  // If Probe interface is available on this version of ash-chrome, this test
+  // suite will no-op.
+  if (IsServiceAvailable()) {
+    return;
+  }
+
+  std::string service_worker = R"(
+    const tests = [
+      // Telemetry APIs.
+      async function getBatteryInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getBatteryInfo(),
+            'Error: API chrome.os.telemetry.getBatteryInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getCpuInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getCpuInfo(),
+            'Error: API chrome.os.telemetry.getCpuInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getMemoryInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getMemoryInfo(),
+            'Error: API chrome.os.telemetry.getMemoryInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getOemData() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getOemData(),
+            'Error: API chrome.os.telemetry.getOemData failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getOsVersionInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getOsVersionInfo(),
+            'Error: API ' +
+            'chrome.os.telemetry.getOsVersionInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getStatefulPartitionInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getStatefulPartitionInfo(),
+            'Error: API ' +
+            'chrome.os.telemetry.getStatefulPartitionInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+      async function getVpdInfo() {
+        await chrome.test.assertPromiseRejects(
+            chrome.os.telemetry.getVpdInfo(),
+            'Error: API chrome.os.telemetry.getVpdInfo failed. ' +
+            'Not supported by ash browser'
+        );
+        chrome.test.succeed();
+      },
+    ];
+
+    chrome.test.runTests([
+      async function allAPIsTested() {
+        getTestNames = function(arr) {
+          return arr.map(item => item.name);
+        }
+        getMethods = function(obj) {
+          return Object.getOwnPropertyNames(obj).filter(
+            item => typeof obj[item] === 'function');
+        }
+        apiNames = [
+          ...getMethods(chrome.os.telemetry),
+        ];
+        chrome.test.assertEq(getTestNames(tests), apiNames);
+        chrome.test.succeed();
+      },
+      ...tests
+    ]);
+  )";
+
+  CreateExtensionAndRunServiceWorker(service_worker);
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
+IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
+                       GetBatteryInfo_ApiInternalError) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -64,6 +208,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetBatteryInfo_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -136,6 +288,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetCpuInfo_Error) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -160,6 +320,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetCpuInfo_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -292,6 +460,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetMemoryInfo_Error) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -316,6 +492,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetMemoryInfo_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -361,6 +545,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetOemDataWithSerialNumberPermission_Error) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -382,6 +574,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetOemDataWithSerialNumberPermission_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -407,6 +607,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetOsVersionInfo_Error) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -431,6 +639,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetOsVersionInfo_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -479,6 +695,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetVpdInfoError) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -503,6 +727,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetVpdInfoWithSerialNumberPermission) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -542,6 +774,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetStatefulPartitionInfo_Error) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -566,6 +806,14 @@
 
 IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest,
                        GetStatefulPartitionInfo_Success) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -648,6 +896,14 @@
 IN_PROC_BROWSER_TEST_F(
     TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest,
     GetBatteryInfoWithoutSerialNumberPermission) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
@@ -721,6 +977,14 @@
 IN_PROC_BROWSER_TEST_F(
     TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest,
     GetOemDataWithoutSerialNumberPermission) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto fake_service_impl = std::make_unique<FakeProbeService>();
@@ -744,6 +1008,14 @@
 IN_PROC_BROWSER_TEST_F(
     TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest,
     GetVpdInfoWithoutSerialNumberPermission) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // If Probe interface is not available on this version of ash-chrome, this
+  // test suite will no-op.
+  if (!IsServiceAvailable()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Configure FakeProbeService.
   {
     auto telemetry_info = crosapi::mojom::ProbeTelemetryInfo::New();
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc
index de82334..5ec1a022 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc
@@ -74,10 +74,8 @@
 
 constexpr char kExampleUrl[] = "https://example.com";
 constexpr char kSrcPattern[] = "example.com";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 constexpr char kLabel[] = "label";
 const std::u16string kApplicationTitle = u"example.com";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }  // namespace
 
 class DlpContentManagerBrowserTest : public InProcessBrowserTest {
@@ -547,9 +545,14 @@
       display_service_tester.GetNotification(kPrintBlockedNotificationId));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// TODO(crbug.com/1262948): Enable and modify for lacros.
-IN_PROC_BROWSER_TEST_F(DlpContentManagerReportingBrowserTest, PrintingWarned) {
+// Test is flaky on Lacros: https://crbug.com/1344827
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#define MAYBE_PrintingWarned DISABLED_PrintingWarned
+#else
+#define MAYBE_PrintingWarned PrintingWarned
+#endif
+IN_PROC_BROWSER_TEST_F(DlpContentManagerReportingBrowserTest,
+                       MAYBE_PrintingWarned) {
   SetupDlpRulesManager();
   SetupReportQueue();
   NotificationDisplayServiceTester display_service_tester(browser()->profile());
@@ -602,8 +605,14 @@
   EXPECT_EQ(helper_->ActiveWarningDialogsCount(), 0);
 }
 
+// Test is flaky on Lacros: https://crbug.com/1344827
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#define MAYBE_TabShareWarnedDuringAllowed DISABLED_TabShareWarnedDuringAllowed
+#else
+#define MAYBE_TabShareWarnedDuringAllowed TabShareWarnedDuringAllowed
+#endif
 IN_PROC_BROWSER_TEST_F(DlpContentManagerReportingBrowserTest,
-                       TabShareWarnedDuringAllowed) {
+                       MAYBE_TabShareWarnedDuringAllowed) {
   SetupReporting();
   NotificationDisplayServiceTester display_service_tester(browser()->profile());
 
@@ -663,6 +672,4 @@
   EXPECT_EQ(events_.size(), 2u);
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 }  // namespace policy
diff --git a/chrome/browser/device_reauth/chrome_biometric_authenticator_factory.cc b/chrome/browser/device_reauth/chrome_biometric_authenticator_factory.cc
index e5ba4b7e..3c9d6a8 100644
--- a/chrome/browser/device_reauth/chrome_biometric_authenticator_factory.cc
+++ b/chrome/browser/device_reauth/chrome_biometric_authenticator_factory.cc
@@ -9,6 +9,8 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/device_reauth/android/biometric_authenticator_android.h"
 #include "chrome/browser/device_reauth/android/biometric_authenticator_bridge_impl.h"
+#elif BUILDFLAG(IS_MAC)
+#include "chrome/browser/device_reauth/mac/biometric_authenticator_mac.h"
 #endif
 
 // static
@@ -33,6 +35,8 @@
         (new BiometricAuthenticatorAndroid(
              std::make_unique<BiometricAuthenticatorBridgeImpl>()))
             ->GetWeakPtr();
+#elif BUILDFLAG(IS_MAC)
+    biometric_authenticator_ = (new BiometricAuthenticatorMac())->GetWeakPtr();
 #else
     NOTREACHED();
 #endif
diff --git a/chrome/browser/device_reauth/mac/BUILD.gn b/chrome/browser/device_reauth/mac/BUILD.gn
deleted file mode 100644
index f24fafb..0000000
--- a/chrome/browser/device_reauth/mac/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2022 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.
-
-source_set("biometric_authentication") {
-  sources = [
-    "biometric_authenticator_mac.h",
-    "biometric_authenticator_mac.mm",
-  ]
-  deps = [
-    "//base",
-    "//components/device_reauth",
-    "//device/fido",
-  ]
-}
diff --git a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h
index 98f83fd..94832f4f 100644
--- a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h
+++ b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_
 #define CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_
 
+#include "chrome/browser/device_reauth/chrome_biometric_authenticator_common.h"
+#include "chrome/browser/device_reauth/chrome_biometric_authenticator_factory.h"
 #include "components/device_reauth/biometric_authenticator.h"
 
 namespace device {
@@ -15,10 +17,8 @@
 }  // namespace fido
 }  // namespace device
 
-class BiometricAuthenticatorMac : public device_reauth::BiometricAuthenticator {
+class BiometricAuthenticatorMac : public ChromeBiometricAuthenticatorCommon {
  public:
-  BiometricAuthenticatorMac();
-
   // Returns true, when biometrics are available and also the device screen lock
   // is setup, false otherwise.
   bool CanAuthenticate(
@@ -49,11 +49,13 @@
   void Cancel(device_reauth::BiometricAuthRequester requester) override;
 
  private:
+  friend class ChromeBiometricAuthenticatorFactory;
+  BiometricAuthenticatorMac();
   ~BiometricAuthenticatorMac() override;
 
   // TouchId authenticator object that will handle biometric authentication
   // itself
-  std::unique_ptr<device::fido::mac::TouchIdContext> touchIdAuthObject_;
+  std::unique_ptr<device::fido::mac::TouchIdContext> touch_id_auth_context_;
 };
 
-#endif  // CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_
\ No newline at end of file
+#endif  // CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_
diff --git a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm
index f124927..978084d2 100644
--- a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm
+++ b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm
@@ -4,13 +4,13 @@
 
 #include "chrome/browser/device_reauth/mac/biometric_authenticator_mac.h"
 
+#include "base/bind.h"
+#include "base/callback.h"
 #include "base/notreached.h"
 #include "components/device_reauth/biometric_authenticator.h"
 #include "device/fido/mac/touch_id_context.h"
 
-BiometricAuthenticatorMac::BiometricAuthenticatorMac() {
-  touchIdAuthObject_ = device::fido::mac::TouchIdContext::Create();
-}
+BiometricAuthenticatorMac::BiometricAuthenticatorMac() = default;
 
 BiometricAuthenticatorMac::~BiometricAuthenticatorMac() = default;
 
@@ -36,5 +36,19 @@
     device_reauth::BiometricAuthRequester requester,
     const std::u16string message,
     AuthenticateCallback callback) {
-  this->touchIdAuthObject_->PromptTouchId(message, std::move(callback));
-}
\ No newline at end of file
+  if (!NeedsToAuthenticate()) {
+    std::move(callback).Run(/*success=*/true);
+    return;
+  }
+
+  // TODO(crbug.com/1350994): Clean the touchIdContext object after
+  // authentication is done.
+  touch_id_auth_context_ = device::fido::mac::TouchIdContext::Create();
+  base::OnceCallback<bool(bool)> record_authentication_result =
+      base::BindOnce(&BiometricAuthenticatorMac::RecordAuthenticationResult,
+                     base::Unretained(this));
+
+  touch_id_auth_context_->PromptTouchId(
+      message,
+      std::move(record_authentication_result).Then(std::move(callback)));
+}
diff --git a/chrome/browser/device_reauth/mac/biometric_authenticator_mac_unittest.mm b/chrome/browser/device_reauth/mac/biometric_authenticator_mac_unittest.mm
new file mode 100644
index 0000000..f055d60
--- /dev/null
+++ b/chrome/browser/device_reauth/mac/biometric_authenticator_mac_unittest.mm
@@ -0,0 +1,142 @@
+// Copyright 2022 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/device_reauth/mac/biometric_authenticator_mac.h"
+
+#include "chrome/browser/device_reauth/chrome_biometric_authenticator_factory.h"
+
+#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/mock_callback.h"
+#include "base/test/task_environment.h"
+#include "components/password_manager/core/browser/password_access_authenticator.h"
+#include "device/fido/mac/scoped_touch_id_test_environment.h"
+#include "device/fido/mac/touch_id_context.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+using MockAuthResultCallback =
+    base::MockCallback<BiometricAuthenticatorMac::AuthenticateCallback>;
+
+using device_reauth::BiometricAuthRequester;
+using password_manager::PasswordAccessAuthenticator;
+
+}  // namespace
+
+class BiometricAuthenticatorMacTest : public testing::Test {
+ public:
+  device_reauth::BiometricAuthenticator* authenticator() {
+    return authenticator_.get();
+  }
+
+  base::test::TaskEnvironment& task_environment() { return task_environment_; }
+
+  device::fido::mac::ScopedTouchIdTestEnvironment* touch_id_enviroment() {
+    return &touch_id_test_environment_;
+  }
+
+  MockAuthResultCallback& result_callback() { return result_callback_; }
+
+ private:
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  scoped_refptr<device_reauth::BiometricAuthenticator> authenticator_ =
+      ChromeBiometricAuthenticatorFactory::GetInstance()
+          ->GetOrCreateBiometricAuthenticator();
+  device::fido::mac::AuthenticatorConfig config_{
+      .keychain_access_group = "test-keychain-access-group",
+      .metadata_secret = "TestMetadataSecret"};
+  device::fido::mac::ScopedTouchIdTestEnvironment touch_id_test_environment_{
+      config_};
+  MockAuthResultCallback result_callback_;
+};
+
+// If time that passed since the last successful authentication is smaller than
+// kAuthValidityPeriod, no reauthentication is needed.
+TEST_F(BiometricAuthenticatorMacTest, NoReauthenticationIfLessThan60Seconds) {
+  touch_id_enviroment()->SimulateTouchIdPromptSuccess();
+  EXPECT_CALL(result_callback(), Run(/*success=*/true));
+
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList, /*message=*/u"",
+      result_callback().Get());
+
+  // Make the next touch ID prompt auth fail.
+  touch_id_enviroment()->SimulateTouchIdPromptFailure();
+  // But since the delay is smaller than kAuthValidityPeriod there shouldn't be
+  // another prompt, so the auth should be reported as successful.
+  task_environment().FastForwardBy(
+      PasswordAccessAuthenticator::kAuthValidityPeriod / 2);
+
+  EXPECT_CALL(result_callback(), Run(/*success=*/true));
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList,
+      /*message=*/u"Chrome is trying to show passwords.",
+      result_callback().Get());
+
+  // ScopedTouchIdTestEnvironment requires the test to use an instance of the
+  // context after calling to simulate a successful/failed auth. In this test,
+  // because of kAuthValidityPeriod no new authenticator will be created so the
+  // useless dummy one is created instead.
+  device::fido::mac::TouchIdContext::Create();
+}
+
+// If the time since the last reauthentication is greater than
+// kAuthValidityPeriod or the authentication failed, reauthentication is needed.
+TEST_F(BiometricAuthenticatorMacTest, ReauthenticationIfMoreThan60Seconds) {
+  touch_id_enviroment()->SimulateTouchIdPromptSuccess();
+  EXPECT_CALL(result_callback(), Run(/*success=*/true));
+
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList,
+      /*message=*/u"Chrome is trying to show passwords.",
+      result_callback().Get());
+
+  // Make the next touch ID prompt auth fail.
+  touch_id_enviroment()->SimulateTouchIdPromptFailure();
+  // Since the delay is bigger than kAuthValidityPeriod, the previous auth has
+  // expired. Thus a new prompt will be requested which should fail the
+  // authentication.
+  task_environment().FastForwardBy(
+      PasswordAccessAuthenticator::kAuthValidityPeriod * 2);
+
+  EXPECT_CALL(result_callback(), Run(/*success=*/false));
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList,
+      /*message=*/u"Chrome is trying to show passwords.",
+      result_callback().Get());
+}
+
+// If prevoius authentication failed kAuthValidityPeriod isn't started and
+// rauthentication will be needed.
+TEST_F(BiometricAuthenticatorMacTest, ReauthenticationIfPreviousFailed) {
+  touch_id_enviroment()->SimulateTouchIdPromptFailure();
+
+  // First authetication failes, no last_good_auth_timestamp_ should be
+  // recorded, which fill force reauthentication.
+  EXPECT_CALL(result_callback(), Run(/*success=*/false));
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList,
+      /*message=*/u"Chrome is trying to show passwords.",
+      result_callback().Get());
+
+  // Although it passed less than kAuthValidityPeriod no valid authenticaion
+  // should be recorded as pormptTouchId will fail.
+  touch_id_enviroment()->SimulateTouchIdPromptFailure();
+  task_environment().FastForwardBy(
+      PasswordAccessAuthenticator::kAuthValidityPeriod / 2);
+
+  EXPECT_CALL(result_callback(), Run(/*success=*/false));
+  authenticator()->AuthenticateWithMessage(
+      // TODO(crbug.com/1350393): Change requester to Mac specific.
+      BiometricAuthRequester::kAllPasswordsList,
+      /*message=*/u"Chrome is trying to show passwords.",
+      result_callback().Get());
+}
diff --git a/chrome/browser/extensions/api/mdns/mdns_api.cc b/chrome/browser/extensions/api/mdns/mdns_api.cc
index 4172338..9df6894 100644
--- a/chrome/browser/extensions/api/mdns/mdns_api.cc
+++ b/chrome/browser/extensions/api/mdns/mdns_api.cc
@@ -10,12 +10,14 @@
 #include "base/lazy_instance.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "components/version_info/channel.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_function.h"
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/common/features/feature_channel.h"
 #include "extensions/common/mojom/event_dispatcher.mojom.h"
 
 namespace extensions {
@@ -198,8 +200,14 @@
       ExtensionRegistry::Get(browser_context_)
           ->enabled_extensions()
           .GetByID(extension_id);
-  return (extension && (extension->is_platform_app() ||
-                        IsServiceTypeAllowlisted(service_type)));
+  if (!extension)
+    return false;
+
+  if (GetCurrentChannel() == version_info::Channel::DEV &&
+      extension->is_extension()) {
+    return true;
+  }
+  return extension->is_platform_app() || IsServiceTypeAllowlisted(service_type);
 }
 
 void MDnsAPI::GetValidOnServiceListListeners(
diff --git a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
index 71aa5fe..2940151 100644
--- a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
+++ b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
@@ -25,6 +25,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension_messages.h"
+#include "extensions/common/features/feature_channel.h"
 #include "extensions/common/manifest_constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -265,6 +266,10 @@
   raw_ptr<MockedMDnsAPI> mdns_api_;
 };
 
+class MDnsAPIExtensionTest
+    : public MDnsAPITest,
+      public testing::WithParamInterface<version_info::Channel> {};
+
 TEST_F(MDnsAPIDiscoveryTest, ServiceListenersAddedAndRemoved) {
   EventRouterFactory::GetInstance()->SetTestingFactory(
       browser_context(), base::BindRepeating(&MockEventRouterFactoryFunction));
@@ -340,7 +345,10 @@
   dns_sd_registry()->DispatchMDnsEvent("_testing._tcp.local", services);
 }
 
-TEST_F(MDnsAPITest, ExtensionRespectsAllowlist) {
+TEST_P(MDnsAPIExtensionTest, ExtensionRespectsAllowlist) {
+  const bool is_dev = GetParam() == version_info::Channel::DEV;
+  extensions::ScopedCurrentChannel channel_override(GetParam());
+
   scoped_refptr<extensions::Extension> extension =
       CreateExtension("Dinosaur networker", false, kExtId);
   ExtensionRegistry::Get(browser_context())->AddEnabled(extension);
@@ -354,16 +362,17 @@
     filter.SetStringKey(kEventFilterServiceTypeKey, "_trex._tcp.local");
 
     ASSERT_TRUE(dns_sd_registry());
-    // Test that the extension is able to listen to a non-allowlisted service
+    // Test that the extension is not able to listen to a non-allowlisted
+    // service, unless we are on dev channel.
     EXPECT_CALL(*dns_sd_registry(), RegisterDnsSdListener("_trex._tcp.local"))
-        .Times(0);
+        .Times(is_dev ? 1 : 0);
     EventRouter::Get(browser_context())
         ->AddFilteredEventListener(api::mdns::OnServiceList::kEventName,
                                    render_process_host(), param.Clone(),
                                    absl::nullopt, filter, false);
 
     EXPECT_CALL(*dns_sd_registry(), UnregisterDnsSdListener("_trex._tcp.local"))
-        .Times(0);
+        .Times(is_dev ? 1 : 0);
     EventRouter::Get(browser_context())
         ->RemoveFilteredEventListener(api::mdns::OnServiceList::kEventName,
                                       render_process_host(), param.Clone(),
@@ -391,6 +400,11 @@
   }
 }
 
+INSTANTIATE_TEST_SUITE_P(Channels,
+                         MDnsAPIExtensionTest,
+                         testing::Values(version_info::Channel::DEV,
+                                         version_info::Channel::STABLE));
+
 TEST_F(MDnsAPITest, PlatformAppsNotSubjectToAllowlist) {
   scoped_refptr<extensions::Extension> extension =
       CreateExtension("Dinosaur networker", true, kExtId);
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
index 3ffd1ebb..b492b94 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
@@ -542,9 +542,9 @@
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
   frame_details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(render_frame_host));
+      ExtensionApiFrameIdMap::GetFrameType(render_frame_host);
   frame_details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(render_frame_host));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(render_frame_host);
 
   return RespondNow(ArgumentList(GetFrame::Results::Create(frame_details)));
 }
@@ -611,11 +611,10 @@
                   ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host)
                       .ToString());
             }
-            frame.frame_type = ToString(
-                ExtensionApiFrameIdMap::GetFrameType(render_frame_host));
+            frame.frame_type =
+                ExtensionApiFrameIdMap::GetFrameType(render_frame_host);
             frame.document_lifecycle =
-                ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(
-                    render_frame_host));
+                ExtensionApiFrameIdMap::GetDocumentLifecycle(render_frame_host);
             frame.process_id = render_frame_host->GetProcess()->GetID();
             frame.error_occurred = navigation_state->GetErrorOccurredInFrame();
             result_list.push_back(std::move(frame));
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api_helpers.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api_helpers.cc
index 891d7db0..edba29b 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api_helpers.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api_helpers.cc
@@ -82,10 +82,9 @@
     details.parent_document_id = std::make_unique<std::string>(
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
-  details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(navigation_handle));
+  details.frame_type = ExtensionApiFrameIdMap::GetFrameType(navigation_handle);
   details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(navigation_handle));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(navigation_handle);
   details.time_stamp = MilliSecondsFromTime(base::Time::Now());
 
   auto event = std::make_unique<Event>(
@@ -192,10 +191,9 @@
     details.parent_document_id = std::make_unique<std::string>(
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
-  details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(frame_host));
+  details.frame_type = ExtensionApiFrameIdMap::GetFrameType(frame_host);
   details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host);
   details.time_stamp = MilliSecondsFromTime(base::Time::Now());
 
   content::BrowserContext* browser_context = web_contents->GetBrowserContext();
@@ -225,10 +223,9 @@
     details.parent_document_id = std::make_unique<std::string>(
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
-  details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(frame_host));
+  details.frame_type = ExtensionApiFrameIdMap::GetFrameType(frame_host);
   details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host);
   details.time_stamp = MilliSecondsFromTime(base::Time::Now());
 
   content::BrowserContext* browser_context = web_contents->GetBrowserContext();
@@ -297,10 +294,9 @@
     details.parent_document_id = std::make_unique<std::string>(
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
-  details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(frame_host));
+  details.frame_type = ExtensionApiFrameIdMap::GetFrameType(frame_host);
   details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(frame_host);
   details.time_stamp = MilliSecondsFromTime(base::Time::Now());
 
   content::BrowserContext* browser_context = web_contents->GetBrowserContext();
@@ -332,10 +328,9 @@
     details.parent_document_id = std::make_unique<std::string>(
         ExtensionApiFrameIdMap::GetDocumentId(parent_frame_host).ToString());
   }
-  details.frame_type =
-      ToString(ExtensionApiFrameIdMap::GetFrameType(navigation_handle));
+  details.frame_type = ExtensionApiFrameIdMap::GetFrameType(navigation_handle);
   details.document_lifecycle =
-      ToString(ExtensionApiFrameIdMap::GetDocumentLifecycle(navigation_handle));
+      ExtensionApiFrameIdMap::GetDocumentLifecycle(navigation_handle);
   details.time_stamp = MilliSecondsFromTime(base::Time::Now());
 
   content::BrowserContext* browser_context =
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index f69f680..0cdb732 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -960,6 +960,8 @@
   extensions::api::web_navigation::OnCommitted::Details details;
   details.transition_type =
       extensions::api::web_navigation::TRANSITION_TYPE_TYPED;
+  details.frame_type = api::extension_types::FRAME_TYPE_OUTERMOST_FRAME;
+  details.document_lifecycle = api::extension_types::DOCUMENT_LIFECYCLE_ACTIVE;
 
   // Build a dummy onCommited event to dispatch.
   auto on_committed_event = std::make_unique<Event>(
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index ae606ef35..18849f9b 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -639,6 +639,11 @@
     "expiry_milestone": 111
   },
   {
+    "name": "biometric-authentication-in-settings",
+    "owners": ["sygiet@google.com", "vsemeniuk@google.com"],
+    "expiry_milestone": 110
+  },
+  {
     "name": "biometric-reauth-password-filling",
     "owners": [ "ioanap", "vsemeniuk@google.com" ],
     "expiry_milestone": 108
@@ -1676,11 +1681,6 @@
     "expiry_milestone": 86
   },
   {
-    "name": "enable-biometric-authentication-in-settings",
-    "owners": ["sygiet@google.com", "vsemeniuk@google.com"],
-    "expiry_milestone": 110
-  },
-  {
     "name": "enable-bluetooth-spp-in-serial-api",
     "owners": [ "mattreynolds", "cmumford" ],
     "expiry_milestone": 110
@@ -3975,6 +3975,11 @@
     "expiry_milestone": 108
   },
   {
+    "name": "ios-webpage-intent-annotations",
+    "owners": [ "djean", "bling-flags@google.com" ],
+    "expiry_milestone": 110
+  },
+  {
     "name": "isolate-origins",
     "owners": [ "site-isolation-dev", "alexmos", "creis", "lukasza" ],
     // This is useful for isolating additional origins beyond the normal site
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index cb130b8..952dd37 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -504,8 +504,8 @@
     "and other values that are not changed by accepting the preview should "
     "not be highlighted.";
 
-const char kAutofillParseIbanFieldsName[] = "Parse IBAN fields in forms";
-const char kAutofillParseIbanFieldsDescription[] =
+const char kAutofillParseIBANFieldsName[] = "Parse IBAN fields in forms";
+const char kAutofillParseIBANFieldsDescription[] =
     "When enabled, Autofill will attempt to find International Bank Account "
     "Number (IBAN) fields when parsing forms.";
 
@@ -4304,6 +4304,11 @@
 
 #if BUILDFLAG(IS_MAC)
 
+const char kBiometricAuthenticationInSettingsName[] =
+    "Biometric authentication in settings";
+const char kBiometricAuthenticationInSettingsDescription[] =
+    "Enables biometric authentication in settings to view/edit/copy a password";
+
 #if BUILDFLAG(ENABLE_PRINTING)
 const char kCupsIppPrintingBackendName[] = "CUPS IPP Printing Backend";
 const char kCupsIppPrintingBackendDescription[] =
@@ -4355,10 +4360,7 @@
 const char kUseAngleName[] = "Choose ANGLE graphics backend";
 const char kUseAngleDefault[] = "Default";
 const char kUseAngleGL[] = "OpenGL";
-const char kEnableBiometricAuthenticationInSettingsName[] =
-    "Biometric authentication in settings";
-const char kEnableBiometricAuthenticationInSettingsDescription[] =
-    "Enables biometric authentication in settings to view/edit/copy a password";
+
 const char kBiometricAuthenticationForFillingName[] =
     "Biometric authentication reauth before filling";
 const char kBiometricAuthenticationForFillingDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 340a1b6..ed87a64 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -271,8 +271,8 @@
 extern const char kAutofillHighlightOnlyChangedValuesInPreviewModeName[];
 extern const char kAutofillHighlightOnlyChangedValuesInPreviewModeDescription[];
 
-extern const char kAutofillParseIbanFieldsName[];
-extern const char kAutofillParseIbanFieldsDescription[];
+extern const char kAutofillParseIBANFieldsName[];
+extern const char kAutofillParseIBANFieldsDescription[];
 
 extern const char kAutofillParseMerchantPromoCodeFieldsName[];
 extern const char kAutofillParseMerchantPromoCodeFieldsDescription[];
@@ -2458,6 +2458,9 @@
 
 #if BUILDFLAG(IS_MAC)
 
+extern const char kBiometricAuthenticationInSettingsName[];
+extern const char kBiometricAuthenticationInSettingsDescription[];
+
 #if BUILDFLAG(ENABLE_PRINTING)
 extern const char kCupsIppPrintingBackendName[];
 extern const char kCupsIppPrintingBackendDescription[];
@@ -2495,9 +2498,6 @@
 extern const char kUseAngleDefault[];
 extern const char kUseAngleGL[];
 
-extern const char kEnableBiometricAuthenticationInSettingsName[];
-extern const char kEnableBiometricAuthenticationInSettingsDescription[];
-
 extern const char kBiometricAuthenticationForFillingName[];
 extern const char kBiometricAuthenticationForFillingDescription[];
 
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
index eb6df96..9eaa6c8 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
@@ -498,6 +498,24 @@
   return is_video_stopped;
 }
 
+void WebRtcTestBase::EnableVideoFrameCallbacks(
+    content::WebContents* tab_contents,
+    const std::string& video_element) const {
+  std::string javascript = base::StringPrintf("enableVideoFrameCallbacks('%s')",
+                                              video_element.c_str());
+  EXPECT_EQ("ok-started", ExecuteJavascript(javascript, tab_contents));
+}
+
+int WebRtcTestBase::GetNumVideoFrameCallbacks(
+    content::WebContents* tab_contents) const {
+  int counter = 0;
+  auto result = ExecuteJavascript("getNumVideoFrameCallbacks()", tab_contents);
+  if (base::StringToInt(result, &counter)) {
+    return counter;
+  }
+  return -1;
+}
+
 std::string WebRtcTestBase::GetStreamSize(
     content::WebContents* tab_contents,
     const std::string& video_element) const {
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_base.h b/chrome/browser/media/webrtc/webrtc_browsertest_base.h
index 6c14c75..e2d5205 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_base.h
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_base.h
@@ -193,6 +193,18 @@
   bool WaitForVideoToPlay(content::WebContents* tab_contents) const;
   bool WaitForVideoToStop(content::WebContents* tab_contents) const;
 
+  // Methods for detecting video frames supplied to a video element. Relies on
+  // chrome/test/data/webrtc/video_frame_detector.js and dependencies loaded.
+  void EnableVideoFrameCallbacks(content::WebContents* tab_contents,
+                                 const std::string& video_element) const;
+  // Returns the current number of frame callback invocations which is expected
+  // to increase provided StartDetectingVideoFrames was called for a video
+  // element, and video frames are being supplied.
+  // If StartDetectingVideoFrames hasn't been called, the method returns 0.
+  // If the string retrieved from Javascript isn't convertible to int, -1 is
+  // returned.
+  int GetNumVideoFrameCallbacks(content::WebContents* tab_contents) const;
+
   // Returns the stream size as a string on the format <width>x<height>.
   std::string GetStreamSize(content::WebContents* tab_contents,
                             const std::string& video_element) const;
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_common.cc b/chrome/browser/media/webrtc/webrtc_browsertest_common.cc
index 3787245..0772091 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_common.cc
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_common.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/media/webrtc/webrtc_browsertest_common.h"
 
+#include "base/callback_forward.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
@@ -177,4 +178,22 @@
   return false;
 }
 
+bool PollingWaitUntilClosureEvaluatesTrue(
+    base::RepeatingCallback<bool()> closure,
+    content::WebContents* tab_contents,
+    base::TimeDelta poll_interval) {
+  base::Time start_time = base::Time::Now();
+  base::TimeDelta timeout = TestTimeouts::action_max_timeout();
+  while (base::Time::Now() - start_time < timeout) {
+    if (closure.Run())
+      return true;
+    // Sleep a bit here to keep this loop from spinlocking too badly.
+    if (!SleepInJavascript(tab_contents, poll_interval.InMilliseconds())) {
+      LOG(ERROR) << "Failed to sleep.";
+    }
+  }
+  LOG(ERROR) << "Timed out while waiting for closure to evaluate true";
+  return false;
+}
+
 }  // namespace test
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_common.h b/chrome/browser/media/webrtc/webrtc_browsertest_common.h
index cd3ecef..efc7f71 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_common.h
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_common.h
@@ -7,8 +7,10 @@
 
 #include <string>
 
+#include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "base/process/process_handle.h"
+#include "base/time/time.h"
 
 namespace content {
 class WebContents;
@@ -62,6 +64,14 @@
                       content::WebContents* tab_contents,
                       int poll_interval_msec);
 
+// This function will execute the provided |closure| until it evaluates true,
+// causing a function return value of true, unless we exceed the
+// TestTimeouts::action_max_timeout() in which case the function returns false.
+bool PollingWaitUntilClosureEvaluatesTrue(
+    base::RepeatingCallback<bool()> closure,
+    content::WebContents* tab_contents,
+    base::TimeDelta poll_interval);
+
 }  // namespace test
 
 #endif  // CHROME_BROWSER_MEDIA_WEBRTC_WEBRTC_BROWSERTEST_COMMON_H_
diff --git a/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc b/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
index 26ecf78..86a0ff66 100644
--- a/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_desktop_capture_browsertest.cc
@@ -8,6 +8,9 @@
 #include "base/command_line.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
+#include "base/strings/strcat.h"
+#include "base/test/bind.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h"
@@ -231,8 +234,10 @@
   }
 
  protected:
-  void InitializeTabSharingForFirstTab(MediaIDCallback media_id_callback,
-                                       InfobarUIChangeObserver* observer) {
+  void InitializeTabSharingForFirstTab(
+      MediaIDCallback media_id_callback,
+      InfobarUIChangeObserver* observer,
+      absl::optional<std::string> extra_video_constraints = absl::nullopt) {
     ASSERT_TRUE(embedded_test_server()->Start());
     LoadDesktopCaptureExtension();
     auto* first_tab = OpenTestPageInNewTab(kMainWebrtcTestHtmlPage);
@@ -251,10 +256,11 @@
 
     LOG(INFO) << "Opened desktop media stream, got id " << stream_id;
 
-    const std::string constraints =
-        "{audio: false, video: {mandatory: {chromeMediaSource: 'desktop',"
-        "chromeMediaSourceId: '" +
-        stream_id + "'}}}";
+    std::string constraints = base::StrCat(
+        {"{audio: false, video: { mandatory: {chromeMediaSource: 'desktop', "
+         "chromeMediaSourceId: '",
+         stream_id, "'", (extra_video_constraints.has_value() ? ", " : ""),
+         extra_video_constraints.value_or(""), "}}}"});
 
     // Should create 3 infobars if a tab (webcontents) is shared!
     if (observer)
@@ -296,6 +302,50 @@
   FakeDesktopMediaPickerFactory picker_factory_;
 };
 
+IN_PROC_BROWSER_TEST_F(WebRtcDesktopCaptureBrowserTest,
+                       TabCaptureProvidesMinFps) {
+  constexpr int kFps = 25;
+  constexpr const char* const kFpsString = "25";
+  constexpr int kTestTimeSeconds = 2;
+  // We wait with measuring frame rate until a few frames has passed. This is
+  // because the frame rate frame dropper in VideoTrackAdapter is pretty
+  // aggressive dropping frames when the stream starts.
+  constexpr int kNumFramesBeforeStabilization = 10;
+
+  InitializeTabSharingForFirstTab(
+      base::BindOnce(GetDesktopMediaIDForTab, base::Unretained(browser()), 1),
+      nullptr, base::StrCat({"minFrameRate: ", kFpsString}));
+  content::WebContents* first_tab =
+      browser()->tab_strip_model()->GetWebContentsAt(1);
+  EnableVideoFrameCallbacks(first_tab, "local-view");
+
+  // First wait for a frame to appear, then wait until we get the number of
+  // frames expected during the test time.
+  int initial_frame_counter = 0;
+  base::TimeTicks initial_timestamp;
+  ASSERT_TRUE(test::PollingWaitUntilClosureEvaluatesTrue(
+      base::BindLambdaForTesting([&]() -> bool {
+        initial_timestamp = base::TimeTicks::Now();
+        initial_frame_counter = GetNumVideoFrameCallbacks(first_tab);
+        return initial_frame_counter > kNumFramesBeforeStabilization;
+      }),
+      first_tab, base::Milliseconds(50)));
+  int final_frame_counter = 0;
+  base::TimeTicks final_timestamp;
+  ASSERT_TRUE(test::PollingWaitUntilClosureEvaluatesTrue(
+      base::BindLambdaForTesting([&]() -> bool {
+        final_timestamp = base::TimeTicks::Now();
+        final_frame_counter = GetNumVideoFrameCallbacks(first_tab);
+        return final_frame_counter >=
+               kTestTimeSeconds * kFps + initial_frame_counter;
+      }),
+      first_tab, base::Milliseconds(50)));
+  int average_fps = (final_frame_counter - initial_frame_counter) * 1000 /
+                    (final_timestamp - initial_timestamp).InMilliseconds();
+  // Expect at least 50% of the expected frames to aggressively combat flakes.
+  ASSERT_GE(average_fps, kFps / 2);
+}
+
 // TODO(crbug.com/796889): Enable on Mac when thread check crash is fixed.
 // TODO(sprang): Figure out why test times out on Win 10 and ChromeOS.
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
diff --git a/chrome/browser/password_edit_dialog/android/BUILD.gn b/chrome/browser/password_edit_dialog/android/BUILD.gn
index 623a45f..fc40d32f 100644
--- a/chrome/browser/password_edit_dialog/android/BUILD.gn
+++ b/chrome/browser/password_edit_dialog/android/BUILD.gn
@@ -69,7 +69,7 @@
 }
 
 robolectric_library("junit") {
-  sources = [ "java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogTest.java" ]
+  sources = [ "java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java" ]
 
   deps = [
     ":java",
@@ -81,6 +81,7 @@
     "//third_party/hamcrest:hamcrest_library_java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
+    "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
   ]
 }
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogBridge.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogBridge.java
index 8cf76b77..517ae23 100644
--- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogBridge.java
+++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogBridge.java
@@ -31,9 +31,16 @@
     }
 
     @CalledByNative
-    void show(@NonNull String[] usernames, int selectedUsernameIndex, @NonNull String password,
-            @NonNull String origin, @Nullable String account) {
-        mDialogCoordinator.show(usernames, selectedUsernameIndex, password, origin, account);
+    void showUpdatePasswordDialog(@NonNull String[] usernames, int selectedUsernameIndex,
+            @NonNull String password, @Nullable String account) {
+        mDialogCoordinator.showUpdatePasswordDialog(
+                usernames, selectedUsernameIndex, password, account);
+    }
+
+    @CalledByNative
+    void showSavePasswordDialog(
+            @NonNull String username, @NonNull String password, @Nullable String account) {
+        mDialogCoordinator.showSavePasswordDialog(username, password, account);
     }
 
     @CalledByNative
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java
new file mode 100644
index 0000000..ac534b45
--- /dev/null
+++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java
@@ -0,0 +1,285 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.password_edit_dialog;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.is;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
+
+import android.content.res.Resources;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
+import org.robolectric.RuntimeEnvironment;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/** Tests for password update dialog. */
+@RunWith(ParameterizedRobolectricTestRunner.class)
+public class PasswordEditDialogControllerTest {
+    private static final String[] USERNAMES = {"user1", "user2", "user3"};
+    private static final int INITIAL_USERNAME_INDEX = 1;
+    private static final String INITIAL_USERNAME = USERNAMES[INITIAL_USERNAME_INDEX];
+    private static final String CHANGED_USERNAME = "user3";
+    private static final String INITIAL_PASSWORD = "password";
+    private static final String CHANGED_PASSWORD = "passwordChanged";
+    private static final String ACCOUNT_NAME = "foo@bar.com";
+
+    @Rule
+    public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
+    @Mock
+    private PasswordEditDialogCoordinator.Delegate mDelegateMock;
+
+    private FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0);
+
+    @Mock
+    private PasswordEditDialogView mDialogViewMock;
+
+    private PropertyModel mCustomViewModel;
+    private PropertyModel mModalDialogModel;
+
+    private PasswordEditDialogCoordinator mDialogCoordinator;
+    private boolean mIsSignedIn;
+
+    @Parameters
+    public static Collection<Object> data() {
+        return Arrays.asList(new Object[] {/*isSignedIn=*/false, /*isSignedIn=*/true});
+    }
+
+    public PasswordEditDialogControllerTest(boolean isSignedIn) {
+        mIsSignedIn = isSignedIn;
+    }
+
+    /**
+     * Tests that properties of password edit modal dialog and custom view are set correctly
+     * based on passed parameters when the details feature is disabled.
+     */
+    @Test
+    @DisableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testUpdatePasswordDialogPropertiesFeatureDisabled() {
+        createAndShowDialog(true);
+        Resources r = RuntimeEnvironment.getApplication().getResources();
+
+        Assert.assertEquals(
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE),
+                r.getString(R.string.confirm_username_dialog_title));
+        Assert.assertThat("Usernames don't match",
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAMES), contains(USERNAMES));
+        Assert.assertEquals("Selected username doesn't match", INITIAL_USERNAME,
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME));
+        Assert.assertEquals("Password doesn't match", INITIAL_PASSWORD,
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD));
+        Assert.assertNull(
+                "Footer should be null", mCustomViewModel.get(PasswordEditDialogProperties.FOOTER));
+        Assert.assertNull("No title icon is expected",
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE_ICON));
+    }
+
+    /**
+     * Tests that properties of update modal dialog and custom view are set correctly
+     * based on passed parameters when the details feature is enabled.
+     */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testUpdatePasswordDialogPropertiesFeatureEnabled() {
+        createAndShowDialog(true);
+        Resources r = RuntimeEnvironment.getApplication().getResources();
+
+        Assert.assertEquals(
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE),
+                r.getString(R.string.password_update_dialog_title));
+        Assert.assertThat("Usernames don't match",
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAMES), contains(USERNAMES));
+        Assert.assertEquals("Selected username doesn't match", INITIAL_USERNAME,
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME));
+        Assert.assertEquals("Password doesn't match", INITIAL_PASSWORD,
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD));
+        Assert.assertNotNull(
+                "Footer is empty", mCustomViewModel.get(PasswordEditDialogProperties.FOOTER));
+        Assert.assertNotNull("There should be a title icon",
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE_ICON));
+        Assert.assertEquals(mModalDialogManager.getShownDialogModel().get(
+                                    ModalDialogProperties.POSITIVE_BUTTON_TEXT),
+                r.getString(R.string.password_manager_update_button));
+        if (mIsSignedIn) {
+            Assert.assertTrue("Footer should contain user account name",
+                    mCustomViewModel.get(PasswordEditDialogProperties.FOOTER)
+                            .contains(ACCOUNT_NAME));
+        }
+    }
+
+    /**
+     * Tests that properties of save modal dialog and custom view are set correctly based on passed
+     * parameters when the details feature is enabled.
+     */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testSavePasswordDialogPropertiesFeatureEnabled() {
+        createAndShowDialog(false);
+        Resources r = RuntimeEnvironment.getApplication().getResources();
+
+        Assert.assertEquals(
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE),
+                r.getString(R.string.save_password));
+        // Save dialog has only one username in usernames list - the one the user's just entered
+        Assert.assertThat("Usernames don't match",
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAMES),
+                contains(new String[] {INITIAL_USERNAME}));
+        Assert.assertEquals("Selected username doesn't match", INITIAL_USERNAME,
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME));
+        Assert.assertEquals("Password doesn't match", INITIAL_PASSWORD,
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD));
+        Assert.assertNotNull(
+                "Footer is empty", mCustomViewModel.get(PasswordEditDialogProperties.FOOTER));
+        Assert.assertNotNull("There should be a title icon",
+                mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.TITLE_ICON));
+        Assert.assertEquals(mModalDialogManager.getShownDialogModel().get(
+                                    ModalDialogProperties.POSITIVE_BUTTON_TEXT),
+                r.getString(R.string.password_manager_save_button));
+        if (mIsSignedIn) {
+            Assert.assertTrue("Footer should contain user account name",
+                    mCustomViewModel.get(PasswordEditDialogProperties.FOOTER)
+                            .contains(ACCOUNT_NAME));
+        }
+    }
+
+    /** Tests that the username entered in the layout propagates to the model. */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testUsernameChanged() {
+        createAndShowDialog(false);
+
+        Callback<String> usernameChangedCallback =
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME_CHANGED_CALLBACK);
+        usernameChangedCallback.onResult(CHANGED_USERNAME);
+        Assert.assertEquals("Selected username doesn't match", CHANGED_USERNAME,
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME));
+    }
+
+    /**
+     * Tests that correct username and password are propagated to the dialog accepted delegate
+     */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testDialogIsAcceptedWithCorrectUsernameAndPassword() {
+        createAndShowDialog(false);
+        ModalDialogProperties.Controller dialogController =
+                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
+
+        Assert.assertThat(
+                mCustomViewModel.get(PasswordEditDialogProperties.USERNAME), is(INITIAL_USERNAME));
+        Assert.assertThat(
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD), is(INITIAL_PASSWORD));
+
+        mCustomViewModel.set(PasswordEditDialogProperties.USERNAME, CHANGED_USERNAME);
+        mCustomViewModel.set(PasswordEditDialogProperties.PASSWORD, CHANGED_PASSWORD);
+        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.POSITIVE);
+
+        Mockito.verify(mDelegateMock).onDialogAccepted(CHANGED_USERNAME, CHANGED_PASSWORD);
+        Mockito.verify(mDelegateMock).onDialogDismissed(true);
+    }
+
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testEmptyPasswordError() {
+        createAndShowDialog(true);
+
+        Callback<String> passwordChangedCallback =
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD_CHANGED_CALLBACK);
+        passwordChangedCallback.onResult("");
+        Assert.assertTrue("Accept button should be disabled when user enters empty password",
+                mModalDialogModel.get(ModalDialogProperties.POSITIVE_BUTTON_DISABLED));
+        Assert.assertTrue("Error should be displayed when user enters empty password",
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD_ERROR) != null
+                        && !mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD_ERROR)
+                                    .isEmpty());
+    }
+
+    /** Tests that changing password in editText gets reflected in the model. */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testPasswordChanging() {
+        createAndShowDialog(true);
+
+        Callback<String> passwordChangedCallback =
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD_CHANGED_CALLBACK);
+        passwordChangedCallback.onResult(CHANGED_PASSWORD);
+        Assert.assertEquals("Password doesn't match to the expected", CHANGED_PASSWORD,
+                mCustomViewModel.get(PasswordEditDialogProperties.PASSWORD));
+    }
+
+    /**
+     * Tests that the dialog is dismissed when dismiss() is called from native code.
+     */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testDialogDismissedFromNative() {
+        createAndShowDialog(false);
+
+        mDialogCoordinator.dismiss();
+        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
+        Mockito.verify(mDelegateMock).onDialogDismissed(false);
+    }
+
+    /**
+     * Tests that the dialog is dismissed when negative button callback is triggered.
+     */
+    @Test
+    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
+    public void testDialogDismissedWithNegativeButton() {
+        createAndShowDialog(true);
+
+        ModalDialogProperties.Controller dialogController =
+                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
+        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.NEGATIVE);
+        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
+        Mockito.verify(mDelegateMock).onDialogDismissed(false);
+    }
+
+    /**
+     * Helper function that creates {@link PasswordEditDialogCoordinator},
+     * and captures property models for modal dialog and custom dialog view.
+     *
+     * @param isUpdate Defines whether Save password or Update password dialog will be shown
+     */
+    private void createAndShowDialog(boolean isUpdate) {
+        mDialogCoordinator = new PasswordEditDialogCoordinator(RuntimeEnvironment.getApplication(),
+                mModalDialogManager, mDialogViewMock, mDelegateMock);
+        if (isUpdate) {
+            mDialogCoordinator.showUpdatePasswordDialog(
+                    USERNAMES, INITIAL_USERNAME_INDEX, INITIAL_PASSWORD, ACCOUNT_NAME);
+        } else {
+            mDialogCoordinator.showSavePasswordDialog(
+                    INITIAL_USERNAME, INITIAL_PASSWORD, mIsSignedIn ? ACCOUNT_NAME : null);
+        }
+
+        mModalDialogModel = mDialogCoordinator.getDialogModelForTesting();
+        mCustomViewModel = mDialogCoordinator.getDialogViewModelForTesting();
+    }
+}
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java
index 03e204b..10b122cd 100644
--- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java
+++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java
@@ -105,18 +105,44 @@
     }
 
     /**
-     * Shows the password edit dialog.
+     * Shows the dialog asking if user wants to save the password and providing
+     * username & password editing capabilities.
+     * Possible user choices: Save, Never for this site, Cancel
+     *
+     * @param username Initially typed username that user will be able to edit
+     * @param password Initially typed password that user will be able to edit
+     * @param account The account name where the password will be saved. When the user is not signed
+     *         in the account is null.
+     */
+    void showSavePasswordDialog(
+            @NonNull String username, @NonNull String password, @Nullable String account) {
+        mDialogModel = createModalDialogModel(
+                R.string.save_password, R.string.password_manager_save_button);
+        mDialogViewModel = createDialogViewModel(new String[] {username}, 0, password, account);
+
+        mMediator.initialize(mDialogViewModel, mDialogModel);
+        // The mediator needs to be initialized before the model change processor,
+        // so that the callbacks handling changes from the view are not null
+        // when the view is populated.
+        PropertyModelChangeProcessor.create(
+                mDialogViewModel, mDialogView, PasswordEditDialogViewBinder::bind);
+
+        mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
+    }
+
+    /**
+     * Shows the dialog asking if user wants to update the password and providing
+     * username & password editing capabilities
      *
      * @param usernames The list of usernames that will be presented in the Spinner.
      * @param selectedUsernameIndex The index in the usernames list of the user that should be
      *         selected initially.
-     * @param password The password.
-     * @param origin The origin with which these credentials are associated.
+     * @param password The password that the user entered in the form.
      * @param account The account name where the password will be saved. When the user is not signed
      *         in the account is null.
      */
-    void show(@NonNull String[] usernames, int selectedUsernameIndex, @NonNull String password,
-            @NonNull String origin, @Nullable String account) {
+    void showUpdatePasswordDialog(@NonNull String[] usernames, int selectedUsernameIndex,
+            @NonNull String password, @Nullable String account) {
         mDialogModel = createModalDialogModel(mIsDialogWithDetailsFeatureEnabled
                         ? R.string.password_update_dialog_title
                         : R.string.confirm_username_dialog_title,
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogTest.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogTest.java
deleted file mode 100644
index 44f904f..0000000
--- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogTest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.password_edit_dialog;
-
-import static org.hamcrest.Matchers.contains;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.never;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-import org.robolectric.ParameterizedRobolectricTestRunner;
-import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
-import org.robolectric.RuntimeEnvironment;
-
-import org.chromium.base.Callback;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
-import org.chromium.ui.modaldialog.DialogDismissalCause;
-import org.chromium.ui.modaldialog.ModalDialogManager;
-import org.chromium.ui.modaldialog.ModalDialogProperties;
-import org.chromium.ui.modelutil.PropertyModel;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/** Tests for password edit dialog. */
-@RunWith(ParameterizedRobolectricTestRunner.class)
-public class PasswordEditDialogTest {
-    private static final long NATIVE_PTR = 1;
-    private static final String[] USERNAMES = {"user1", "user2", "user3"};
-    private static final int INITIAL_USERNAME_INDEX = 1;
-    private static final String INITIAL_USERNAME = USERNAMES[INITIAL_USERNAME_INDEX];
-    private static final String CHANGED_USERNAME = "user3";
-    private static final String INITIAL_PASSWORD = "password";
-    private static final String CHANGED_PASSWORD = "passwordChanged";
-    private static final String ORIGIN = "example.com";
-    private static final String ACCOUNT_NAME = "foo@bar.com";
-
-    @Rule
-    public MockitoRule mMockitoRule = MockitoJUnit.rule();
-
-    @Rule
-    public TestRule mProcessor = new Features.JUnitProcessor();
-
-    @Mock
-    private PasswordEditDialogCoordinator.Delegate mDelegateMock;
-
-    @Mock
-    private ModalDialogManager mModalDialogManagerMock;
-
-    @Mock
-    private PasswordEditDialogView mDialogViewMock;
-
-    private PropertyModel mDialogProperties;
-    private PropertyModel mModalDialogModel;
-
-    private PasswordEditDialogCoordinator mDialogCoordinator;
-    private boolean mIsSignedIn;
-
-    @Parameters
-    public static Collection<Object> data() {
-        return Arrays.asList(new Object[] {/*isSignedIn=*/false, /*isSignedIn=*/true});
-    }
-
-    public PasswordEditDialogTest(boolean isSignedIn) {
-        mIsSignedIn = isSignedIn;
-    }
-
-    @Before
-    public void setUp() {
-        createAndShowDialog(mIsSignedIn);
-    }
-
-    /**
-     * Tests that properties of modal dialog and custom view are set correctly based on passed
-     * parameters when the details feature is disabled.
-     */
-    @Test
-    @DisableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogPropertiesFeatureDisabled() {
-        Mockito.verify(mModalDialogManagerMock)
-                .showDialog(mModalDialogModel, ModalDialogManager.ModalDialogType.TAB);
-        Assert.assertThat("Usernames don't match",
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAMES), contains(USERNAMES));
-        Assert.assertEquals("Selected username doesn't match", INITIAL_USERNAME,
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME));
-        Assert.assertEquals("Password doesn't match", INITIAL_PASSWORD,
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD));
-        Assert.assertNull(
-                "Footer is not empty", mDialogProperties.get(PasswordEditDialogProperties.FOOTER));
-        Assert.assertNull("No title icon is expected",
-                mModalDialogModel.get(ModalDialogProperties.TITLE_ICON));
-    }
-
-    /** Tests that the username selected in spinner gets reflected in the callback parameter. */
-    @Test
-    @DisableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testUserSelection() {
-        Callback<String> usernameSelectedCallback =
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME_CHANGED_CALLBACK);
-        usernameSelectedCallback.onResult(CHANGED_USERNAME);
-        Assert.assertEquals("Selected username doesn't match", CHANGED_USERNAME,
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME));
-        ModalDialogProperties.Controller dialogController =
-                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
-        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.POSITIVE);
-        Mockito.verify(mDelegateMock).onDialogAccepted(CHANGED_USERNAME, INITIAL_PASSWORD);
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
-    }
-
-    /**
-     * Tests that the username is not saved and the dialog is dismissed when dismiss() is called
-     * from native code.
-     */
-    @Test
-    @DisableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogDismissedFromNative() {
-        mDialogCoordinator.dismiss();
-        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.DISMISSED_BY_NATIVE);
-    }
-
-    /**
-     * Tests that the username is not saved and the dialog is dismissed when the user taps on the
-     * negative button.
-     */
-    @Test
-    @DisableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogDismissedWithNegativeButton() {
-        ModalDialogProperties.Controller dialogController =
-                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
-        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.NEGATIVE);
-        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
-    }
-
-    /**
-     * Tests that properties of modal dialog and custom view are set correctly based on passed
-     * parameters when the details feature is enabled.
-     */
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogPropertiesFeatureEnabled() {
-        Mockito.verify(mModalDialogManagerMock)
-                .showDialog(mModalDialogModel, ModalDialogManager.ModalDialogType.TAB);
-        Assert.assertThat("Usernames don't match",
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAMES), contains(USERNAMES));
-        Assert.assertEquals("Selected username doesn't match", INITIAL_USERNAME,
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME));
-        Assert.assertEquals("Password doesn't match", INITIAL_PASSWORD,
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD));
-        Assert.assertNotNull(
-                "Footer is empty", mDialogProperties.get(PasswordEditDialogProperties.FOOTER));
-        Assert.assertNotNull("There should be a title icon",
-                mModalDialogModel.get(ModalDialogProperties.TITLE_ICON));
-        if (mIsSignedIn) {
-            Assert.assertTrue("Footer should contain user account name",
-                    mDialogProperties.get(PasswordEditDialogProperties.FOOTER)
-                            .contains(ACCOUNT_NAME));
-        }
-    }
-
-    /** Tests that password changing in editText gets reflected in the callback parameter. */
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testPasswordChanging() {
-        Callback<String> passwordChangedCallback =
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD_CHANGED_CALLBACK);
-        passwordChangedCallback.onResult(CHANGED_PASSWORD);
-        Assert.assertEquals("Password doesn't match to the expected", CHANGED_PASSWORD,
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD));
-        ModalDialogProperties.Controller dialogController =
-                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
-        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.POSITIVE);
-        Mockito.verify(mDelegateMock).onDialogAccepted(INITIAL_USERNAME, CHANGED_PASSWORD);
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testEmptyPasswordError() {
-        Callback<String> passwordChangedCallback =
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD_CHANGED_CALLBACK);
-        passwordChangedCallback.onResult("");
-        Assert.assertTrue("Accept button should be disabled when user enters empty password",
-                mModalDialogModel.get(ModalDialogProperties.POSITIVE_BUTTON_DISABLED));
-        Assert.assertFalse("Error should be displayed when user enters empty password",
-                mDialogProperties.get(PasswordEditDialogProperties.PASSWORD_ERROR) == null
-                        || mDialogProperties.get(PasswordEditDialogProperties.PASSWORD_ERROR)
-                                   .isEmpty());
-    }
-
-    /** Tests that the username selected in spinner gets reflected in the callback parameter. */
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testUserSelectionFeatureEnabled() {
-        Callback<String> usernameSelectedCallback =
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME_CHANGED_CALLBACK);
-        usernameSelectedCallback.onResult(CHANGED_USERNAME);
-        Assert.assertEquals("Selected username doesn't match", CHANGED_USERNAME,
-                mDialogProperties.get(PasswordEditDialogProperties.USERNAME));
-        ModalDialogProperties.Controller dialogController =
-                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
-        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.POSITIVE);
-        Mockito.verify(mDelegateMock).onDialogAccepted(CHANGED_USERNAME, INITIAL_PASSWORD);
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
-    }
-
-    /**
-     * Tests that the username is not saved and the dialog is dismissed when dismiss() is called
-     * from native code.
-     */
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogDismissedFromNativeFeatureEnabled() {
-        mDialogCoordinator.dismiss();
-        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.DISMISSED_BY_NATIVE);
-    }
-
-    /**
-     * Tests that the username is not saved and the dialog is dismissed when the user taps on the
-     * negative button.
-     */
-    @Test
-    @EnableFeatures(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
-    public void testDialogDismissedWithNegativeButtonFeatureEnabled() {
-        ModalDialogProperties.Controller dialogController =
-                mModalDialogModel.get(ModalDialogProperties.CONTROLLER);
-        dialogController.onClick(mModalDialogModel, ModalDialogProperties.ButtonType.NEGATIVE);
-        Mockito.verify(mDelegateMock, never()).onDialogAccepted(anyString(), anyString());
-        Mockito.verify(mModalDialogManagerMock)
-                .dismissDialog(mModalDialogModel, DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
-    }
-
-    /**
-     * Helper function that creates PasswordEditDialogCoordinator, calls show and captures property
-     * models for modal dialog and custom dialog view.
-     *
-     * @param signedIn Simulates user's sign-in state.
-     */
-    private void createAndShowDialog(boolean signedIn) {
-        mDialogCoordinator = new PasswordEditDialogCoordinator(RuntimeEnvironment.application,
-                mModalDialogManagerMock, mDialogViewMock, mDelegateMock);
-        mDialogCoordinator.show(USERNAMES, INITIAL_USERNAME_INDEX, INITIAL_PASSWORD, ORIGIN,
-                signedIn ? ACCOUNT_NAME : null);
-        mModalDialogModel = mDialogCoordinator.getDialogModelForTesting();
-        mDialogProperties = mDialogCoordinator.getDialogViewModelForTesting();
-    }
-}
diff --git a/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.cc b/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.cc
index 201424d6..d9312f45 100644
--- a/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.cc
+++ b/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.cc
@@ -43,11 +43,27 @@
   DCHECK(java_password_dialog_.is_null());
 }
 
-void PasswordEditDialogBridge::Show(
+void PasswordEditDialogBridge::ShowSavePasswordDialog(
+    const std::u16string& username,
+    const std::u16string& password,
+    const std::string& account_email) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+
+  base::android::ScopedJavaLocalRef<jstring> j_username =
+      base::android::ConvertUTF16ToJavaString(env, username);
+  base::android::ScopedJavaLocalRef<jstring> j_password =
+      base::android::ConvertUTF16ToJavaString(env, password);
+  base::android::ScopedJavaLocalRef<jstring> j_account_email =
+      base::android::ConvertUTF8ToJavaString(env, account_email);
+
+  Java_PasswordEditDialogBridge_showSavePasswordDialog(
+      env, java_password_dialog_, j_username, j_password, j_account_email);
+}
+
+void PasswordEditDialogBridge::ShowUpdatePasswordDialog(
     const std::vector<std::u16string>& usernames,
     int selected_username_index,
     const std::u16string& password,
-    const std::u16string& origin,
     const std::string& account_email) {
   JNIEnv* env = base::android::AttachCurrentThread();
 
@@ -56,14 +72,12 @@
 
   base::android::ScopedJavaLocalRef<jstring> j_password =
       base::android::ConvertUTF16ToJavaString(env, password);
-  base::android::ScopedJavaLocalRef<jstring> j_origin =
-      base::android::ConvertUTF16ToJavaString(env, origin);
   base::android::ScopedJavaLocalRef<jstring> j_account_email =
       base::android::ConvertUTF8ToJavaString(env, account_email);
 
-  Java_PasswordEditDialogBridge_show(env, java_password_dialog_, j_usernames,
-                                     selected_username_index, j_password,
-                                     j_origin, j_account_email);
+  Java_PasswordEditDialogBridge_showUpdatePasswordDialog(
+      env, java_password_dialog_, j_usernames, selected_username_index,
+      j_password, j_account_email);
 }
 
 void PasswordEditDialogBridge::Dismiss() {
diff --git a/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.h b/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.h
index 8b20362161..f076e71d 100644
--- a/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.h
+++ b/chrome/browser/password_edit_dialog/android/password_edit_dialog_bridge.h
@@ -36,7 +36,7 @@
 // Here is how typically dialog bridge is created:
 //   m_dialog_bridge = PasswordEditDialogBridge::Create(web_contents,
 //       base::BindOnce(&OnDialogAccepted),base::BindOnce(&OnDialogDismissed));
-//   if (m_dialog_bridge) m_dialog_bridge->Show(...);
+//   if (m_dialog_bridge) m_dialog_bridge->ShowUpdatePasswordDialog(...);
 //
 // The owning class should dismiss displayed dialog during its own destruction:
 //   if (m_dialog_bridge) m_dialog_bridge->Dismiss();
@@ -56,12 +56,17 @@
 
   virtual ~PasswordEditDialog();
 
-  // Calls Java side of the bridge to display password edit modal dialog.
-  virtual void Show(const std::vector<std::u16string>& usernames,
-                    int selected_username_index,
-                    const std::u16string& password,
-                    const std::u16string& origin,
-                    const std::string& account_email) = 0;
+  // Calls Java side of the bridge to display password save modal dialog.
+  virtual void ShowSavePasswordDialog(const std::u16string& username,
+                                      const std::u16string& password,
+                                      const std::string& account_email) = 0;
+
+  // Calls Java side of the bridge to display password update modal dialog.
+  virtual void ShowUpdatePasswordDialog(
+      const std::vector<std::u16string>& usernames,
+      int selected_username_index,
+      const std::u16string& password,
+      const std::string& account_email) = 0;
 
   // Dismisses displayed dialog. The owner of PassworDeidtDialogBridge should
   // call this function to correctly dismiss and destroy the dialog. The object
@@ -85,12 +90,16 @@
   PasswordEditDialogBridge(const PasswordEditDialogBridge&) = delete;
   PasswordEditDialogBridge& operator=(const PasswordEditDialogBridge&) = delete;
 
-  // Calls Java side of the bridge to display password edit modal dialog.
-  void Show(const std::vector<std::u16string>& usernames,
-            int selected_username_index,
-            const std::u16string& password,
-            const std::u16string& origin,
-            const std::string& account_email) override;
+  // Calls Java side of the bridge to display password save modal dialog.
+  void ShowSavePasswordDialog(const std::u16string& username,
+                              const std::u16string& password,
+                              const std::string& account_email) override;
+
+  // Calls Java side of the bridge to display password update modal dialog.
+  void ShowUpdatePasswordDialog(const std::vector<std::u16string>& usernames,
+                                int selected_username_index,
+                                const std::u16string& password,
+                                const std::string& account_email) override;
 
   // Dismisses displayed dialog. The owner of PassworDeidtDialogBridge should
   // call this function to correctly dismiss and destroy the dialog. The object
diff --git a/chrome/browser/password_manager/android/save_update_password_message_delegate.cc b/chrome/browser/password_manager/android/save_update_password_message_delegate.cc
index fb6c0f0..c9e774f 100644
--- a/chrome/browser/password_manager/android/save_update_password_message_delegate.cc
+++ b/chrome/browser/password_manager/android/save_update_password_message_delegate.cc
@@ -26,6 +26,8 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "url/origin.h"
 
+using password_manager::features::kPasswordEditDialogWithDetails;
+
 SaveUpdatePasswordMessageDelegate::SaveUpdatePasswordMessageDelegate()
     : SaveUpdatePasswordMessageDelegate(
           base::BindRepeating(PasswordEditDialogBridge::Create)) {}
@@ -164,17 +166,28 @@
         ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_INFOBAR_SAVE_PASSWORD));
   }
 
-  if (!update_password) {
-    message_->SetSecondaryIconResourceId(
-        ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_SETTINGS));
-    message_->SetSecondaryButtonMenuText(l10n_util::GetStringUTF16(
-        password_manager::features::UsesUnifiedPasswordManagerUi()
-            ? IDS_PASSWORD_MESSAGE_NEVER_SAVE_MENU_ITEM
-            : IDS_PASSWORD_MANAGER_BLOCKLIST_BUTTON));
-    message_->SetSecondaryActionCallback(base::BindRepeating(
-        &SaveUpdatePasswordMessageDelegate::HandleNeverSaveClicked,
+  if (!update_password)
+    SetupCogMenu(message_);
+}
+
+void SaveUpdatePasswordMessageDelegate::SetupCogMenu(
+    std::unique_ptr<messages::MessageWrapper>& message) {
+  message->SetSecondaryIconResourceId(
+      ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_SETTINGS));
+  if (base::FeatureList::IsEnabled(kPasswordEditDialogWithDetails)) {
+    message->SetSecondaryActionCallback(base::BindRepeating(
+        &SaveUpdatePasswordMessageDelegate::DisplayEditDialog,
         base::Unretained(this)));
+    return;
   }
+
+  message->SetSecondaryButtonMenuText(l10n_util::GetStringUTF16(
+      password_manager::features::UsesUnifiedPasswordManagerUi()
+          ? IDS_PASSWORD_MESSAGE_NEVER_SAVE_MENU_ITEM
+          : IDS_PASSWORD_MANAGER_BLOCKLIST_BUTTON));
+  message->SetSecondaryActionCallback(base::BindRepeating(
+      &SaveUpdatePasswordMessageDelegate::HandleNeverSaveClicked,
+      base::Unretained(this)));
 }
 
 std::u16string SaveUpdatePasswordMessageDelegate::GetMessageDescription(
@@ -247,6 +260,30 @@
   passwords_state_.form_manager()->Save();
 }
 
+void SaveUpdatePasswordMessageDelegate::DisplayEditDialog() {
+  const std::u16string& current_username =
+      passwords_state_.form_manager()->GetPendingCredentials().username_value;
+  const std::u16string& current_password =
+      passwords_state_.form_manager()->GetPendingCredentials().password_value;
+  DisplaySavePasswordDialog(std::move(current_username),
+                            std::move(current_password));
+  DismissSaveUpdatePasswordMessage(messages::DismissReason::SECONDARY_ACTION);
+}
+
+void SaveUpdatePasswordMessageDelegate::DisplaySavePasswordDialog(
+    std::u16string current_username,
+    std::u16string current_password) {
+  CreatePasswordEditDialog();
+
+  // Password edit dialog factory method can return nullptr when web_contents
+  // is not attached to a window. See crbug.com/1049090 for details.
+  if (!password_edit_dialog_)
+    return;
+
+  password_edit_dialog_->ShowSavePasswordDialog(
+      current_username, current_password, account_email_);
+}
+
 void SaveUpdatePasswordMessageDelegate::HandleNeverSaveClicked() {
   passwords_state_.form_manager()->Blocklist();
   DismissSaveUpdatePasswordMessage(messages::DismissReason::SECONDARY_ACTION);
@@ -256,39 +293,26 @@
   std::vector<std::u16string> usernames;
   int selected_username_index = GetDisplayUsernames(&usernames);
   if (usernames.size() > 1) {
-    DisplayUsernameConfirmDialog(std::move(usernames), selected_username_index);
+    DisplayUpdatePasswordDialog(std::move(usernames), selected_username_index);
   } else {
     passwords_state_.form_manager()->Save();
   }
 }
 
-void SaveUpdatePasswordMessageDelegate::DisplayUsernameConfirmDialog(
+void SaveUpdatePasswordMessageDelegate::DisplayUpdatePasswordDialog(
     std::vector<std::u16string> usernames,
     int selected_username_index) {
-  // Binding with base::Unretained(this) is safe here because
-  // SaveUpdatePasswordMessageDelegate owns password_edit_dialog_. Callbacks
-  // won't be called after the SaveUpdatePasswordMessageDelegate object is
-  // destroyed.
-  password_edit_dialog_ = password_edit_dialog_factory_.Run(
-      web_contents_.get(),
-      base::BindOnce(
-          &SaveUpdatePasswordMessageDelegate::HandleSavePasswordFromDialog,
-          base::Unretained(this)),
-      base::BindOnce(&SaveUpdatePasswordMessageDelegate::HandleDialogDismissed,
-                     base::Unretained(this)));
+  CreatePasswordEditDialog();
 
   // Password edit dialog factory method can return nullptr when web_contents
   // is not attached to a window. See crbug.com/1049090 for details.
   if (!password_edit_dialog_)
     return;
 
-  std::u16string origin = url_formatter::FormatOriginForSecurityDisplay(
-      url::Origin::Create(passwords_state_.form_manager()->GetURL()),
-      url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS);
-  password_edit_dialog_->Show(
+  password_edit_dialog_->ShowUpdatePasswordDialog(
       usernames, selected_username_index,
       passwords_state_.form_manager()->GetPendingCredentials().password_value,
-      origin, account_email_);
+      account_email_);
 }
 
 unsigned int SaveUpdatePasswordMessageDelegate::GetDisplayUsernames(
@@ -317,6 +341,20 @@
   return selected_username_index;
 }
 
+void SaveUpdatePasswordMessageDelegate::CreatePasswordEditDialog() {
+  // Binding with base::Unretained(this) is safe here because
+  // SaveUpdatePasswordMessageDelegate owns password_edit_dialog_. Callbacks
+  // won't be called after the SaveUpdatePasswordMessageDelegate object is
+  // destroyed.
+  password_edit_dialog_ = password_edit_dialog_factory_.Run(
+      web_contents_.get(),
+      base::BindOnce(
+          &SaveUpdatePasswordMessageDelegate::HandleSavePasswordFromDialog,
+          base::Unretained(this)),
+      base::BindOnce(&SaveUpdatePasswordMessageDelegate::HandleDialogDismissed,
+                     base::Unretained(this)));
+}
+
 void SaveUpdatePasswordMessageDelegate::HandleDialogDismissed(
     bool dialogAccepted) {
   password_edit_dialog_.reset();
@@ -329,7 +367,6 @@
 void SaveUpdatePasswordMessageDelegate::HandleSavePasswordFromDialog(
     const std::u16string& username,
     const std::u16string& password) {
-  DCHECK(passwords_state_.GetCurrentForms().size() > 1);
   UpdatePasswordFormUsernameAndPassword(username, password,
                                         passwords_state_.form_manager());
   passwords_state_.form_manager()->Save();
diff --git a/chrome/browser/password_manager/android/save_update_password_message_delegate.h b/chrome/browser/password_manager/android/save_update_password_message_delegate.h
index 34ae258..5255452 100644
--- a/chrome/browser/password_manager/android/save_update_password_message_delegate.h
+++ b/chrome/browser/password_manager/android/save_update_password_message_delegate.h
@@ -64,6 +64,7 @@
       absl::optional<AccountInfo> account_info,
       bool update_password);
   void CreateMessage(bool update_password);
+  void SetupCogMenu(std::unique_ptr<messages::MessageWrapper>& message);
 
   // Returns the message description depending on whether the password is being
   // saved or updated and if unified password manager is enabled.
@@ -87,11 +88,15 @@
   void HandleSaveButtonClicked();
   void HandleNeverSaveClicked();
   void HandleUpdateButtonClicked();
-  void DisplayUsernameConfirmDialog(std::vector<std::u16string> usernames,
-                                    int selected_username_index);
+  void DisplayEditDialog();
+  void DisplaySavePasswordDialog(std::u16string current_username,
+                                 std::u16string current_password);
+  void DisplayUpdatePasswordDialog(std::vector<std::u16string> usernames,
+                                   int selected_username_index);
   void HandleMessageDismissed(messages::DismissReason dismiss_reason);
   void HandleSavePasswordFromDialog(const std::u16string& username,
                                     const std::u16string& password);
+  void CreatePasswordEditDialog();
   void HandleDialogDismissed(bool dialogAccepted);
 
   void ClearState();
diff --git a/chrome/browser/password_manager/android/save_update_password_message_delegate_unittest.cc b/chrome/browser/password_manager/android/save_update_password_message_delegate_unittest.cc
index 85a7956..4d055428 100644
--- a/chrome/browser/password_manager/android/save_update_password_message_delegate_unittest.cc
+++ b/chrome/browser/password_manager/android/save_update_password_message_delegate_unittest.cc
@@ -3,12 +3,15 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/password_manager/android/save_update_password_message_delegate.h"
+#include <algorithm>
+#include <memory>
 
 #include "base/android/jni_android.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/with_feature_override.h"
 #include "chrome/browser/android/android_theme_resources.h"
 #include "chrome/browser/android/resource_mapper.h"
@@ -40,7 +43,6 @@
 
 namespace {
 constexpr char kDefaultUrl[] = "http://example.com";
-constexpr char16_t kOrigin[] = u"example.com";
 constexpr char16_t kUsername[] = u"username";
 constexpr char16_t kUsername2[] = u"username2";
 constexpr char16_t kPassword[] = u"password";
@@ -55,11 +57,16 @@
 class MockPasswordEditDialog : public PasswordEditDialog {
  public:
   MOCK_METHOD(void,
-              Show,
+              ShowSavePasswordDialog,
+              (const std::u16string& username,
+               const std::u16string& password,
+               const std::string& account_email),
+              (override));
+  MOCK_METHOD(void,
+              ShowUpdatePasswordDialog,
               (const std::vector<std::u16string>& usernames,
                int selected_username_index,
                const std::u16string& password,
-               const std::u16string& origin,
                const std::string& account_email),
               (override));
   MOCK_METHOD(void, Dismiss, (), (override));
@@ -236,6 +243,8 @@
 void SaveUpdatePasswordMessageDelegateTest::TriggerPasswordEditDialog() {
   GetMessageWrapper()->HandleSecondaryActionClick(
       base::android::AttachCurrentThread());
+  // Simulate call from Java to dismiss message on secondary button click.
+  DismissMessage(messages::DismissReason::SECONDARY_ACTION);
 }
 
 void SaveUpdatePasswordMessageDelegateTest::ExpectDismissMessageCall() {
@@ -289,6 +298,7 @@
     bool dialog_accepted) {
   std::move(dialog_dismissed_callback_).Run(dialog_accepted);
 }
+
 void SaveUpdatePasswordMessageDelegateTest::CommitPasswordFormMetrics() {
   // PasswordFormMetricsRecorder::dtor commits accumulated metrics.
   metrics_recorder_.reset();
@@ -568,10 +578,11 @@
       CreateFormManager(GURL(kDefaultUrl), two_forms_best_matches());
   MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
   // Verify parameters to Show() call.
-  EXPECT_CALL(*mock_dialog, Show(ElementsAre(std::u16string(kUsername),
-                                             std::u16string(kUsername2)),
-                                 0, std::u16string(kPassword),
-                                 std::u16string(kOrigin), kAccountEmail));
+  EXPECT_CALL(*mock_dialog, ShowUpdatePasswordDialog(
+                                ElementsAre(std::u16string(kUsername),
+                                            std::u16string(kUsername2)),
+                                /*selected_username_index=*/0,
+                                std::u16string(kPassword), kAccountEmail));
   EnqueueMessage(std::move(form_manager), /*user_signed_in=*/true,
                  /*update_password=*/true);
   TriggerActionClick();
@@ -584,10 +595,11 @@
       CreateFormManager(GURL(kDefaultUrl), two_forms_best_matches());
   MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
   // Verify parameters to Show() call.
-  EXPECT_CALL(*mock_dialog, Show(ElementsAre(std::u16string(kUsername),
-                                             std::u16string(kUsername2)),
-                                 0, std::u16string(kPassword),
-                                 std::u16string(kOrigin), std::string()));
+  EXPECT_CALL(*mock_dialog, ShowUpdatePasswordDialog(
+                                ElementsAre(std::u16string(kUsername),
+                                            std::u16string(kUsername2)),
+                                /*selected_username_index=*/0,
+                                std::u16string(kPassword), std::string()));
   EnqueueMessage(std::move(form_manager), /*user_signed_in=*/false,
                  /*update_password=*/true);
   TriggerActionClick();
@@ -604,7 +616,7 @@
       CreateFormManager(GURL(kDefaultUrl), two_forms_best_matches());
   EXPECT_CALL(*form_manager, Save());
   MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
-  EXPECT_CALL(*mock_dialog, Show);
+  EXPECT_CALL(*mock_dialog, ShowUpdatePasswordDialog);
   EnqueueMessage(std::move(form_manager), /*user_signed_in=*/false,
                  /*update_password=*/true);
   EXPECT_NE(nullptr, GetMessageWrapper());
@@ -633,7 +645,7 @@
       CreateFormManager(GURL(kDefaultUrl), two_forms_best_matches());
   EXPECT_CALL(*form_manager, Save).Times(0);
   MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
-  EXPECT_CALL(*mock_dialog, Show);
+  EXPECT_CALL(*mock_dialog, ShowUpdatePasswordDialog);
   EnqueueMessage(std::move(form_manager), /*user_signed_in=*/false,
                  /*update_password=*/true);
   EXPECT_NE(nullptr, GetMessageWrapper());
@@ -650,4 +662,83 @@
       password_manager::metrics_util::CLICKED_CANCEL, 1);
 }
 
+// Verifies that:
+// 1. Save password dialog is shown after clicking on cog button (secondary
+// action) in the message.
+// 2. Saving the password form is executed after clicking on Save button of the
+// dialog.
+TEST_P(SaveUpdatePasswordMessageDelegateTest,
+       TriggerSaveMessage_CogButton_Accept) {
+  base::test::ScopedFeatureList scoped_feature_state;
+  scoped_feature_state.InitAndEnableFeature(
+      password_manager::features::kPasswordEditDialogWithDetails);
+
+  base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  auto form_manager =
+      CreateFormManager(GURL(kDefaultUrl), empty_best_matches());
+  MockPasswordFormManagerForUI* form_manager_pointer = form_manager.get();
+  MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
+
+  EnqueueMessage(std::move(form_manager), /*user_signed_in=*/false,
+                 /*update_password=*/false);
+  EXPECT_NE(nullptr, GetMessageWrapper());
+  EXPECT_CALL(*mock_dialog, ShowSavePasswordDialog);
+  TriggerPasswordEditDialog();
+
+  EXPECT_EQ(nullptr, GetMessageWrapper());
+  EXPECT_CALL(*form_manager_pointer, Save());
+  TriggerDialogAcceptedCallback(/*username=*/kUsername,
+                                /*password=*/kPassword);
+  // The real password edit dialog triggers dialog dismissed delegate inside.
+  // Here we use the mock that doesn't do this, so the dismiss is called
+  // manually here.
+  TriggerDialogDismissedCallback(/*dialog_accepted=*/true);
+
+  CommitPasswordFormMetrics();
+  VerifyUkmMetrics(
+      test_ukm_recorder,
+      PasswordFormMetricsRecorder::BubbleDismissalReason::kAccepted);
+  histogram_tester.ExpectUniqueSample(
+      kSaveUIDismissalReasonHistogramName,
+      password_manager::metrics_util::CLICKED_ACCEPT, 1);
+}
+
+// Verifies that:
+// 1. Save password dialog is shown after clicking on cog button (secondary
+// action) in the message
+// 2. The dialog is dismissed with negative result after clicking on Cancel
+// button password_edit_dialog_with_details feature is on
+TEST_P(SaveUpdatePasswordMessageDelegateTest,
+       TriggerSaveMessage_CogButton_Cancel) {
+  base::test::ScopedFeatureList scoped_feature_state;
+  scoped_feature_state.InitAndEnableFeature(
+      password_manager::features::kPasswordEditDialogWithDetails);
+
+  base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  auto form_manager =
+      CreateFormManager(GURL(kDefaultUrl), empty_best_matches());
+  MockPasswordFormManagerForUI* form_manager_pointer = form_manager.get();
+  MockPasswordEditDialog* mock_dialog = PreparePasswordEditDialog();
+  EnqueueMessage(std::move(form_manager), /*user_signed_in=*/false,
+                 /*update_password=*/false);
+  EXPECT_NE(nullptr, GetMessageWrapper());
+  EXPECT_CALL(*mock_dialog, ShowSavePasswordDialog);
+  TriggerPasswordEditDialog();
+  EXPECT_EQ(nullptr, GetMessageWrapper());
+  EXPECT_CALL(*form_manager_pointer, Save()).Times(0);
+  TriggerDialogDismissedCallback(/*dialog_accepted=*/false);
+
+  CommitPasswordFormMetrics();
+  VerifyUkmMetrics(
+      test_ukm_recorder,
+      PasswordFormMetricsRecorder::BubbleDismissalReason::kDeclined);
+  histogram_tester.ExpectUniqueSample(
+      kSaveUIDismissalReasonHistogramName,
+      password_manager::metrics_util::CLICKED_CANCEL, 1);
+}
+
 INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(SaveUpdatePasswordMessageDelegateTest);
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
index babe8c9..24cc0e68 100644
--- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
+++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -6,7 +6,6 @@
 
 #include "base/command_line.h"
 #include "base/feature_list.h"
-#include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/rand_util.h"
 #include "base/time/default_clock.h"
diff --git a/chrome/browser/permissions/prediction_service_browsertest.cc b/chrome/browser/permissions/prediction_service_browsertest.cc
index 99dbb5f..952eb95 100644
--- a/chrome/browser/permissions/prediction_service_browsertest.cc
+++ b/chrome/browser/permissions/prediction_service_browsertest.cc
@@ -42,10 +42,17 @@
 class PredictionServiceBrowserTest : public InProcessBrowserTest {
  public:
   PredictionServiceBrowserTest() {
-    scoped_feature_list_.InitWithFeatures(
-        {features::kPermissionOnDeviceNotificationPredictions,
-         optimization_guide::features::kOptimizationHints,
-         optimization_guide::features::kRemoteOptimizationGuideFetching},
+    scoped_feature_list_.InitWithFeaturesAndParameters(
+        {
+            {features::kPermissionOnDeviceNotificationPredictions,
+             {{feature_params::
+                   kPermissionOnDeviceNotificationPredictionsHoldbackChance
+                       .name,
+               "0"}}},
+            {optimization_guide::features::kOptimizationHints, {}},
+            {optimization_guide::features::kRemoteOptimizationGuideFetching,
+             {}},
+        },
         {});
   }
 
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
index 6290413..6cf75305 100644
--- a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
+++ b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
@@ -572,7 +572,7 @@
   EXPECT_CALL(job_creation_handler_, OnJobCreation).WillOnce(SaveArg<0>(&job));
   ReportHostedDomainStatus(true);
   ASSERT_FALSE(IsRequestActive());
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
   ASSERT_TRUE(job.IsActive());
   EXPECT_FALSE(register_completed_);
 
@@ -638,7 +638,7 @@
   EXPECT_CALL(job_creation_handler_, OnJobCreation).WillOnce(SaveArg<0>(&job));
   ReportHostedDomainStatus(true);
   ASSERT_FALSE(IsRequestActive());
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
   ASSERT_TRUE(job.IsActive());
   em::DeviceManagementResponse registration_response;
   std::string expected_dm_token = "dm_token";
@@ -695,7 +695,7 @@
                       SaveArg<0>(&job)));
   // A task to trigger policy fetch should have been posted to the task queue.
   base::RunLoop().RunUntilIdle();
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
   EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH,
             job_type);
 
@@ -709,7 +709,7 @@
   device_management_service_.SendJobOKNow(&job, policy_fetch_response);
   // The callback isn't called until `Store()` completes.
   ASSERT_FALSE(future.IsReady());
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(mock_store_);
 
   mock_store_->NotifyStoreLoaded();
   // `FetchPolicyForSignedInUser()` callback should be executed.
@@ -809,7 +809,7 @@
 
   // Should have no more outstanding requests.
   ASSERT_FALSE(IsRequestActive());
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
   ASSERT_TRUE(job.IsActive());
   EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REGISTRATION,
             job_type);
@@ -850,7 +850,7 @@
 
   // Should have no more outstanding requests.
   ASSERT_FALSE(IsRequestActive());
-  Mock::VerifyAndClearExpectations(this);
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
   ASSERT_TRUE(job.IsActive());
   EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REGISTRATION,
             job_type);
@@ -870,6 +870,54 @@
   ASSERT_FALSE(manager_->core()->service());
 }
 
+// Tests `FetchPolicyForSignedInUser()` with no active client.
+TEST_F(UserPolicySigninServiceTest, FetchPolicyForSignedInUser) {
+  mock_store_->NotifyStoreLoaded();
+  identity_test_env()->MakeAccountAvailable(kTestUser);
+
+  // `FetchPolicyForSignedInUser()` will create a new registered client and
+  // fetch policies with it.
+  DeviceManagementService::JobConfiguration::JobType job_type =
+      DeviceManagementService::JobConfiguration::TYPE_INVALID;
+  DeviceManagementService::JobForTesting job;
+  EXPECT_CALL(job_creation_handler_, OnJobCreation)
+      .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type),
+                      SaveArg<0>(&job)));
+  UserPolicySigninService* signin_service =
+      UserPolicySigninServiceFactory::GetForProfile(profile_.get());
+  network::TestURLLoaderFactory fetch_policy_url_loader_factory;
+  base::test::TestFuture<bool> future;
+  signin_service->FetchPolicyForSignedInUser(
+      test_account_id_, "dm_token", "client-id",
+      fetch_policy_url_loader_factory.GetSafeWeakWrapper(),
+      future.GetCallback());
+  // The client should be registered.
+  ASSERT_TRUE(manager_->IsClientRegistered());
+  // A task to trigger policy fetch should have been posted to the task queue.
+  // Let it execute.
+  base::RunLoop().RunUntilIdle();
+  Mock::VerifyAndClearExpectations(&job_creation_handler_);
+  EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH,
+            job_type);
+
+  // Complete the policy fetch request.
+  EXPECT_CALL(*mock_store_, Store(_));
+  em::DeviceManagementResponse policy_fetch_response;
+  UserPolicyBuilder policy_builder;
+  policy_builder.Build();
+  policy_fetch_response.mutable_policy_response()->add_responses()->CopyFrom(
+      policy_builder.policy());
+  device_management_service_.SendJobOKNow(&job, policy_fetch_response);
+  // The callback isn't called until `Store()` completes.
+  ASSERT_FALSE(future.IsReady());
+  Mock::VerifyAndClearExpectations(mock_store_);
+
+  mock_store_->NotifyStoreLoaded();
+  // `FetchPolicyForSignedInUser()` callback should be executed.
+  ASSERT_TRUE(future.IsReady());
+  EXPECT_TRUE(future.Get());
+}
+
 TEST_F(UserPolicySigninServiceTest, SignOutThenSignInAgain) {
   // Explicitly forcing this call is necessary for the clearing of the primary
   // account to result in the account being fully removed in this testing
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 9bdd8e72..2e218dc 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -204,6 +204,7 @@
     "safety_check_page/safety_check_page.ts",
     "safety_check_page/safety_check_passwords_child.ts",
     "safety_check_page/safety_check_safe_browsing_child.ts",
+    "safety_check_page/safety_check_unused_site_permissions.ts",
     "safety_check_page/safety_check_updates_child.ts",
     "search_engines_page/omnibox_extension_entry.ts",
     "search_engines_page/search_engine_delete_confirmation_dialog.ts",
diff --git a/chrome/browser/resources/settings/autofill_page/password_check.ts b/chrome/browser/resources/settings/autofill_page/password_check.ts
index 5016640a..f72b6492 100644
--- a/chrome/browser/resources/settings/autofill_page/password_check.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_check.ts
@@ -395,7 +395,7 @@
                   PasswordCheckInteraction.EDIT_PASSWORD);
             },
             _error => {
-              // <if expr="not (chromeos_ash or chromeos_lacros)">
+              // <if expr="not is_chromeos">
               this.activePassword_ = null;
               this.onPasswordEditDialogClosed_();
               // </if>
diff --git a/chrome/browser/resources/settings/autofill_page/password_requestor_mixin.ts b/chrome/browser/resources/settings/autofill_page/password_requestor_mixin.ts
index 0d47a152..2b7fc8f 100644
--- a/chrome/browser/resources/settings/autofill_page/password_requestor_mixin.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_requestor_mixin.ts
@@ -38,7 +38,7 @@
                 });
           });
           // </if>
-          // <if expr="not (chromeos_ash or chromeos_lacros)">
+          // <if expr="not is_chromeos">
           return PasswordManagerImpl.getInstance().requestPlaintextPassword(
               id, reason);
           // </if>
diff --git a/chrome/browser/resources/settings/autofill_page/user_util_mixin.ts b/chrome/browser/resources/settings/autofill_page/user_util_mixin.ts
index a7c18d06..59ce063 100644
--- a/chrome/browser/resources/settings/autofill_page/user_util_mixin.ts
+++ b/chrome/browser/resources/settings/autofill_page/user_util_mixin.ts
@@ -119,7 +119,7 @@
               syncBrowserProxy.sendSyncPrefsChanged();
 
 
-              // <if expr="not (chromeos_ash or chromeos_lacros)">
+              // <if expr="not is_chromeos">
               // For non-ChromeOS, non-Lacros, also check whether accounts are
               // available.
               const storedAccountsChanged = (accounts: StoredAccount[]) => {
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.html b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.html
index 51fc99b1..9f5a2a5 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.html
@@ -48,7 +48,8 @@
   }
 
   #kerberosDomain {
-    color: black;
+    color: var(--cros-text-color-primary);
+    padding-inline-end: 8px;
     white-space: nowrap;
   }
 </style>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
index ee19480a..d8bc44d5 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -593,7 +593,7 @@
 
   private shouldShowFooter_(): boolean {
     let showFooter = false;
-    // <if expr="not chromeos_ash and not chromeos_lacros">
+    // <if expr="not is_chromeos">
     showFooter = !!this.syncStatus && !!this.syncStatus!.signedIn;
     // </if>
     return showFooter;
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
index ed501ab..2a6b623 100644
--- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
@@ -48,3 +48,8 @@
       </settings-safety-check-chrome-cleaner-child>
 </if>
     </iron-collapse>
+    <template is="dom-if" if="[[safetyCheckPermissionsEnabled_]]"
+        restamp>
+      <settings-safety-check-unused-site-permissions>
+      </settings-safety-check-unused-site-permissions>
+    </template>
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts b/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts
index 13a749d..3cafedc 100644
--- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.ts
@@ -31,6 +31,7 @@
 import {flush, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {HatsBrowserProxyImpl, TrustSafetyInteraction} from '../hats_browser_proxy.js';
+import {loadTimeData} from '../i18n_setup.js';
 import {MetricsBrowserProxy, MetricsBrowserProxyImpl, SafetyCheckInteractions} from '../metrics_browser_proxy.js';
 import {routes} from '../route.js';
 import {Router} from '../router.js';
@@ -66,11 +67,23 @@
 
       /** UI string to display for the parent status. */
       parentDisplayString_: String,
+
+      /**
+       * Boolean that decides if the entry point for unused site permissions
+       * should be shown.
+       */
+      safetyCheckPermissionsEnabled_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('safetyCheckPermissionsEnabled');
+        },
+      },
     };
   }
 
   private parentStatus_: SafetyCheckParentStatus;
   private parentDisplayString_: string;
+  private safetyCheckPermissionsEnabled_: boolean;
   private safetyCheckBrowserProxy_: SafetyCheckBrowserProxy =
       SafetyCheckBrowserProxyImpl.getInstance();
   private metricsBrowserProxy_: MetricsBrowserProxy =
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.html b/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.html
new file mode 100644
index 0000000..c6bcfe7
--- /dev/null
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.html
@@ -0,0 +1,9 @@
+<settings-safety-check-child
+    id="safetyCheckChild"
+    icon-status="[[iconStatus_]]"
+    label="$i18n{safetyCheckUnusedSitePermissionsPrimaryLabel}"
+    button-label="$i18n{safetyCheckReview}"
+    button-aria-label="$i18n{safetyCheckReview}"
+    on-button-click="onButtonClick_"
+    role="presentation">
+</settings-safety-check-child>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.ts b/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.ts
new file mode 100644
index 0000000..832996f9
--- /dev/null
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_unused_site_permissions.ts
@@ -0,0 +1,67 @@
+// Copyright 2022 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.
+
+/**
+ * @fileoverview
+ * 'settings-safety-unused-site-permissions' is the settings page containing the
+ * safety check unused site permissions module showing the unused sites that has
+ * some granted permissions.
+ */
+
+import './safety_check_child.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {routes} from '../route.js';
+import {Router} from '../router.js';
+
+import {SafetyCheckIconStatus} from './safety_check_child.js';
+import {getTemplate} from './safety_check_unused_site_permissions.html.js';
+
+export interface SettingsSafetyCheckUnusedSitePermissionsElement {
+  $: {
+    'safetyCheckChild': SettingsSafetyCheckUnusedSitePermissionsElement,
+  };
+}
+
+export class SettingsSafetyCheckUnusedSitePermissionsElement extends
+    PolymerElement {
+  static get is() {
+    return 'settings-safety-check-unused-site-permissions';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      iconStatus_: {
+        type: SafetyCheckIconStatus,
+        value() {
+          return SafetyCheckIconStatus.WARNING;
+        },
+      },
+    };
+  }
+
+  private iconStatus_: SafetyCheckIconStatus;
+
+  private onButtonClick_() {
+    Router.getInstance().navigateTo(
+        routes.SITE_SETTINGS, /* dynamicParams= */ undefined,
+        /* removeSearch= */ true);
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-safety-check-unused-site-permissions':
+        SettingsSafetyCheckUnusedSitePermissionsElement;
+  }
+}
+
+customElements.define(
+    SettingsSafetyCheckUnusedSitePermissionsElement.is,
+    SettingsSafetyCheckUnusedSitePermissionsElement);
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts
index c336d48..883910d 100644
--- a/chrome/browser/resources/settings/settings.ts
+++ b/chrome/browser/resources/settings/settings.ts
@@ -76,6 +76,7 @@
 export {SettingsSafetyCheckPageElement} from './safety_check_page/safety_check_page.js';
 export {SettingsSafetyCheckPasswordsChildElement} from './safety_check_page/safety_check_passwords_child.js';
 export {SettingsSafetyCheckSafeBrowsingChildElement} from './safety_check_page/safety_check_safe_browsing_child.js';
+export {SettingsSafetyCheckUnusedSitePermissionsElement} from './safety_check_page/safety_check_unused_site_permissions.js';
 export {SettingsSafetyCheckUpdatesChildElement} from './safety_check_page/safety_check_updates_child.js';
 export {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesBrowserProxyImpl, SearchEnginesInfo, SearchEnginesInteractions} from './search_engines_page/search_engines_browser_proxy.js';
 export {SettingsSearchPageElement} from './search_page/search_page.js';
diff --git a/chrome/browser/search/background/ntp_custom_background_service.cc b/chrome/browser/search/background/ntp_custom_background_service.cc
index 146329a..4a54f87 100644
--- a/chrome/browser/search/background/ntp_custom_background_service.cc
+++ b/chrome/browser/search/background/ntp_custom_background_service.cc
@@ -200,7 +200,7 @@
   // RevertBackgroundChanges is called.
   if (previous_background_info_ == absl::nullopt) {
     previous_background_info_ = absl::make_optional(
-        pref_service_->Get(prefs::kNtpCustomBackgroundDict)->Clone());
+        pref_service_->GetValue(prefs::kNtpCustomBackgroundDict).Clone());
     previous_local_background_ = false;
   }
 
@@ -362,8 +362,8 @@
   bool managed =
       pref_service_->IsManagedPreference(prefs::kNtpCustomBackgroundDict);
   if (managed) {
-    DCHECK(pref_service_->GetDictionary(prefs::kNtpCustomBackgroundDict)
-               ->DictEmpty());
+    DCHECK(
+        pref_service_->GetValueDict(prefs::kNtpCustomBackgroundDict).empty());
   }
   return managed;
 }
diff --git a/chrome/browser/sharing/sharing_sync_preference.cc b/chrome/browser/sharing/sharing_sync_preference.cc
index 68b2c1c..2d66873 100644
--- a/chrome/browser/sharing/sharing_sync_preference.cc
+++ b/chrome/browser/sharing/sharing_sync_preference.cc
@@ -50,14 +50,13 @@
 }
 
 absl::optional<syncer::DeviceInfo::SharingTargetInfo> ValueToTargetInfo(
-    const base::Value& value) {
-  const std::string* fcm_token = value.FindStringKey(kDeviceFcmToken);
+    const base::Value::Dict& dict) {
+  const std::string* fcm_token = dict.FindString(kDeviceFcmToken);
   if (!fcm_token)
     return absl::nullopt;
 
-  const std::string* base64_p256dh = value.FindStringKey(kDeviceP256dh);
-  const std::string* base64_auth_secret =
-      value.FindStringKey(kDeviceAuthSecret);
+  const std::string* base64_p256dh = dict.FindString(kDeviceP256dh);
+  const std::string* base64_auth_secret = dict.FindString(kDeviceAuthSecret);
 
   std::string p256dh, auth_secret;
   if (!base64_p256dh || !base64_auth_secret ||
@@ -112,9 +111,10 @@
 
 absl::optional<std::vector<uint8_t>> SharingSyncPreference::GetVapidKey()
     const {
-  const base::Value* vapid_key = prefs_->GetDictionary(prefs::kSharingVapidKey);
+  const base::Value::Dict& vapid_key =
+      prefs_->GetValueDict(prefs::kSharingVapidKey);
   const std::string* base64_private_key =
-      vapid_key->FindStringKey(kVapidECPrivateKey);
+      vapid_key.FindString(kVapidECPrivateKey);
 
   if (!base64_private_key)
     return absl::nullopt;
@@ -154,12 +154,12 @@
 
 absl::optional<SharingSyncPreference::FCMRegistration>
 SharingSyncPreference::GetFCMRegistration() const {
-  const base::Value* registration =
-      prefs_->GetDictionary(prefs::kSharingFCMRegistration);
+  const base::Value::Dict& registration =
+      prefs_->GetValueDict(prefs::kSharingFCMRegistration);
   const std::string* authorized_entity_ptr =
-      registration->FindStringKey(kRegistrationAuthorizedEntity);
+      registration.FindString(kRegistrationAuthorizedEntity);
   const base::Value* timestamp_value =
-      registration->FindKey(kRegistrationTimestamp);
+      registration.Find(kRegistrationTimestamp);
   if (!timestamp_value)
     return absl::nullopt;
 
@@ -239,15 +239,15 @@
 // static
 absl::optional<syncer::DeviceInfo::SharingInfo>
 SharingSyncPreference::GetLocalSharingInfoForSync(PrefService* prefs) {
-  const base::Value* registration =
-      prefs->GetDictionary(prefs::kSharingLocalSharingInfo);
+  const base::Value::Dict& registration =
+      prefs->GetValueDict(prefs::kSharingLocalSharingInfo);
 
-  const base::Value* vapid_target_info_value =
-      registration->FindDictKey(kSharingInfoVapidTargetInfo);
-  const base::Value* sender_id_target_info_value =
-      registration->FindDictKey(kSharingInfoSenderIdTargetInfo);
-  const base::Value* enabled_features_value =
-      registration->FindListKey(kSharingInfoEnabledFeatures);
+  const base::Value::Dict* vapid_target_info_value =
+      registration.FindDict(kSharingInfoVapidTargetInfo);
+  const base::Value::Dict* sender_id_target_info_value =
+      registration.FindDict(kSharingInfoSenderIdTargetInfo);
+  const base::Value::List* enabled_features_value =
+      registration.FindList(kSharingInfoEnabledFeatures);
   if (!vapid_target_info_value || !sender_id_target_info_value ||
       !enabled_features_value) {
     return absl::nullopt;
@@ -259,7 +259,7 @@
     return absl::nullopt;
 
   std::set<SharingSpecificFields::EnabledFeatures> enabled_features;
-  for (auto& value : enabled_features_value->GetListDeprecated()) {
+  for (auto& value : *enabled_features_value) {
     DCHECK(value.is_int());
     int feature_value = value.GetInt();
     // Filter invalid enums from other browser versions.
diff --git a/chrome/browser/sharing/sharing_sync_preference_unittest.cc b/chrome/browser/sharing/sharing_sync_preference_unittest.cc
index 717b903..a24086bf 100644
--- a/chrome/browser/sharing/sharing_sync_preference_unittest.cc
+++ b/chrome/browser/sharing/sharing_sync_preference_unittest.cc
@@ -57,17 +57,17 @@
   }
 
   void AddEnabledFeature(int feature) {
-    const base::Value* registration =
-        prefs_.GetDictionary(prefs::kSharingLocalSharingInfo);
-    base::Value enabled_features =
-        registration->FindListKey(kSharingInfoEnabledFeatures)->Clone();
+    const base::Value::Dict& registration =
+        prefs_.GetValueDict(prefs::kSharingLocalSharingInfo);
+    base::Value::List enabled_features =
+        registration.FindList(kSharingInfoEnabledFeatures)->Clone();
 
     enabled_features.Append(feature);
 
     DictionaryPrefUpdate local_sharing_info_update(
         &prefs_, prefs::kSharingLocalSharingInfo);
-    local_sharing_info_update->SetKey(kSharingInfoEnabledFeatures,
-                                      std::move(enabled_features));
+    local_sharing_info_update->GetDict().Set(kSharingInfoEnabledFeatures,
+                                             std::move(enabled_features));
   }
 
   sync_preferences::TestingPrefServiceSyncable prefs_;
diff --git a/chrome/browser/signin/investigator_dependency_provider.cc b/chrome/browser/signin/investigator_dependency_provider.cc
deleted file mode 100644
index 601806d..0000000
--- a/chrome/browser/signin/investigator_dependency_provider.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 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/signin/investigator_dependency_provider.h"
-
-InvestigatorDependencyProvider::InvestigatorDependencyProvider(Profile* profile)
-    : profile_(profile) {}
-
-InvestigatorDependencyProvider::~InvestigatorDependencyProvider() {}
-
-PrefService* InvestigatorDependencyProvider::GetPrefs() {
-  return profile_->GetPrefs();
-}
diff --git a/chrome/browser/signin/investigator_dependency_provider.h b/chrome/browser/signin/investigator_dependency_provider.h
deleted file mode 100644
index 199f7bb0..0000000
--- a/chrome/browser/signin/investigator_dependency_provider.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 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_SIGNIN_INVESTIGATOR_DEPENDENCY_PROVIDER_H_
-#define CHROME_BROWSER_SIGNIN_INVESTIGATOR_DEPENDENCY_PROVIDER_H_
-
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/prefs/pref_service.h"
-#include "components/signin/core/browser/signin_investigator.h"
-
-// This version should work for anything with a profile object, like desktop and
-// Android.
-class InvestigatorDependencyProvider
-    : public SigninInvestigator::DependencyProvider {
- public:
-  explicit InvestigatorDependencyProvider(Profile* profile);
-
-  InvestigatorDependencyProvider(const InvestigatorDependencyProvider&) =
-      delete;
-  InvestigatorDependencyProvider& operator=(
-      const InvestigatorDependencyProvider&) = delete;
-
-  ~InvestigatorDependencyProvider() override;
-  PrefService* GetPrefs() override;
-
- private:
-  // Non-owning pointer.
-  raw_ptr<Profile> profile_;
-};
-
-#endif  // CHROME_BROWSER_SIGNIN_INVESTIGATOR_DEPENDENCY_PROVIDER_H_
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
index 57f9ee87..869a8bc7 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -277,7 +277,6 @@
             // Only send X-Geo header if the user hasn't disabled geolocation for url.
             if (isLocationDisabledForUrl(profile, uri)) {
                 if (recordUma) recordHistogram(UMA_LOCATION_DISABLED_FOR_GOOGLE_DOMAIN);
-                Log.i(TAG, "[crbug/1338183] Site permission is missing");
                 return HeaderState.LOCATION_PERMISSION_BLOCKED;
             }
 
@@ -461,23 +460,12 @@
      * geolocation infobar).
      */
     static boolean isLocationDisabledForUrl(Profile profile, Uri uri) {
-        Log.i(TAG, "[crbug/1338183] uri: " + uri);
-        Log.i(TAG, "[crbug/1338183] profile.OTR: " + profile.isOffTheRecord());
-        Log.i(TAG,
-                "[crbug/1338183] getBrowserProfileTypeFromProfile: "
-                        + Profile.getBrowserProfileTypeFromProfile(profile));
-        Log.i(TAG,
-                "[crbug/1338183] profile.getNativeBrowserContextPointer: "
-                        + profile.getNativeBrowserContextPointer());
-
         // TODO(raymes): The call to isDSEOrigin is only needed if this could be called for
         // an origin that isn't the default search engine. Otherwise remove this line.
         boolean isDSEOrigin = WebsitePreferenceBridge.isDSEOrigin(profile, uri.toString());
-        Log.i(TAG, "[crbug/1338183] isDSEOrigin: " + isDSEOrigin);
         @ContentSettingValues
         @Nullable
         Integer settingValue = locationContentSettingForUrl(profile, uri);
-        Log.i(TAG, "[crbug/1338183] settingValue: " + settingValue);
 
         boolean enabled = isDSEOrigin && settingValue == ContentSettingValues.ALLOW;
         return !enabled;
diff --git a/chrome/browser/ui/android/signin/BUILD.gn b/chrome/browser/ui/android/signin/BUILD.gn
index 4fad3f1..6a6d411 100644
--- a/chrome/browser/ui/android/signin/BUILD.gn
+++ b/chrome/browser/ui/android/signin/BUILD.gn
@@ -51,13 +51,13 @@
     "java/src/org/chromium/chrome/browser/ui/signin/GoogleActivityController.java",
     "java/src/org/chromium/chrome/browser/ui/signin/PersonalizedSigninPromoView.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SignOutDialogCoordinator.java",
-    "java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SigninScrollView.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SigninView.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentActivityLauncher.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentView.java",
+    "java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java",
     "java/src/org/chromium/chrome/browser/ui/signin/TangibleSyncCoordinator.java",
     "java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetCoordinator.java",
     "java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetMediator.java",
@@ -139,7 +139,7 @@
   sources = [
     "junit/src/org/chromium/chrome/browser/ui/signin/ConfirmSyncDataStateMachineTest.java",
     "junit/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoTest.java",
-    "junit/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerTest.java",
+    "junit/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerTest.java",
     "junit/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerMediatorTest.java",
     "junit/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegateTest.java",
   ]
@@ -175,7 +175,7 @@
 android_library("javatests") {
   testonly = true
   sources = [
-    "java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java",
+    "java/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerRenderTest.java",
     "java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetRenderTest.java",
     "java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetTest.java",
   ]
diff --git a/chrome/browser/ui/android/signin/DEPS b/chrome/browser/ui/android/signin/DEPS
index f3ede55..7060c5f 100644
--- a/chrome/browser/ui/android/signin/DEPS
+++ b/chrome/browser/ui/android/signin/DEPS
@@ -9,10 +9,7 @@
   : [
   "+content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java"
   ],
-  "SigninPromoController.java": [
-  "+chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java"
-  ],
   "SyncPromoController.java": [
-  "+chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java"
+  "+chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java"
   ],
 }
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
similarity index 98%
rename from chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java
rename to chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
index 74dea56..67a500f 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoController.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java
@@ -47,12 +47,12 @@
 import java.lang.annotation.RetentionPolicy;
 
 /**
- * A controller for configuring the sign in promo. It sets up the sign in promo depending on the
+ * A controller for configuring the sync promo. It sets up the sync promo depending on the
  * context: whether there are any Google accounts on the device which have been previously signed in
  * or not. The controller also takes care of counting impressions, recording signin related user
  * actions and histograms.
  */
-public class SigninPromoController {
+public class SyncPromoController {
     /** Specifies the various states of sync promo. */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({
@@ -259,11 +259,11 @@
     }
 
     /**
-     * Creates a new SigninPromoController.
+     * Creates a new SyncPromoController.
      * @param accessPoint Specifies the AccessPoint from which the promo is to be shown.
      * @param syncConsentActivityLauncher Launcher of {@link SyncConsentActivity}.
      */
-    public SigninPromoController(
+    public SyncPromoController(
             @AccessPoint int accessPoint, SyncConsentActivityLauncher syncConsentActivityLauncher) {
         mAccessPoint = accessPoint;
         mSyncConsentActivityLauncher = syncConsentActivityLauncher;
@@ -352,10 +352,10 @@
      * Sets up the sync promo view.
      * @param profileDataCache The {@link ProfileDataCache} that stores profile data.
      * @param view The {@link PersonalizedSigninPromoView} that should be set up.
-     * @param listener The {@link SigninPromoController.OnDismissListener} to be set to the view.
+     * @param listener The {@link SyncPromoController.OnDismissListener} to be set to the view.
      */
     public void setUpSyncPromoView(ProfileDataCache profileDataCache,
-            PersonalizedSigninPromoView view, SigninPromoController.OnDismissListener listener) {
+            PersonalizedSigninPromoView view, SyncPromoController.OnDismissListener listener) {
         final IdentityManager identityManager = IdentityServicesProvider.get().getIdentityManager(
                 Profile.getLastUsedRegularProfile());
         assert !identityManager.hasPrimaryAccount(ConsentLevel.SYNC) : "Sync is already enabled!";
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerRenderTest.java
similarity index 98%
rename from chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java
rename to chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerRenderTest.java
index be359df..92888e3c 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerRenderTest.java
@@ -49,7 +49,7 @@
 
 import java.util.List;
 
-/** Render tests of SigninPromoController. */
+/** Render tests of SyncPromoController. */
 @RunWith(ParameterizedRunner.class)
 @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@@ -59,7 +59,7 @@
         ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON,
         ChromeFeatureList.SYNC_ANDROID_PROMOS_WITH_TITLE,
 })
-public class SigninPromoControllerRenderTest {
+public class SyncPromoControllerRenderTest {
     @ParameterAnnotations.ClassParameter
     private static List<ParameterSet> sClassParams =
             new NightModeTestUtils.NightModeParams().getParameters();
@@ -94,7 +94,7 @@
     public void setUp() {
         // TODO(crbug.com/1297981): Remove dependency on ChromeTabbedActivityTestRule.
         // Starting ChromeTabbedActivityTestRule to initialize the browser, which is needed when
-        // SigninPromoController.setUpSyncPromoView() is called.
+        // SyncPromoController.setUpSyncPromoView() is called.
         mChromeActivityTestRule.startMainActivityOnBlankPage();
         mActivityTestRule.launchActivity(null);
         ApplicationTestUtils.waitForActivityState(mActivityTestRule.getActivity(), Stage.RESUMED);
@@ -103,7 +103,7 @@
     /**
      * @param nightModeEnabled A nitght mode flag injected by @ParameterAnnotations.ClassParameter.
      */
-    public SigninPromoControllerRenderTest(boolean nightModeEnabled) {
+    public SyncPromoControllerRenderTest(boolean nightModeEnabled) {
         NightModeTestUtils.setUpNightModeForBlankUiTestActivity(nightModeEnabled);
         mRenderTestRule.setNightModeEnabled(nightModeEnabled);
     }
@@ -1026,7 +1026,7 @@
     }
 
     // TODO(crbug.com/1314490): In production we observe the onProfileDataUpdated() event and then
-    // update the view, but that's done outside of SigninPromoController, the logic is duplicated
+    // update the view, but that's done outside of SyncPromoController, the logic is duplicated
     // for each entry point. In the long term, we should have a single observer internal to the UI
     // component. Then these tests can just wait for the right data to appear with espresso.
     private ProfileDataCache createProfileDataCacheAndWaitForAccountData() throws Throwable {
@@ -1055,9 +1055,9 @@
                     new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                             ViewGroup.LayoutParams.WRAP_CONTENT));
             activity.setContentView(content);
-            SigninPromoController signinPromoController =
-                    new SigninPromoController(accessPoint, mSyncConsentActivityLauncher);
-            signinPromoController.setUpSyncPromoView(profileDataCache,
+            SyncPromoController syncPromoController =
+                    new SyncPromoController(accessPoint, mSyncConsentActivityLauncher);
+            syncPromoController.setUpSyncPromoView(profileDataCache,
                     promoView.findViewById(R.id.signin_promo_view_container),
                     accessPoint == SigninAccessPoint.RECENT_TABS ? null : () -> {});
             return promoView;
diff --git a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerTest.java b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerTest.java
similarity index 81%
rename from chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerTest.java
rename to chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerTest.java
index 22139ec..ec893d08 100644
--- a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerTest.java
+++ b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SyncPromoControllerTest.java
@@ -35,11 +35,11 @@
 import org.chromium.components.signin.test.util.FakeAccountManagerFacade;
 
 /**
- * Tests for {@link SigninPromoController}.
+ * Tests for {@link SyncPromoController}.
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Features.DisableFeatures({ChromeFeatureList.FORCE_DISABLE_EXTENDED_SYNC_PROMOS})
-public class SigninPromoControllerTest {
+public class SyncPromoControllerTest {
     private static final int TIME_SINCE_FIRST_SHOWN_LIMIT_HOURS = 100;
     private static final long TIME_SINCE_FIRST_SHOWN_LIMIT_MS =
             TIME_SINCE_FIRST_SHOWN_LIMIT_HOURS * DateUtils.HOUR_IN_MILLIS;
@@ -74,7 +74,7 @@
         IdentityServicesProvider.setInstanceForTests(mock(IdentityServicesProvider.class));
         when(IdentityServicesProvider.get().getIdentityManager(Profile.getLastUsedRegularProfile()))
                 .thenReturn(mIdentityManagerMock);
-        mSharedPreferencesManager.writeInt(SigninPromoController.getPromoShowCountPreferenceName(
+        mSharedPreferencesManager.writeInt(SyncPromoController.getPromoShowCountPreferenceName(
                                                    SigninAccessPoint.NTP_CONTENT_SUGGESTIONS),
                 0);
         mSharedPreferencesManager.writeLong(
@@ -86,7 +86,7 @@
     @Test
     public void shouldShowSyncPromoForNTPWhenNoAccountOnDevice() {
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -97,7 +97,7 @@
                 mAccountCapabilitiesBuilder.setCanOfferExtendedSyncPromos(true).build());
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -106,7 +106,7 @@
         mAccountManagerTestRule.addAccount("test.account.secondary@gmail.com");
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -117,31 +117,31 @@
                 mAccountCapabilitiesBuilder.setCanOfferExtendedSyncPromos(false).build());
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
     public void shouldShowNTPSyncPromoWhenCountLimitIsNotExceeded() {
         StartSurfaceConfiguration.SIGNIN_PROMO_NTP_COUNT_LIMIT.setForTesting(
                 MAX_SIGN_IN_PROMO_IMPRESSIONS);
-        mSharedPreferencesManager.writeInt(SigninPromoController.getPromoShowCountPreferenceName(
+        mSharedPreferencesManager.writeInt(SyncPromoController.getPromoShowCountPreferenceName(
                                                    SigninAccessPoint.NTP_CONTENT_SUGGESTIONS),
                 MAX_SIGN_IN_PROMO_IMPRESSIONS - 1);
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
     public void shouldHideNTPSyncPromoWhenCountLimitIsExceeded() {
         StartSurfaceConfiguration.SIGNIN_PROMO_NTP_COUNT_LIMIT.setForTesting(
                 MAX_SIGN_IN_PROMO_IMPRESSIONS);
-        mSharedPreferencesManager.writeInt(SigninPromoController.getPromoShowCountPreferenceName(
+        mSharedPreferencesManager.writeInt(SyncPromoController.getPromoShowCountPreferenceName(
                                                    SigninAccessPoint.NTP_CONTENT_SUGGESTIONS),
                 MAX_SIGN_IN_PROMO_IMPRESSIONS);
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -154,7 +154,7 @@
                 -1);
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -166,7 +166,7 @@
                 TIME_SINCE_FIRST_SHOWN_LIMIT_HOURS);
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -179,7 +179,7 @@
                 TIME_SINCE_FIRST_SHOWN_LIMIT_HOURS);
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -190,12 +190,12 @@
         disableNTPSyncPromoBySettingLimits(
                 firstShownTime, lastShownTime, /*signinPromoResetAfterHours=*/-1);
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
 
-        SigninPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
+        SyncPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
         Assert.assertEquals(firstShownTime,
                 SharedPreferencesManager.getInstance().readLong(
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_FIRST_SHOWN_TIME));
@@ -204,7 +204,7 @@
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_LAST_SHOWN_TIME));
         Assert.assertEquals(MAX_SIGN_IN_PROMO_IMPRESSIONS,
                 SharedPreferencesManager.getInstance().readInt(
-                        SigninPromoController.getPromoShowCountPreferenceName(
+                        SyncPromoController.getPromoShowCountPreferenceName(
                                 SigninAccessPoint.NTP_CONTENT_SUGGESTIONS)));
     }
 
@@ -215,12 +215,12 @@
         final long lastShownTime = System.currentTimeMillis();
         disableNTPSyncPromoBySettingLimits(firstShownTime, lastShownTime, RESET_AFTER_HOURS);
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
 
-        SigninPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
+        SyncPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
         Assert.assertEquals(firstShownTime,
                 SharedPreferencesManager.getInstance().readLong(
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_FIRST_SHOWN_TIME));
@@ -229,7 +229,7 @@
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_LAST_SHOWN_TIME));
         Assert.assertEquals(MAX_SIGN_IN_PROMO_IMPRESSIONS,
                 SharedPreferencesManager.getInstance().readInt(
-                        SigninPromoController.getPromoShowCountPreferenceName(
+                        SyncPromoController.getPromoShowCountPreferenceName(
                                 SigninAccessPoint.NTP_CONTENT_SUGGESTIONS)));
     }
 
@@ -240,12 +240,12 @@
         final long lastShownTime = System.currentTimeMillis() - RESET_AFTER_MS - 1;
         disableNTPSyncPromoBySettingLimits(firstShownTime, lastShownTime, RESET_AFTER_HOURS);
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
 
-        SigninPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
+        SyncPromoController.resetNTPSyncPromoLimitsIfHiddenForTooLong();
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
         Assert.assertEquals(0L,
                 SharedPreferencesManager.getInstance().readLong(
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_FIRST_SHOWN_TIME));
@@ -254,7 +254,7 @@
                         ChromePreferenceKeys.SIGNIN_PROMO_NTP_LAST_SHOWN_TIME));
         Assert.assertEquals(0,
                 SharedPreferencesManager.getInstance().readInt(
-                        SigninPromoController.getPromoShowCountPreferenceName(
+                        SyncPromoController.getPromoShowCountPreferenceName(
                                 SigninAccessPoint.NTP_CONTENT_SUGGESTIONS)));
     }
 
@@ -264,7 +264,7 @@
                 ChromePreferenceKeys.SIGNIN_PROMO_NTP_PROMO_DISMISSED, false);
 
         Assert.assertTrue(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     @Test
@@ -273,7 +273,7 @@
                 ChromePreferenceKeys.SIGNIN_PROMO_NTP_PROMO_DISMISSED, true);
 
         Assert.assertFalse(
-                SigninPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
+                SyncPromoController.canShowSyncPromo(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS));
     }
 
     private void disableNTPSyncPromoBySettingLimits(
@@ -284,7 +284,7 @@
                 signinPromoResetAfterHours);
 
         SharedPreferencesManager.getInstance().writeInt(
-                SigninPromoController.getPromoShowCountPreferenceName(
+                SyncPromoController.getPromoShowCountPreferenceName(
                         SigninAccessPoint.NTP_CONTENT_SUGGESTIONS),
                 MAX_SIGN_IN_PROMO_IMPRESSIONS);
         SharedPreferencesManager.getInstance().writeLong(
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 0d4c8e0..224bfbef 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1055,14 +1055,14 @@
       <message name="IDS_PRIVACY_SANDBOX_CONSENT_HEADING_ONE" desc="1 of 2 subtitles on the page. We want to write for users who skim the page. That means that the page title, the sub titles, and the button label all work well together as a mini story: 1) Help us build a more private web How? 2) Limit sharing between sites 3) More control over the ads you see 4) Yes, I’ll try it">
         Limited sharing between sites
       </message>
-      <message name="IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE" desc="* “exploring” conveys that this is a work in progress. * “restrict” means to lessen. We don’t want to suggest that we’re “eliminating” cross-site tracking. * “cross-site tracking”: An example: a user visits site A and then site B. Based on how third-party cookies work today, when that user later visits site C, site C can be aware that the user visited sites A and B, and can even have some sense for what they did on those sites. * “stop ad spam and fraud”:  This feature isn’t really related to restricting cross-site tracking but we combined these features in the same sentence / section for structural reasons.">
-        We’re exploring ways to restrict cross-site tracking while enabling sites to stop ad spam and fraud.
+      <message name="IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE" desc="The description beneath the “Limited sharing between sites” subtitle. * “exploring” conveys that this is a work in progress. * “restrict” means to lessen. We don’t want to suggest that we’re “eliminating” cross-site tracking. * “tracking”: An example: a user visits site A and then site B. Based on how third-party cookies work today, when that user later visits site C, site C can be aware that the user visited sites A and B, and can even have some sense for what they did on those sites. * “stop ad spam and fraud”:  This feature isn’t really related to restricting cross-site tracking but we combined these features in the same sentence / section for structural reasons.">
+        We’re exploring ways to restrict tracking while enabling sites to stop ad spam and fraud.
       </message>
       <message name="IDS_PRIVACY_SANDBOX_CONSENT_HEADING_TWO" desc="2 of 2 subtitles on the page. We want to write for users who skim the page. That means that the page title, the sub titles, and the button label all work well together as a mini story: 1) Help us build a more private web How? 2) Limit sharing between sites 3) More control over the ads you see 4) Yes, I’ll try it">
         More control over the ads you see
       </message>
-      <message name="IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO" desc="A paragraph beneath the “More control over the ads you see” subtitle. * “During the trials”: The trials happens in addition to today’s current system based on third-party cookies. In other words, even by agreeing to or remaining in a trial,, the user’s core experience doesn’t change much. This is an experiment, and we need the user to understand as much. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
-        During the trials, you can see and remove topics of interest sites use to show you ads. Chrome estimates your interests based on your recent browsing history.
+      <message name="IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO" desc="A paragraph beneath the “More control over the ads you see” subtitle. * “see and remove topics of interests”: we want to stress the element of control * “estimate topics”: Topics of interest include things like “Live comedy” and “Rock music”. Chrome estimates these interests based on the sites users visit. It’s an “estimation”, and we don’t want to suggest that we know with certainty the user’s interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “recent browsing history”: Later in the UI, we define this as “a record of sites you’ve visited using Chrome on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI).">
+        You can see and remove topics of interest sites use to show you ads. Chrome estimates your interests based on your recent browsing history.
       </message>
       <message name="IDS_PRIVACY_SANDBOX_CONSENT_DROPDOWN_BUTTON" desc="Learn more link * Unfolds content within the page * The text that appears describes 2 ways in which a site can target ads: the “Topics API” and the “FLEDGE API”. You can see what those are at www.privacysanbox.com or they’re described for the user’s benefit in other text. * “ad personalization” can mean different things in different contexts. Here, we’re using it as a simple noun. In other words, it’s not the name of a control but a descriptive term used to describe the personalization of ads in the Chrome browser. This “ad personalization” shouldn’t be confused with the setting in the Google Account called “Ad personalization”.">
         Learn more about ad personalization in Chrome
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE.png.sha1
index e1a8b608..3404a9fc 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE.png.sha1
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_ONE.png.sha1
@@ -1 +1 @@
-d0b55c5a76913fc2ff562cec1d05161d7f322fc1
\ No newline at end of file
+f87822abec85a19f48878b2a65d71ce89f10deac
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO.png.sha1
index a96401f..3404a9fc 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO.png.sha1
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_SANDBOX_CONSENT_DESCRIPTION_TWO.png.sha1
@@ -1 +1 @@
-57a800558d08cf3315a65bc250aef1cde230e447
\ No newline at end of file
+f87822abec85a19f48878b2a65d71ce89f10deac
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
index dfdca94..08883bc1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -779,6 +779,7 @@
 <translation id="5308380583665731573">Sambung</translation>
 <translation id="5317780077021120954">Simpan</translation>
 <translation id="5319359161174645648">Google mengesyorkan Chrome</translation>
+<translation id="5321849971085220133">Chrome sedang mencari cara baharu untuk mengurangkan penjejakan dan memastikan anda lebih selamat semasa anda menyemak imbas. Chrome juga <ph name="BEGIN_LINK" />menganggarkan minat anda<ph name="END_LINK" /> dan membenarkan anda mengurusnya. Kemudian, laman yang anda lawati boleh menanyakan Chrome tentang minat anda untuk memaparkan iklan kepada anda.</translation>
 <translation id="5324858694974489420">Tetapan Ibu Bapa</translation>
 <translation id="5326921373682845375">Oleh kerana halaman pramuat disulitkan dan pemautan laman ke halaman tersebut ialah laman Google, pelayan Google tidak menerima maklumat baharu apabila mempramuat halaman ini secara peribadi.</translation>
 <translation id="5329858041417644019">Penyemak imbas anda tidak diurus</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
index 79e59a5..471f704 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -779,6 +779,7 @@
 <translation id="5308380583665731573">ချိတ်ဆက်ရန်</translation>
 <translation id="5317780077021120954">သိမ်းရန်</translation>
 <translation id="5319359161174645648">Google က Chrome ကို အသုံးပြုရန် အကြံပြုထားပါသည်</translation>
+<translation id="5321849971085220133">Chrome က စောင့်ကြည့်ခြင်းကို လျှော့ချရန်နှင့် သင်ကြည့်ရှုနေစဉ် ပိုမိုလုံခြုံစေရန် နည်းလမ်းအသစ်များရှာနေပါသည်။ Chrome က <ph name="BEGIN_LINK" />သင့်စိတ်ဝင်စားမှုများကိုလည်း ခန့်မှန်း<ph name="END_LINK" /> ပြီး ၎င်းတို့ကို သင့်အား စီမံခွင့်ပြုပါသည်။ သင်ဝင်ကြည့်သောဝဘ်ဆိုက်များက ကြော်ငြာပြရန်အတွက် Chrome တွင် သင့်စိတ်ဝင်စားမှုများကို ကြည့်ခွင့်တောင်းနိုင်ပါသည်။</translation>
 <translation id="5324858694974489420">အုပ်ထိန်းမှု ချိန်ညှိချက်များ</translation>
 <translation id="5326921373682845375">ကြိုဖွင့်ထားသည့် စာမျက်နှာများကို အသွင်ဝှက်ထားပြီး စာမျက်နှာများနှင့် လင့်ခ်ချိတ်ထားသော ဝဘ်ဆိုက်သည် Google ဝဘ်ဆိုက်ဖြစ်သောကြောင့် ဤစာမျက်နှာများကို သီးသန့် ကြိုဖွင့်သည့်အခါ Google ဆာဗာများသည် အချက်အလက်အသစ်များ မရရှိပါ။</translation>
 <translation id="5329858041417644019">သင်၏ ဘရောင်ဇာကို စီမံခန့်ခွဲမထားပါ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
index ea8a1227..16563c98 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -779,6 +779,7 @@
 <translation id="5308380583665731573">เชื่อมต่อ</translation>
 <translation id="5317780077021120954">บันทึก</translation>
 <translation id="5319359161174645648">Google ขอแนะนำ Chrome</translation>
+<translation id="5321849971085220133">Chrome พบวิธีใหม่ๆ ในการลดการติดตามและช่วยให้การท่องเว็บปลอดภัยยิ่งขึ้น Chrome ยัง<ph name="BEGIN_LINK" />คาดคะเนความสนใจของคุณ<ph name="END_LINK" />และให้คุณจัดการข้อมูลเหล่านั้นด้วย จากนั้นเว็บไซต์ที่คุณเข้าชมจะถาม Chrome ว่าคุณสนใจเรื่องอะไรเพื่อแสดงโฆษณาที่ตรงตามความต้องการ</translation>
 <translation id="5324858694974489420">การตั้งค่าของผู้ปกครอง</translation>
 <translation id="5326921373682845375">เซิร์ฟเวอร์ของ Google จะไม่ได้รับข้อมูลใหม่เมื่อโหลดหน้าเว็บล่วงหน้าแบบส่วนตัว เนื่องจากหน้าเว็บที่โหลดล่วงหน้าจะได้รับการเข้ารหัส และเว็บไซต์ที่ลิงก์ไปยังหน้าดังกล่าวเป็นเว็บไซต์ Google</translation>
 <translation id="5329858041417644019">เบราว์เซอร์ของคุณไม่มีการจัดการ</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 f7f0404..fcbb4fc1 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
@@ -778,6 +778,7 @@
 <translation id="5308380583665731573">連線</translation>
 <translation id="5317780077021120954">儲存</translation>
 <translation id="5319359161174645648">Google 推薦使用 Chrome</translation>
+<translation id="5321849971085220133">Chrome 正在尋找減少追蹤使用者活動的新方式,讓你上網時更安全。此外,Chrome 也會<ph name="BEGIN_LINK" />推測你的興趣喜好<ph name="END_LINK" />,同時讓你自行管理這些資訊。你造訪的網站可在之後要求 Chrome 提供這類資訊,以便向你顯示廣告。</translation>
 <translation id="5324858694974489420">家長設定</translation>
 <translation id="5326921373682845375">由於預先載入的網頁已經過加密,且連到這些網頁的網站為 Google 網站,因此以私密方式預先載入這些網頁時,Google 伺服器不會接收新資訊。</translation>
 <translation id="5329858041417644019">你的瀏覽器未受管理</translation>
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
index 6924edf..71f589e6 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
@@ -61,7 +61,6 @@
 #include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/services/app_service/public/mojom/types.mojom-shared.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
@@ -724,7 +723,6 @@
   CrostiniAppTest& operator=(const CrostiniAppTest&) = delete;
 
   void SetUp() override {
-    chromeos::DBusThreadManager::Initialize();
     ash::CiceroneClient::InitializeFake();
     ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
@@ -747,7 +745,6 @@
     ash::SeneschalClient::Shutdown();
     ash::ConciergeClient::Shutdown();
     ash::CiceroneClient::Shutdown();
-    chromeos::DBusThreadManager::Shutdown();
   }
 
  protected:
@@ -959,20 +956,18 @@
  protected:
   // Required to ensure that the Plugin VM manager can be accessed in order to
   // retrieve permissions.
-  struct ScopedDBusThreadManager {
-    ScopedDBusThreadManager() {
-      chromeos::DBusThreadManager::Initialize();
+  struct ScopedDBusClients {
+    ScopedDBusClients() {
       ash::CiceroneClient::InitializeFake();
       ash::ConciergeClient::InitializeFake();
       ash::SeneschalClient::InitializeFake();
     }
-    ~ScopedDBusThreadManager() {
+    ~ScopedDBusClients() {
       ash::SeneschalClient::Shutdown();
       ash::ConciergeClient::Shutdown();
       ash::CiceroneClient::Shutdown();
-      chromeos::DBusThreadManager::Shutdown();
     }
-  } dbus_thread_manager_;
+  } dbus_clients_;
 
   // Destroys any existing builder in the correct order.
   void ResetBuilder() {
diff --git a/chrome/browser/ui/app_list/arc/arc_app_test.cc b/chrome/browser/ui/app_list/arc/arc_app_test.cc
index d37910e..1ee33d6 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_test.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_test.cc
@@ -29,7 +29,6 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/test/fake_intent_helper_host.h"
 #include "components/arc/test/fake_intent_helper_instance.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -91,9 +90,8 @@
 }
 
 void ArcAppTest::SetUp(Profile* profile) {
-  if (!chromeos::DBusThreadManager::IsInitialized()) {
-    chromeos::DBusThreadManager::Initialize();
-    dbus_thread_manager_initialized_ = true;
+  if (!ash::ConciergeClient::Get()) {
+    concierge_client_initialized_ = true;
     ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
   }
   arc::SetArcAvailableCommandLineForTesting(
@@ -281,13 +279,12 @@
   if (!persist_service_manager_)
     arc_service_manager_.reset();
   arc::ResetArcAllowedCheckForTesting(profile_);
-  // DBusThreadManager may be initialized from other testing utility, such as
+  // ConciergeClient may be initialized from other testing utility, such as
   // ash::AshTestHelper::SetUp(), so Shutdown() only when it is initialized in
   // ArcAppTest::SetUp().
-  if (dbus_thread_manager_initialized_) {
+  if (concierge_client_initialized_) {
     ash::ConciergeClient::Shutdown();
-    chromeos::DBusThreadManager::Shutdown();
-    dbus_thread_manager_initialized_ = false;
+    concierge_client_initialized_ = false;
   }
   profile_ = nullptr;
 }
diff --git a/chrome/browser/ui/app_list/arc/arc_app_test.h b/chrome/browser/ui/app_list/arc/arc_app_test.h
index 8df106b9..9543537 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_test.h
+++ b/chrome/browser/ui/app_list/arc/arc_app_test.h
@@ -163,7 +163,7 @@
   std::vector<arc::mojom::ArcPackageInfoPtr> fake_packages_;
   std::vector<arc::mojom::ShortcutInfo> fake_shortcuts_;
 
-  bool dbus_thread_manager_initialized_ = false;
+  bool concierge_client_initialized_ = false;
 };
 
 #endif  // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_TEST_H_
diff --git a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
index 48c1cfe..af00588 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
@@ -45,7 +45,6 @@
 #include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/crx_file/id_util.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/icon_types.h"
@@ -633,7 +632,6 @@
 class AppSearchProviderCrostiniTest : public AppSearchProviderTest {
  public:
   void SetUp() override {
-    chromeos::DBusThreadManager::Initialize();
     ash::ChunneldClient::InitializeFake();
     ash::CiceroneClient::InitializeFake();
     ash::ConciergeClient::InitializeFake();
@@ -654,7 +652,6 @@
     ash::ConciergeClient::Shutdown();
     ash::CiceroneClient::Shutdown();
     ash::ChunneldClient::Shutdown();
-    chromeos::DBusThreadManager::Shutdown();
   }
 };
 
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
index 4a118cc..d9084828 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
@@ -62,6 +62,7 @@
                               gfx::kPlaceholderColor),
         kSystemIconDimension));
 
+    SetSkipUpdateAnimation(true);
     set_dismiss_view_on_open(false);
   }
 
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
index e9c81da..7a7c063 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
@@ -69,6 +69,7 @@
     EXPECT_EQ(result->result_type(),
               ash::AppListSearchResultType::kAssistantText);
     EXPECT_EQ(result->display_type(), ash::SearchResultDisplayType::kList);
+    EXPECT_EQ(result->skip_update_animation(), true);
   }
 
  private:
diff --git a/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc b/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
index f7570d5..c9d707a 100644
--- a/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
@@ -54,7 +54,6 @@
 #include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/prefs/pref_service.h"
 #include "components/viz/test/test_gpu_service_holder.h"
@@ -105,7 +104,6 @@
   ~ShelfContextMenuTest() override = default;
 
   void SetUp() override {
-    chromeos::DBusThreadManager::Initialize();
     ash::ChunneldClient::InitializeFake();
     ash::CiceroneClient::InitializeFake();
     ash::ConciergeClient::InitializeFake();
@@ -213,7 +211,6 @@
     ash::ConciergeClient::Shutdown();
     ash::CiceroneClient::Shutdown();
     ash::ChunneldClient::Shutdown();
-    chromeos::DBusThreadManager::Shutdown();
   }
 
   ArcAppTest& arc_test() { return arc_test_; }
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.cc b/chrome/browser/ui/passwords/settings/password_manager_porter.cc
index 412999b..d301025f 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter.cc
@@ -111,7 +111,8 @@
   DCHECK(web_contents);
 
   if (!importer_)
-    importer_ = std::make_unique<password_manager::PasswordImporter>();
+    importer_ =
+        std::make_unique<password_manager::PasswordImporter>(presenter_);
 
   PresentFileSelector(web_contents,
                       PasswordManagerPorter::Type::PASSWORD_IMPORT);
@@ -199,21 +200,5 @@
 
 void PasswordManagerPorter::ImportPasswordsFromPath(
     const base::FilePath& path) {
-  importer_->Import(path,
-                    base::BindOnce(&PasswordManagerPorter::ConsumePasswords,
-                                   weak_ptr_factory_.GetWeakPtr()));
-}
-
-void PasswordManagerPorter::ConsumePasswords(
-    password_manager::mojom::CSVPasswordSequencePtr seq) {
-  if (!seq)
-    return;
-
-  for (const auto& pwd : seq->csv_passwords) {
-    presenter_->AddCredential(password_manager::CredentialUIEntry(pwd),
-                              password_manager::PasswordForm::Type::kImported);
-  }
-
-  UMA_HISTOGRAM_COUNTS_1M("PasswordManager.ImportedPasswordsPerUserInCSV",
-                          seq->csv_passwords.size());
+  importer_->Import(path);
 }
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.h b/chrome/browser/ui/passwords/settings/password_manager_porter.h
index 91c891e..41f3618a 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter.h
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter.h
@@ -84,8 +84,6 @@
 
   void ExportPasswordsToPath(const base::FilePath& path);
 
-  void ConsumePasswords(password_manager::mojom::CSVPasswordSequencePtr seq);
-
   std::unique_ptr<password_manager::PasswordManagerExporter> exporter_;
   std::unique_ptr<password_manager::PasswordImporter> importer_;
   scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
index 91c0f02a..def302e41 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
@@ -328,7 +328,7 @@
                                PasswordManagerPorter::ProgressCallback());
 
   std::unique_ptr<password_manager::PasswordImporter> importer =
-      std::make_unique<password_manager::PasswordImporter>();
+      std::make_unique<password_manager::PasswordImporter>(&presenter);
 
   FakePasswordParserService service;
   mojo::Receiver<password_manager::mojom::CSVPasswordParser> receiver{&service};
diff --git a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
index dd542c0..b33d069 100644
--- a/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/page_info/about_this_site_side_panel_coordinator.cc
@@ -46,6 +46,8 @@
   auto* side_panel_coordinator = browser_view->side_panel_coordinator();
   auto* registry = SidePanelRegistry::Get(web_contents());
 
+  last_url_params_ = params;
+
   // Check if the view is already registered.
   if (!registry->GetEntryForId(SidePanelEntry::Id::kAboutThisSite)) {
     const int icon_size = ChromeLayoutProvider::Get()->GetDistanceMetric(
diff --git a/chrome/browser/ui/views/user_education/tip_marquee_view_browsertest.cc b/chrome/browser/ui/views/user_education/tip_marquee_view_browsertest.cc
index 90d1deb..e8be8d0 100644
--- a/chrome/browser/ui/views/user_education/tip_marquee_view_browsertest.cc
+++ b/chrome/browser/ui/views/user_education/tip_marquee_view_browsertest.cc
@@ -36,6 +36,6 @@
 
 IN_PROC_BROWSER_TEST_F(TipMarqueeViewBrowserTest, TipStartsExpanded) {
   tip_marquee_view()->SetTip(u"Tip Text");
-  tab_strip_region_view()->Layout();
+  RunScheduledLayouts();
   EXPECT_EQ(tip_marquee_view()->GetPreferredSize(), tip_marquee_view()->size());
 }
diff --git a/chrome/browser/ui/views/user_education/tip_marquee_view_unittest.cc b/chrome/browser/ui/views/user_education/tip_marquee_view_unittest.cc
index bb484ac..a41bbe4 100644
--- a/chrome/browser/ui/views/user_education/tip_marquee_view_unittest.cc
+++ b/chrome/browser/ui/views/user_education/tip_marquee_view_unittest.cc
@@ -19,8 +19,8 @@
 #include "ui/events/types/event_type.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/controls/button/label_button.h"
-#include "ui/views/layout/flex_layout.h"
 #include "ui/views/layout/flex_layout_types.h"
+#include "ui/views/layout/flex_layout_view.h"
 #include "ui/views/layout/layout_types.h"
 #include "ui/views/test/views_test_base.h"
 #include "ui/views/test/widget_test.h"
@@ -62,11 +62,12 @@
     params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
     params.bounds = gfx::Rect(gfx::Point(), kTipMarqueeWidgetSize);
     widget_->Init(std::move(params));
-    contents_ = widget_->SetContentsView(std::make_unique<views::View>());
-    contents_->SetLayoutManager(std::make_unique<views::FlexLayout>())
-        ->SetOrientation(views::LayoutOrientation::kHorizontal);
+    views::View* contents = widget_->SetContentsView(
+        views::Builder<views::FlexLayoutView>()
+            .SetOrientation(views::LayoutOrientation::kHorizontal)
+            .Build());
 
-    spacer_ = contents_->AddChildView(std::make_unique<views::View>());
+    spacer_ = contents->AddChildView(std::make_unique<views::View>());
     spacer_->SetPreferredSize(kSpacerPreferredSize);
     spacer_->SetProperty(
         views::kFlexBehaviorKey,
@@ -74,7 +75,7 @@
                                  views::MinimumFlexSizeRule::kPreferred,
                                  views::MaximumFlexSizeRule::kUnbounded));
 
-    marquee_ = contents_->AddChildView(
+    marquee_ = contents->AddChildView(
         std::make_unique<TipMarqueeView>(views::style::CONTEXT_DIALOG_TITLE));
     marquee_->SetProperty(
         views::kFlexBehaviorKey,
@@ -90,7 +91,6 @@
 
   void TearDown() override {
     widget_.reset();
-    contents_ = nullptr;
     spacer_ = nullptr;
     marquee_ = nullptr;
     ViewsTestBase::TearDown();
@@ -113,51 +113,50 @@
 
  protected:
   std::unique_ptr<views::Widget> widget_;
-  raw_ptr<views::View> contents_ = nullptr;
   raw_ptr<views::View> spacer_ = nullptr;
   raw_ptr<TipMarqueeView> marquee_ = nullptr;
 };
 
 TEST_F(TipMarqueeViewTest, NotVisibleWhenNoTip) {
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_FALSE(marquee_->GetVisible());
 }
 
 TEST_F(TipMarqueeViewTest, VisibleWhenTipSet) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_TRUE(marquee_->GetVisible());
 }
 
 TEST_F(TipMarqueeViewTest, ClearTipHidesView) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_TRUE(marquee_->GetVisible());
   EXPECT_EQ(marquee_->GetPreferredSize(), marquee_->size());
   marquee_->ClearTip();
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_FALSE(marquee_->GetVisible());
 }
 
 TEST_F(TipMarqueeViewTest, TipStartsExpanded) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_GT(marquee_->width(), marquee_->GetMinimumSize().width());
 }
 
 TEST_F(TipMarqueeViewTest, TipCollapsesWhenNotEnoughSpace) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 }
 
 TEST_F(TipMarqueeViewTest, TipCollapsesAndExpandsWhenIconIsClicked) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
 
   // This location should be comfortably inside the icon area.
   constexpr gfx::Point kPressPoint(10, 10);
@@ -166,37 +165,37 @@
   marquee_->OnMousePressed(ui::MouseEvent(
       ui::ET_MOUSE_PRESSED, kPressPoint, kPressPoint, ui::EventTimeForNow(),
       ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // Expand.
   marquee_->OnMousePressed(ui::MouseEvent(
       ui::ET_MOUSE_PRESSED, kPressPoint, kPressPoint, ui::EventTimeForNow(),
       ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_GT(marquee_->width(), marquee_->GetMinimumSize().width());
 }
 
 TEST_F(TipMarqueeViewTest, TipDoesNotExpandWhenInsufficientSpace) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the icon area.
   constexpr gfx::Point kPressPoint(10, 10);
   SimulateMarqueeClick(kPressPoint);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 }
 
 TEST_F(TipMarqueeViewTest, ClickLearnMoreLink) {
   LearnMoreCallback callback;
   marquee_->SetTip(u"Tip Text", callback.Callback());
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_GT(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the "learn more" link.
@@ -209,7 +208,7 @@
 TEST_F(TipMarqueeViewTest, ClickNotInLearnMoreLinkHasNoEffect) {
   LearnMoreCallback callback;
   marquee_->SetTip(u"Tip Text", callback.Callback());
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   EXPECT_GT(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the tip text but not the link.
@@ -223,11 +222,11 @@
 TEST_F(TipMarqueeViewTest, ClickWhenForcedCollapsedCallsLearnMore) {
   LearnMoreCallback callback;
   marquee_->SetTip(u"Tip Text", callback.Callback());
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   EXPECT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the icon area.
@@ -239,11 +238,11 @@
 
 TEST_F(TipMarqueeViewTest, ClickWhenForcedCollapsedDisplaysOverflow) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   ASSERT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the icon area.
@@ -256,11 +255,11 @@
 
 TEST_F(TipMarqueeViewTest, OverflowBubbleCancelDoesNotDismissTip) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   ASSERT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the icon area.
@@ -279,11 +278,11 @@
 
 TEST_F(TipMarqueeViewTest, OverflowBubbleGotItDismissesTip) {
   marquee_->SetTip(u"Tip Text");
-  widget_->LayoutRootViewIfNecessary();
+  RunScheduledLayout(marquee_);
   gfx::Size spacer_size = spacer_->size();
   spacer_size.Enlarge(1, 0);
   spacer_->SetPreferredSize(spacer_size);
-  contents_->Layout();
+  RunScheduledLayout(marquee_);
   ASSERT_EQ(marquee_->width(), marquee_->GetMinimumSize().width());
 
   // This location should be comfortably inside the icon area.
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
index bb88e43..9836ca0 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
+++ b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/strings/string_util.h"
-#include "base/values.h"
 #include "base/win/windows_version.h"
 #include "build/branding_buildflags.h"
 #include "chrome/browser/win/conflicts/module_database.h"
@@ -329,14 +328,13 @@
 void OnConflictsDataFetched(
     ConflictsDataFetcher::OnConflictsDataFetchedCallback
         on_conflicts_data_fetched_callback,
-    base::DictionaryValue results,
+    base::Value::Dict results,
     ThirdPartyFeaturesStatus third_party_features_status) {
   // Third-party conflicts status.
-  results.SetBoolKey("thirdPartyFeatureEnabled",
-                     IsThirdPartyFeatureEnabled(third_party_features_status));
-  results.SetStringKey(
-      "thirdPartyFeatureStatus",
-      GetThirdPartyFeaturesStatusString(third_party_features_status));
+  results.Set("thirdPartyFeatureEnabled",
+              IsThirdPartyFeatureEnabled(third_party_features_status));
+  results.Set("thirdPartyFeatureStatus",
+              GetThirdPartyFeaturesStatusString(third_party_features_status));
 
   std::move(on_conflicts_data_fetched_callback).Run(std::move(results));
 }
@@ -344,7 +342,7 @@
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 void OnModuleDataFetched(ConflictsDataFetcher::OnConflictsDataFetchedCallback
                              on_conflicts_data_fetched_callback,
-                         base::DictionaryValue results,
+                         base::Value::Dict results,
                          absl::optional<ThirdPartyConflictsManager::State>
                              third_party_conflicts_manager_state) {
   OnConflictsDataFetched(
@@ -358,7 +356,7 @@
 ConflictsDataFetcher::~ConflictsDataFetcher() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (module_list_)
+  if (module_list_.has_value())
     ModuleDatabase::GetInstance()->RemoveObserver(this);
 }
 
@@ -421,7 +419,7 @@
 
   // The request is handled asynchronously, filling up the |module_list_|,
   // and will callback via OnModuleDatabaseIdle() on completion.
-  module_list_ = std::make_unique<base::ListValue>();
+  module_list_ = base::Value::List();
 
   auto* module_database = ModuleDatabase::GetInstance();
   module_database->ForceStartInspection();
@@ -469,7 +467,7 @@
   data.Set("code_id", GenerateCodeId(module_key));
   data.Set("process_types", GetProcessTypesString(module_data));
 
-  module_list_->GetList().Append(std::move(data));
+  module_list_->Append(std::move(data));
 }
 
 void ConflictsDataFetcher::OnModuleDatabaseIdle() {
@@ -478,9 +476,10 @@
 
   ModuleDatabase::GetInstance()->RemoveObserver(this);
 
-  base::DictionaryValue results;
-  results.GetDict().Set("moduleCount", int(module_list_->GetList().size()));
-  results.Set("moduleList", std::move(module_list_));
+  base::Value::Dict results;
+  results.Set("moduleCount", int(module_list_->size()));
+  results.Set("moduleList", std::move(*module_list_));
+  module_list_ = absl::nullopt;
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   // The state of third-party features must be determined on the UI thread.
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
index 3aabb5b..799d26e 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
+++ b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.h
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/sequence_checker.h"
 #include "base/task/sequenced_task_runner.h"
+#include "base/values.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/browser/win/conflicts/module_database_observer.h"
@@ -19,11 +20,6 @@
 #include "chrome/browser/win/conflicts/third_party_conflicts_manager.h"
 #endif
 
-namespace base {
-class DictionaryValue;
-class ListValue;
-}  // namespace base
-
 // This class is responsible for gathering the list of modules for the
 // chrome://conflicts page and the state of the third-party features on the
 // ModuleDatabase task runner and sending it back to the UI thread. The instance
@@ -33,7 +29,7 @@
   using UniquePtr =
       std::unique_ptr<ConflictsDataFetcher, base::OnTaskRunnerDeleter>;
   using OnConflictsDataFetchedCallback =
-      base::OnceCallback<void(base::DictionaryValue results)>;
+      base::OnceCallback<void(base::Value::Dict results)>;
 
   ConflictsDataFetcher(const ConflictsDataFetcher&) = delete;
   ConflictsDataFetcher& operator=(const ConflictsDataFetcher&) = delete;
@@ -71,7 +67,7 @@
 
   // Temporarily holds the module list while the modules are being
   // enumerated.
-  std::unique_ptr<base::ListValue> module_list_;
+  absl::optional<base::Value::List> module_list_;
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
index c4505138..112891b0 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
+++ b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
@@ -41,7 +41,7 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ConflictsHandler::OnConflictsDataFetched(base::DictionaryValue results) {
+void ConflictsHandler::OnConflictsDataFetched(base::Value::Dict results) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(!module_list_callback_id_.empty());
 
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_handler.h b/chrome/browser/ui/webui/conflicts/conflicts_handler.h
index 49620abd..e158781 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_handler.h
+++ b/chrome/browser/ui/webui/conflicts/conflicts_handler.h
@@ -30,7 +30,7 @@
   // Callback for the "requestModuleList" message.
   void HandleRequestModuleList(const base::Value::List& args);
 
-  void OnConflictsDataFetched(base::DictionaryValue results);
+  void OnConflictsDataFetched(base::Value::Dict results);
 
   // The ID of the callback that will get invoked with the module list.
   std::string module_list_callback_id_;
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 980c418..210d9b49 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1947,6 +1947,8 @@
     {"safetyCheckIconWarningAriaLabel",
      IDS_SETTINGS_SAFETY_CHECK_ICON_WARNING_ARIA_LABEL},
     {"safetyCheckReview", IDS_SETTINGS_SAFETY_CHECK_REVIEW},
+    {"safetyCheckUnusedSitePermissionsPrimaryLabel",
+     IDS_SETTINGS_SAFETY_CHECK_UNUSED_SITE_PERMISSIONS_PRIMARY_LABEL},
     {"safetyCheckUpdatesPrimaryLabel",
      IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL},
     {"safetyCheckUpdatesButtonAriaLabel", IDS_UPDATE_RECOMMENDED_DIALOG_TITLE},
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 925ba63..ab64bd8 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -397,6 +397,10 @@
         "privacySandbox", IDR_SETTINGS_PRIVACY_SANDBOX_PRIVACY_SANDBOX_HTML);
   }
 
+  html_source->AddBoolean(
+      "safetyCheckPermissionsEnabled",
+      base::FeatureList::IsEnabled(features::kSafetyCheckPermissions));
+
   TryShowHatsSurveyWithTimeout();
 }
 
diff --git a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
index f469be3..0c8f880 100644
--- a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
+++ b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
@@ -12,17 +12,13 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/chrome_signin_client.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/signin/investigator_dependency_provider.h"
 #include "chrome/browser/signin/signin_util.h"
 #include "chrome/browser/ui/webui/signin/signin_ui_error.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/guest_view/browser/guest_view_manager.h"
+#include "components/prefs/pref_service.h"
 #include "components/signin/public/base/signin_pref_names.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_utils.h"
 #include "google_apis/gaia/gaia_auth_util.h"
-#include "ui/base/l10n/l10n_util.h"
 
 SigninUIError CanOfferSignin(Profile* profile,
                              const std::string& gaia_id,
@@ -102,7 +98,7 @@
 
     // With force sign in enabled, cross account sign in is not allowed.
     if (signin_util::IsForceSigninEnabled() &&
-        IsCrossAccountError(profile, email, gaia_id)) {
+        IsCrossAccountError(profile, gaia_id)) {
       std::string last_email =
           profile->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername);
       return SigninUIError::ProfileWasUsedByAnotherAccount(email, last_email);
@@ -112,12 +108,9 @@
   return SigninUIError::Ok();
 }
 
-bool IsCrossAccountError(Profile* profile,
-                         const std::string& email,
-                         const std::string& gaia_id) {
-  InvestigatorDependencyProvider provider(profile);
-  InvestigatedScenario scenario =
-      SigninInvestigator(email, gaia_id, &provider).Investigate();
-
-  return scenario == InvestigatedScenario::kDifferentAccount;
+bool IsCrossAccountError(Profile* profile, const std::string& gaia_id) {
+  DCHECK(!gaia_id.empty());
+  std::string last_gaia_id =
+      profile->GetPrefs()->GetString(prefs::kGoogleServicesLastAccountId);
+  return !last_gaia_id.empty() && gaia_id != last_gaia_id;
 }
diff --git a/chrome/browser/ui/webui/signin/signin_utils_desktop.h b/chrome/browser/ui/webui/signin/signin_utils_desktop.h
index c06e875b..c40f07f 100644
--- a/chrome/browser/ui/webui/signin/signin_utils_desktop.h
+++ b/chrome/browser/ui/webui/signin/signin_utils_desktop.h
@@ -22,10 +22,8 @@
                              const std::string& gaia_id,
                              const std::string& email);
 
-// Return true if the account given by |email| and |gaia_id| is signed in to
-// Chrome in a different profile.
-bool IsCrossAccountError(Profile* profile,
-                         const std::string& email,
-                         const std::string& gaia_id);
+// Return true if an account other than `gaia_id` was previously signed into
+// `profile`.
+bool IsCrossAccountError(Profile* profile, const std::string& gaia_id);
 
 #endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_UTILS_DESKTOP_H_
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
index a40434d..5d90ae68 100644
--- a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
@@ -214,7 +214,7 @@
     return;
   }
 
-  if (!IsCrossAccountError(profile_, account_info_.email, account_info_.gaia)) {
+  if (!IsCrossAccountError(profile_, account_info_.gaia)) {
     TurnSyncOnWithProfileMode(ProfileMode::CURRENT_PROFILE);
     return;
   }
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
index 0af8cc83..7c1e2a9 100644
--- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
@@ -77,6 +77,7 @@
 
 const char kEmail[] = "foo@gmail.com";
 const char kPreviousEmail[] = "notme@bar.com";
+const char kPreviousAccountId[] = "gaia_id_for_not_me_at_bar_com";
 const char kEnterpriseEmail[] = "enterprise@managed.com";
 const char kEnterpriseHostedDomain[] = "managed.com";
 
@@ -837,6 +838,8 @@
   // Configure the test.
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
+  profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastAccountId,
+                                   kPreviousAccountId);
   // Signin flow.
   CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
@@ -854,6 +857,8 @@
   // Configure the test.
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
+  profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastAccountId,
+                                   kPreviousAccountId);
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
   chrome::enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
@@ -877,6 +882,8 @@
   merge_data_choice_ = signin::SIGNIN_CHOICE_CONTINUE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
+  profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastAccountId,
+                                   kPreviousAccountId);
   // Signin flow.
   CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
@@ -895,6 +902,8 @@
   merge_data_choice_ = signin::SIGNIN_CHOICE_CONTINUE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
+  profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastAccountId,
+                                   kPreviousAccountId);
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
   chrome::enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
@@ -921,6 +930,8 @@
   merge_data_choice_ = signin::SIGNIN_CHOICE_NEW_PROFILE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
+  profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastAccountId,
+                                   kPreviousAccountId);
   // Signin flow.
   ProfileWaiter profile_waiter;
   CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
index a8fdd3ba..cdeb952 100644
--- a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
@@ -8,14 +8,10 @@
 #include <string>
 #include <vector>
 
-#include "base/base64url.h"
 #include "base/bind.h"
 #include "base/check.h"
-#include "base/containers/contains.h"
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/strings/string_piece_forward.h"
-#include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/chromeos_buildflags.h"
@@ -46,24 +42,8 @@
 #include "ui/shell_dialogs/select_file_dialog.h"
 #include "url/gurl.h"
 
-const char kSupportCaseIDQuery[] = "case_id";
-const char kModuleQuery[] = "module";
-
-// TODO(b/226318326): Move the utility functions to support_tool_ui_utils.h and
-// add unit tests for them.
 namespace {
 
-// Returns the support case ID that's extracted from `url` with query
-// `kSupportCaseIDQuery`. Returns empty string if `url` doesn't contain support
-// case ID.
-std::string GetSupportCaseIDFromURL(const GURL& url) {
-  std::string support_case_id;
-  if (url.has_query()) {
-    net::GetValueForKeyInQuery(url, kSupportCaseIDQuery, &support_case_id);
-  }
-  return support_case_id;
-}
-
 content::WebUIDataSource* CreateSupportToolHTMLSource(const GURL& url) {
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUISupportToolHost);
@@ -80,243 +60,6 @@
   return source;
 }
 
-// Returns the human readable name corresponding to `data_collector_type`.
-std::string GetDataCollectorName(
-    support_tool::DataCollectorType data_collector_type) {
-  // This function will return translatable strings in future. For now, return
-  // string constants until we have the translatable strings ready.
-  switch (data_collector_type) {
-    case support_tool::CHROME_INTERNAL:
-      return "Chrome System Information";
-    case support_tool::CRASH_IDS:
-      return "Crash IDs";
-    case support_tool::MEMORY_DETAILS:
-      return "Memory Details";
-    case support_tool::CHROMEOS_UI_HIERARCHY:
-      return "UI Hierarchy";
-    case support_tool::CHROMEOS_COMMAND_LINE:
-      return "Additional Chrome OS Platform Logs";
-    case support_tool::CHROMEOS_DEVICE_EVENT:
-      return "Device Event";
-    case support_tool::CHROMEOS_IWL_WIFI_DUMP:
-      return "Intel WiFi NICs Debug Dump";
-    case support_tool::CHROMEOS_TOUCH_EVENTS:
-      return "Touch Events";
-    case support_tool::CHROMEOS_CROS_API:
-      return "LaCrOS System Information";
-    case support_tool::CHROMEOS_LACROS:
-      return "LaCrOS";
-    case support_tool::CHROMEOS_REVEN:
-      return "Chrome OS Flex Logs";
-    case support_tool::CHROMEOS_DBUS:
-      return "DBus Details";
-    case support_tool::CHROMEOS_NETWORK_ROUTES:
-      return "Chrome OS Network Routes";
-    case support_tool::CHROMEOS_SHILL:
-      return "Chrome OS Shill";
-    default:
-      return "Error: Undefined";
-  }
-}
-
-// Decodes `module_query` string and initializes contents of `module`.
-void InitDataCollectionModuleFromURLQuery(
-    support_tool::DataCollectionModule* module,
-    const std::string& module_query) {
-  std::string query_decoded;
-  if (!module_query.empty() &&
-      base::Base64UrlDecode(module_query,
-                            base::Base64UrlDecodePolicy::IGNORE_PADDING,
-                            &query_decoded)) {
-    module->ParseFromString(query_decoded);
-  }
-}
-
-// Returns data collector item for `type`. Sets isIncluded field true if
-// `module` contains `type`.
-base::Value::Dict GetDataCollectorItemForType(
-    const support_tool::DataCollectionModule& module,
-    const support_tool::DataCollectorType& type) {
-  base::Value::Dict dict;
-  dict.Set("name", GetDataCollectorName(type));
-  dict.Set("protoEnum", type);
-  dict.Set("isIncluded",
-           base::Contains(module.included_data_collectors(), type));
-  return dict;
-}
-
-// Returns data collector item for `type`. Sets isIncluded to false for all data
-// collector items.
-base::Value::Dict GetDataCollectorItemForType(
-    const support_tool::DataCollectorType& type) {
-  base::Value::Dict dict;
-  dict.Set("name", GetDataCollectorName(type));
-  dict.Set("protoEnum", type);
-  dict.Set("isIncluded", false);
-  return dict;
-}
-
-// Creates base::Value::List according to the format Support Tool UI
-// accepts and fills the contents with by decoding `module_query` to its
-// support_tool.pb components. Support Tool UI requests data collector items in
-// format:
-// type DataCollectorItem = {
-//  name: string,
-//  isIncluded: boolean,
-//  protoEnum: number,
-// }
-// Returns only the data collectors that are available for user's device.
-base::Value::List GetDataCollectorItemsInQuery(std::string module_query) {
-  base::Value::List data_collector_list;
-  support_tool::DataCollectionModule module;
-  InitDataCollectionModuleFromURLQuery(&module, module_query);
-  for (const auto& type : kDataCollectors) {
-    data_collector_list.Append(GetDataCollectorItemForType(module, type));
-  }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  for (const auto& type : kDataCollectorsChromeosAsh) {
-    data_collector_list.Append(GetDataCollectorItemForType(module, type));
-  }
-#if BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
-  for (const auto& type : kDataCollectorsChromeosHwDetails) {
-    data_collector_list.Append(GetDataCollectorItemForType(module, type));
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  return data_collector_list;
-}
-
-// Creates base::Value::List according to the format Support Tool UI
-// accepts and fills the contents with all data collectors with isIncluded:
-// false as a default choice. Support Tool UI requests data collector items in
-// format:
-// type DataCollectorItem = {
-//  name: string,
-//  isIncluded: boolean,
-//  protoEnum: number,
-// }
-base::Value::List GetAllDataCollectors() {
-  base::Value::List data_collector_list;
-  for (const auto& type : kDataCollectors) {
-    data_collector_list.Append(GetDataCollectorItemForType(type));
-  }
-  for (const auto& type : kDataCollectorsChromeosAsh) {
-    data_collector_list.Append(GetDataCollectorItemForType(type));
-  }
-  for (const auto& type : kDataCollectorsChromeosHwDetails) {
-    data_collector_list.Append(GetDataCollectorItemForType(type));
-  }
-  return data_collector_list;
-}
-
-std::set<support_tool::DataCollectorType> GetIncludedDataCollectorTypes(
-    const base::Value::List* data_collector_items) {
-  std::set<support_tool::DataCollectorType> included_data_collectors;
-  for (const auto& item : *data_collector_items) {
-    const base::Value::Dict* item_as_dict = item.GetIfDict();
-    DCHECK(item_as_dict);
-    absl::optional<bool> isIncluded = item_as_dict->FindBool("isIncluded");
-    if (isIncluded && isIncluded.value()) {
-      included_data_collectors.insert(
-          static_cast<support_tool::DataCollectorType>(
-              item_as_dict->FindInt("protoEnum").value()));
-    }
-  }
-  return included_data_collectors;
-}
-
-// Returns start data collection result in a structure that Support Tool UI
-// accepts. The returned type is as follow: type StartDataCollectionResult = {
-//   success: boolean,
-//   errorMessage: string,
-// }
-base::Value GetStartDataCollectionResult(bool success,
-                                         std::string error_message) {
-  base::Value::Dict result;
-  result.Set("success", success);
-  result.Set("errorMessage", error_message);
-  return base::Value(std::move(result));
-}
-
-// Returns the current time in YYYY_MM_DD_HH_mm format.
-std::string GetTimestampString(base::Time timestamp) {
-  base::Time::Exploded tex;
-  timestamp.LocalExplode(&tex);
-  return base::StringPrintf("%04d_%02d_%02d_%02d_%02d", tex.year, tex.month,
-                            tex.day_of_month, tex.hour, tex.minute);
-}
-
-base::FilePath GetDefaultFileToExport(base::FilePath suggested_path,
-                                      const std::string& case_id,
-                                      base::Time timestamp) {
-  std::string timestamp_string = GetTimestampString(timestamp);
-  std::string filename =
-      case_id.empty()
-          ? base::StringPrintf("support_packet_%s", timestamp_string.c_str())
-          : base::StringPrintf("support_packet_%s_%s", case_id.c_str(),
-                               timestamp_string.c_str());
-  return suggested_path.AppendASCII(filename);
-}
-
-std::string GetDataCollectionModuleQuery(
-    std::set<support_tool::DataCollectorType> included_data_collectors) {
-  support_tool::DataCollectionModule module;
-  for (const auto& data_collector : included_data_collectors) {
-    module.add_included_data_collectors(data_collector);
-  }
-  std::string module_serialized;
-  module.SerializeToString(&module_serialized);
-  std::string data_collection_url_query;
-  base::Base64UrlEncode(module_serialized,
-                        base::Base64UrlEncodePolicy::OMIT_PADDING,
-                        &data_collection_url_query);
-  return data_collection_url_query;
-}
-
-// Returns a URL generation result in the type Support Tool UI expects.
-// type UrlGenerationResult = {
-//   success: boolean,
-//   url: string,
-//   errorMessage: string,
-// }
-base::Value::Dict GetURLGenerationResult(bool success,
-                                         std::string url,
-                                         std::string error_message) {
-  base::Value::Dict url_generation_response;
-  url_generation_response.Set("success", success);
-  url_generation_response.Set("url", url);
-  url_generation_response.Set("errorMessage", error_message);
-  return url_generation_response;
-}
-
-// Generates a customized chrome://support-tool URL from given `case_id` and
-// `data_collector_items` and returns the result in a format Support Tool UI
-// expects. Returns a result with error when there's no data collector selected
-// in `data_collector_items`.
-base::Value::Dict GenerateCustomizedURL(
-    std::string case_id,
-    const base::Value::List* data_collector_items) {
-  base::Value::Dict url_generation_response;
-  std::set<support_tool::DataCollectorType> included_data_collectors =
-      GetIncludedDataCollectorTypes(data_collector_items);
-  if (included_data_collectors.empty()) {
-    // If there's no selected data collector to add, consider this as an error.
-    return GetURLGenerationResult(
-        /*success=*/false, /*url=*/std::string(), /*error_message=*/
-        "No data collectors included. Please select a data collector.");
-  }
-  GURL customized_url("chrome://support-tool");
-  if (!case_id.empty()) {
-    customized_url =
-        net::AppendQueryParameter(customized_url, kSupportCaseIDQuery, case_id);
-  }
-  customized_url = net::AppendQueryParameter(
-      customized_url, kModuleQuery,
-      GetDataCollectionModuleQuery(included_data_collectors));
-  return GetURLGenerationResult(/*success=*/true, /*url=*/customized_url.spec(),
-                                /*error_message=*/std::string());
-}
-
 }  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -455,8 +198,8 @@
   const base::Value& callback_id = args[0];
 
   std::string module_query;
-  net::GetValueForKeyInQuery(web_ui()->GetWebContents()->GetURL(), kModuleQuery,
-                             &module_query);
+  net::GetValueForKeyInQuery(web_ui()->GetWebContents()->GetURL(),
+                             support_tool_ui::kModuleQuery, &module_query);
 
   ResolveJavascriptCallback(
       callback_id, base::Value(GetDataCollectorItemsInQuery(module_query)));
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
index 1c40f677..64d04d6 100644
--- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
@@ -9,13 +9,23 @@
 #include <string>
 #include <vector>
 
+#include "base/base64url.h"
 #include "base/check.h"
+#include "base/containers/contains.h"
+#include "base/files/file_path.h"
 #include "base/strings/string_piece_forward.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
 #include "base/values.h"
+#include "build/chromeos_buildflags.h"
+#include "chrome/browser/support_tool/data_collection_module.pb.h"
 #include "chrome/browser/support_tool/data_collector.h"
+#include "chrome/browser/support_tool/support_tool_util.h"
 #include "components/feedback/pii_types.h"
+#include "net/base/url_util.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
 
 namespace support_tool_ui {
 
@@ -41,6 +51,17 @@
 const char kPiiItemCountKey[] = "count";
 const char kPiiItemKeepKey[] = "keep";
 
+const char kSupportCaseIDQuery[] = "case_id";
+const char kModuleQuery[] = "module";
+
+const char kDataCollectorName[] = "name";
+const char kDataCollectorProtoEnum[] = "protoEnum";
+const char kDataCollectorIncluded[] = "isIncluded";
+
+const char kUrlGenerationResultSuccess[] = "success";
+const char kUrlGenerationResultUrl[] = "url";
+const char kUrlGenerationResultErrorMessage[] = "errorMessage";
+
 }  // namespace support_tool_ui
 
 namespace {
@@ -83,6 +104,123 @@
   }
 }
 
+// Returns the human readable name corresponding to `data_collector_type`.
+std::string GetDataCollectorName(
+    support_tool::DataCollectorType data_collector_type) {
+  // This function will return translatable strings in future. For now, return
+  // string constants until we have the translatable strings ready.
+  switch (data_collector_type) {
+    case support_tool::CHROME_INTERNAL:
+      return "Chrome System Information";
+    case support_tool::CRASH_IDS:
+      return "Crash IDs";
+    case support_tool::MEMORY_DETAILS:
+      return "Memory Details";
+    case support_tool::CHROMEOS_UI_HIERARCHY:
+      return "UI Hierarchy";
+    case support_tool::CHROMEOS_COMMAND_LINE:
+      return "Additional Chrome OS Platform Logs";
+    case support_tool::CHROMEOS_DEVICE_EVENT:
+      return "Device Event";
+    case support_tool::CHROMEOS_IWL_WIFI_DUMP:
+      return "Intel WiFi NICs Debug Dump";
+    case support_tool::CHROMEOS_TOUCH_EVENTS:
+      return "Touch Events";
+    case support_tool::CHROMEOS_CROS_API:
+      return "LaCrOS System Information";
+    case support_tool::CHROMEOS_LACROS:
+      return "LaCrOS";
+    case support_tool::CHROMEOS_REVEN:
+      return "Chrome OS Flex Logs";
+    case support_tool::CHROMEOS_DBUS:
+      return "DBus Details";
+    case support_tool::CHROMEOS_NETWORK_ROUTES:
+      return "Chrome OS Network Routes";
+    case support_tool::CHROMEOS_SHILL:
+      return "Chrome OS Shill (Connection Manager) Logs";
+    default:
+      return "Error: Undefined";
+  }
+}
+
+// Decodes `module_query` string and initializes contents of `module`.
+void InitDataCollectionModuleFromURLQuery(
+    support_tool::DataCollectionModule* module,
+    const std::string& module_query) {
+  std::string query_decoded;
+  if (!module_query.empty() &&
+      base::Base64UrlDecode(module_query,
+                            base::Base64UrlDecodePolicy::IGNORE_PADDING,
+                            &query_decoded)) {
+    module->ParseFromString(query_decoded);
+  }
+}
+
+// Returns data collector item for `type`. Sets isIncluded field true if
+// `module` contains `type`.
+base::Value::Dict GetDataCollectorItemForType(
+    const support_tool::DataCollectionModule& module,
+    const support_tool::DataCollectorType& type) {
+  base::Value::Dict dict;
+  dict.Set(support_tool_ui::kDataCollectorName, GetDataCollectorName(type));
+  dict.Set(support_tool_ui::kDataCollectorProtoEnum, type);
+  dict.Set(support_tool_ui::kDataCollectorIncluded,
+           base::Contains(module.included_data_collectors(), type));
+  return dict;
+}
+
+// Returns data collector item for `type`. Sets isIncluded to false for all data
+// collector items.
+base::Value::Dict GetDataCollectorItemForType(
+    const support_tool::DataCollectorType& type) {
+  base::Value::Dict dict;
+  dict.Set(support_tool_ui::kDataCollectorName, GetDataCollectorName(type));
+  dict.Set(support_tool_ui::kDataCollectorProtoEnum, type);
+  dict.Set(support_tool_ui::kDataCollectorIncluded, false);
+  return dict;
+}
+
+// Returns the current time in YYYY_MM_DD_HH_mm format.
+std::string GetTimestampString(base::Time timestamp) {
+  base::Time::Exploded tex;
+  timestamp.LocalExplode(&tex);
+  return base::StringPrintf("%04d_%02d_%02d_%02d_%02d", tex.year, tex.month,
+                            tex.day_of_month, tex.hour, tex.minute);
+}
+
+std::string GetDataCollectionModuleQuery(
+    std::set<support_tool::DataCollectorType> included_data_collectors) {
+  support_tool::DataCollectionModule module;
+  for (const auto& data_collector : included_data_collectors) {
+    module.add_included_data_collectors(data_collector);
+  }
+  std::string module_serialized;
+  module.SerializeToString(&module_serialized);
+  std::string data_collection_url_query;
+  base::Base64UrlEncode(module_serialized,
+                        base::Base64UrlEncodePolicy::OMIT_PADDING,
+                        &data_collection_url_query);
+  return data_collection_url_query;
+}
+
+// Returns a URL generation result in the type Support Tool UI expects.
+// type UrlGenerationResult = {
+//   success: boolean,
+//   url: string,
+//   errorMessage: string,
+// }
+base::Value::Dict GetURLGenerationResult(bool success,
+                                         std::string url,
+                                         std::string error_message) {
+  base::Value::Dict url_generation_response;
+  url_generation_response.Set(support_tool_ui::kUrlGenerationResultSuccess,
+                              success);
+  url_generation_response.Set(support_tool_ui::kUrlGenerationResultUrl, url);
+  url_generation_response.Set(support_tool_ui::kUrlGenerationResultErrorMessage,
+                              error_message);
+  return url_generation_response;
+}
+
 }  // namespace
 
 // type PIIDataItem = {
@@ -133,3 +271,124 @@
   }
   return pii_to_keep;
 }
+
+std::string GetSupportCaseIDFromURL(const GURL& url) {
+  std::string support_case_id;
+  if (url.has_query()) {
+    net::GetValueForKeyInQuery(url, support_tool_ui::kSupportCaseIDQuery,
+                               &support_case_id);
+  }
+  return support_case_id;
+}
+
+base::Value::List GetDataCollectorItemsInQuery(std::string module_query) {
+  base::Value::List data_collector_list;
+  support_tool::DataCollectionModule module;
+  InitDataCollectionModuleFromURLQuery(&module, module_query);
+  for (const auto& type : kDataCollectors) {
+    data_collector_list.Append(GetDataCollectorItemForType(module, type));
+  }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  for (const auto& type : kDataCollectorsChromeosAsh) {
+    data_collector_list.Append(GetDataCollectorItemForType(module, type));
+  }
+#if BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
+  for (const auto& type : kDataCollectorsChromeosHwDetails) {
+    data_collector_list.Append(GetDataCollectorItemForType(module, type));
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  return data_collector_list;
+}
+
+base::Value::List GetAllDataCollectors() {
+  base::Value::List data_collector_list;
+  for (const auto& type : kDataCollectors) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+  for (const auto& type : kDataCollectorsChromeosAsh) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+  for (const auto& type : kDataCollectorsChromeosHwDetails) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+  return data_collector_list;
+}
+
+base::Value::List GetAllDataCollectorsForDevice() {
+  base::Value::List data_collector_list;
+  for (const auto& type : kDataCollectors) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  for (const auto& type : kDataCollectorsChromeosAsh) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+#if BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
+  for (const auto& type : kDataCollectorsChromeosHwDetails) {
+    data_collector_list.Append(GetDataCollectorItemForType(type));
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_WITH_HW_DETAILS)
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  return data_collector_list;
+}
+
+std::set<support_tool::DataCollectorType> GetIncludedDataCollectorTypes(
+    const base::Value::List* data_collector_items) {
+  std::set<support_tool::DataCollectorType> included_data_collectors;
+  for (const auto& item : *data_collector_items) {
+    const base::Value::Dict* item_as_dict = item.GetIfDict();
+    DCHECK(item_as_dict);
+    absl::optional<bool> isIncluded = item_as_dict->FindBool("isIncluded");
+    if (isIncluded && isIncluded.value()) {
+      included_data_collectors.insert(
+          static_cast<support_tool::DataCollectorType>(
+              item_as_dict->FindInt("protoEnum").value()));
+    }
+  }
+  return included_data_collectors;
+}
+
+base::Value GetStartDataCollectionResult(bool success,
+                                         std::string error_message) {
+  base::Value::Dict result;
+  result.Set("success", success);
+  result.Set("errorMessage", error_message);
+  return base::Value(std::move(result));
+}
+
+base::FilePath GetDefaultFileToExport(base::FilePath suggested_path,
+                                      const std::string& case_id,
+                                      base::Time timestamp) {
+  std::string timestamp_string = GetTimestampString(timestamp);
+  std::string filename =
+      case_id.empty()
+          ? base::StringPrintf("support_packet_%s", timestamp_string.c_str())
+          : base::StringPrintf("support_packet_%s_%s", case_id.c_str(),
+                               timestamp_string.c_str());
+  return suggested_path.AppendASCII(filename);
+}
+
+base::Value::Dict GenerateCustomizedURL(
+    std::string case_id,
+    const base::Value::List* data_collector_items) {
+  base::Value::Dict url_generation_response;
+  std::set<support_tool::DataCollectorType> included_data_collectors =
+      GetIncludedDataCollectorTypes(data_collector_items);
+  if (included_data_collectors.empty()) {
+    // If there's no selected data collector to add, consider this as an error.
+    return GetURLGenerationResult(
+        /*success=*/false, /*url=*/std::string(), /*error_message=*/
+        "No data collectors included. Please select a data collector.");
+  }
+  GURL customized_url("chrome://support-tool");
+  if (!case_id.empty()) {
+    customized_url = net::AppendQueryParameter(
+        customized_url, support_tool_ui::kSupportCaseIDQuery, case_id);
+  }
+  customized_url = net::AppendQueryParameter(
+      customized_url, support_tool_ui::kModuleQuery,
+      GetDataCollectionModuleQuery(included_data_collectors));
+  return GetURLGenerationResult(/*success=*/true, /*url=*/customized_url.spec(),
+                                /*error_message=*/std::string());
+}
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
index 09e60821..526ec8f 100644
--- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
@@ -7,9 +7,12 @@
 
 #include <set>
 
+#include "base/time/time.h"
 #include "base/values.h"
+#include "chrome/browser/support_tool/data_collection_module.pb.h"
 #include "chrome/browser/support_tool/data_collector.h"
 #include "components/feedback/pii_types.h"
+#include "url/gurl.h"
 
 namespace support_tool_ui {
 
@@ -38,6 +41,19 @@
 extern const char kPiiItemCountKey[];
 extern const char kPiiItemKeepKey[];
 
+// Support Tool URL query fields.
+extern const char kModuleQuery[];
+
+// String keys that Support Tool UI uses to store data collector items in
+// dictionary.
+extern const char kDataCollectorIncluded[];
+extern const char kDataCollectorProtoEnum[];
+
+// String keys of URL generation result that Support Tool UI accepts.
+extern const char kUrlGenerationResultSuccess[];
+extern const char kUrlGenerationResultUrl[];
+extern const char kUrlGenerationResultErrorMessage[];
+
 }  // namespace support_tool_ui
 
 // Returns PIIDataItems in `detected_pii` where PIIDataItem is
@@ -54,4 +70,61 @@
 std::set<feedback::PIIType> GetPIITypesToKeep(
     const base::Value::List* pii_items);
 
+// Returns the support case ID that's extracted from `url` with query
+// `kSupportCaseIDQuery`. Returns empty string if `url` doesn't contain support
+// case ID.
+std::string GetSupportCaseIDFromURL(const GURL& url);
+
+// Creates base::Value::List according to the format Support Tool UI
+// accepts and fills the contents with by decoding `module_query` to its
+// support_tool.pb components. Support Tool UI requests data collector items in
+// format:
+// type DataCollectorItem = {
+//  name: string,
+//  isIncluded: boolean,
+//  protoEnum: number,
+// }
+// Returns only the data collectors that are available for user's device.
+base::Value::List GetDataCollectorItemsInQuery(std::string module_query);
+
+// Creates base::Value::List according to the format Support Tool UI
+// accepts and fills the contents with all data collectors with isIncluded:
+// false as a default choice. Support Tool UI requests data collector items in
+// format:
+// type DataCollectorItem = {
+//  name: string,
+//  isIncluded: boolean,
+//  protoEnum: number,
+// }
+base::Value::List GetAllDataCollectors();
+
+// Creates base::Value::List according to the format Support Tool UI
+// accepts and fills the contents with all data collectors with isIncluded:
+// false as a default choice. Only return data collectors available for caller's
+// platform.
+base::Value::List GetAllDataCollectorsForDevice();
+
+std::set<support_tool::DataCollectorType> GetIncludedDataCollectorTypes(
+    const base::Value::List* data_collector_items);
+
+// Returns start data collection result in a structure that Support Tool UI
+// accepts. The returned type is as follow: type StartDataCollectionResult = {
+//   success: boolean,
+//   errorMessage: string,
+// }
+base::Value GetStartDataCollectionResult(bool success,
+                                         std::string error_message);
+
+base::FilePath GetDefaultFileToExport(base::FilePath suggested_path,
+                                      const std::string& case_id,
+                                      base::Time timestamp);
+
+// Generates a customized chrome://support-tool URL from given `case_id` and
+// `data_collector_items` and returns the result in a format Support Tool UI
+// expects. Returns a result with error when there's no data collector selected
+// in `data_collector_items`.
+base::Value::Dict GenerateCustomizedURL(
+    std::string case_id,
+    const base::Value::List* data_collector_items);
+
 #endif  // CHROME_BROWSER_UI_WEBUI_SUPPORT_TOOL_SUPPORT_TOOL_UI_UTILS_H_
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc
index 682d862c..ecdd6dd 100644
--- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc
@@ -7,15 +7,22 @@
 #include <set>
 #include <string>
 
+#include "base/containers/contains.h"
 #include "base/containers/fixed_flat_map.h"
 #include "base/strings/string_piece_forward.h"
 #include "base/values.h"
+#include "chrome/browser/support_tool/data_collection_module.pb.h"
 #include "chrome/browser/support_tool/data_collector.h"
 #include "components/feedback/pii_types.h"
+#include "net/base/url_util.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
+using ::testing::ContainerEq;
+using ::testing::IsEmpty;
+using ::testing::Not;
 using ::testing::StrEq;
 using ::testing::UnorderedElementsAreArray;
 
@@ -53,6 +60,24 @@
 
   SupportToolUiUtilsTest(const SupportToolUiUtilsTest&) = delete;
   SupportToolUiUtilsTest& operator=(const SupportToolUiUtilsTest&) = delete;
+
+  // Change included field of `included_data_collectors` in `data_collectors` as
+  // true for testing.
+  void MarkDataCollectorsAsIncluded(
+      base::Value::List& data_collectors,
+      const std::set<support_tool::DataCollectorType>&
+          included_data_collectors) {
+    for (auto& data_collector : data_collectors) {
+      base::Value::Dict& data_collector_item = data_collector.GetDict();
+      absl::optional<int> data_collector_enum =
+          data_collector_item.FindInt(support_tool_ui::kDataCollectorProtoEnum);
+      ASSERT_TRUE(data_collector_enum);
+      if (base::Contains(included_data_collectors,
+                         static_cast<support_tool::DataCollectorType>(
+                             data_collector_enum.value())))
+        data_collector_item.Set(support_tool_ui::kDataCollectorIncluded, true);
+    }
+  }
 };
 
 TEST_F(SupportToolUiUtilsTest, PiiItems) {
@@ -91,3 +116,63 @@
   // Check if the returned PII type set is as expected.
   EXPECT_THAT(pii_to_keep_result, UnorderedElementsAreArray(kPIITypes));
 }
+
+TEST_F(SupportToolUiUtilsTest, CustomizedUrl) {
+  const std::string test_case_id = "test_case_id_0";
+  // Get list of all data collectors.
+  base::Value::List expected_data_collectors = GetAllDataCollectorsForDevice();
+  std::set<support_tool::DataCollectorType> included_data_collectors = {
+      support_tool::DataCollectorType::CHROME_INTERNAL,
+      support_tool::DataCollectorType::CRASH_IDS};
+  MarkDataCollectorsAsIncluded(expected_data_collectors,
+                               included_data_collectors);
+  base::Value::Dict url_generation_result =
+      GenerateCustomizedURL(test_case_id, &expected_data_collectors);
+  // The result must be successful.
+  EXPECT_TRUE(url_generation_result
+                  .FindBool(support_tool_ui::kUrlGenerationResultSuccess)
+                  .value());
+  // Error string must be empty.
+  EXPECT_EQ(*url_generation_result.FindString(
+                support_tool_ui::kUrlGenerationResultErrorMessage),
+            std::string());
+  const std::string* url_output = url_generation_result.FindString(
+      support_tool_ui::kUrlGenerationResultUrl);
+  ASSERT_TRUE(url_output);
+  // URL output shouldn't be empty.
+  EXPECT_THAT(*url_output, Not(IsEmpty()));
+  // Check that case ID in the URL is as expected.
+  EXPECT_EQ(GetSupportCaseIDFromURL(GURL(*url_output)), test_case_id);
+  // Get the data collector module from URL.
+  std::string data_collector_module;
+  net::GetValueForKeyInQuery(GURL(*url_output), support_tool_ui::kModuleQuery,
+                             &data_collector_module);
+  EXPECT_THAT(data_collector_module, Not(IsEmpty()));
+  base::Value::List data_collector_items_result =
+      GetDataCollectorItemsInQuery(data_collector_module);
+  // Check that the output data collector list is equal to expected.
+  EXPECT_EQ(data_collector_items_result.size(),
+            expected_data_collectors.size());
+  for (size_t i = 0; i < data_collector_items_result.size(); i++) {
+    const base::Value::Dict& actual_data_collector_item =
+        data_collector_items_result[i].GetDict();
+    const base::Value::Dict& extected_data_collector_item =
+        expected_data_collectors[i].GetDict();
+    EXPECT_EQ(actual_data_collector_item
+                  .FindInt(support_tool_ui::kDataCollectorProtoEnum)
+                  .value(),
+              extected_data_collector_item
+                  .FindInt(support_tool_ui::kDataCollectorProtoEnum)
+                  .value());
+    EXPECT_EQ(actual_data_collector_item
+                  .FindBool(support_tool_ui::kDataCollectorIncluded)
+                  .value(),
+              extected_data_collector_item
+                  .FindBool(support_tool_ui::kDataCollectorIncluded)
+                  .value());
+  }
+  // Check if the output of GetIncludedDataCollectorTypes is equal to expected
+  // set of included data collectors.
+  EXPECT_THAT(GetIncludedDataCollectorTypes(&data_collector_items_result),
+              ContainerEq(included_data_collectors));
+}
diff --git a/chrome/browser/web_applications/web_app_prefs_utils_unittest.cc b/chrome/browser/web_applications/web_app_prefs_utils_unittest.cc
index 25762a4..30b9fbd8 100644
--- a/chrome/browser/web_applications/web_app_prefs_utils_unittest.cc
+++ b/chrome/browser/web_applications/web_app_prefs_utils_unittest.cc
@@ -60,9 +60,10 @@
       GetTimeWebAppPref(prefs(), app_id, kIphLastIgnoreTime);
   EXPECT_TRUE(last_ignore_time.has_value());
   {
-    auto* dict = prefs()->GetDictionary(prefs::kWebAppsAppAgnosticIphState);
-    EXPECT_EQ(dict->FindIntKey(kIphIgnoreCount).value_or(0), 1);
-    EXPECT_EQ(base::ValueToTime(dict->FindKey(kIphLastIgnoreTime)),
+    const auto& dict =
+        prefs()->GetValueDict(prefs::kWebAppsAppAgnosticIphState);
+    EXPECT_EQ(dict.FindInt(kIphIgnoreCount).value_or(0), 1);
+    EXPECT_EQ(base::ValueToTime(dict.Find(kIphLastIgnoreTime)),
               last_ignore_time.value());
   }
 }
@@ -78,9 +79,10 @@
   EXPECT_NE(GetTimeWebAppPref(prefs(), app_id, kIphLastIgnoreTime).value(),
             last_ignore_time.value());
   {
-    auto* dict = prefs()->GetDictionary(prefs::kWebAppsAppAgnosticIphState);
-    EXPECT_EQ(dict->FindIntKey(kIphIgnoreCount).value_or(0), 2);
-    EXPECT_NE(base::ValueToTime(dict->FindKey(kIphLastIgnoreTime)),
+    const auto& dict =
+        prefs()->GetValueDict(prefs::kWebAppsAppAgnosticIphState);
+    EXPECT_EQ(dict.FindInt(kIphIgnoreCount).value_or(0), 2);
+    EXPECT_NE(base::ValueToTime(dict.Find(kIphLastIgnoreTime)),
               last_ignore_time.value());
   }
 }
@@ -89,14 +91,16 @@
   RecordInstallIphIgnored(prefs(), app_id, base::Time::Now());
   EXPECT_EQ(GetIntWebAppPref(prefs(), app_id, kIphIgnoreCount).value_or(0), 1);
   {
-    auto* dict = prefs()->GetDictionary(prefs::kWebAppsAppAgnosticIphState);
-    EXPECT_EQ(dict->FindIntKey(kIphIgnoreCount).value_or(0), 1);
+    const auto& dict =
+        prefs()->GetValueDict(prefs::kWebAppsAppAgnosticIphState);
+    EXPECT_EQ(dict.FindInt(kIphIgnoreCount).value_or(0), 1);
   }
   RecordInstallIphInstalled(prefs(), app_id);
   EXPECT_EQ(GetIntWebAppPref(prefs(), app_id, kIphIgnoreCount).value_or(0), 0);
   {
-    auto* dict = prefs()->GetDictionary(prefs::kWebAppsAppAgnosticIphState);
-    EXPECT_EQ(dict->FindIntKey(kIphIgnoreCount).value_or(0), 0);
+    const auto& dict =
+        prefs()->GetValueDict(prefs::kWebAppsAppAgnosticIphState);
+    EXPECT_EQ(dict.FindInt(kIphIgnoreCount).value_or(0), 0);
   }
 }
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 3d2a5312..e1cc1da96 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1659937653-84b2c5ab0eda3fbccd519f5e13134b37beeb4cae.profdata
+chrome-linux-main-1659959824-0a23fcdaf8795221db8935feb2e38be11c03180a.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 4c1c1df4..fe7d37b 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1659937653-e0763cb9a20f43c09981d2515504cd9ec2f2118b.profdata
+chrome-mac-arm-main-1659959824-d6500bee8a222f394e0a510a72a40952f5e86ef7.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 51d4cd7..2f3e17f 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1659937653-fc6726c971f73f67a5edeba58de411c1f1d4aa9d.profdata
+chrome-mac-main-1659959824-6d8641102a4166bfaa8e720ba5e553803f189857.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 03ddf153..d30a0b8 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1659937653-c3947c8dfde79cec88b9e95889e76d37f9d95d4e.profdata
+chrome-win32-main-1659959824-0970af9e8799c52a2f5a407b5e5bf24b080ff89b.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 7b6ff7d6..bf68f53c 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1659937653-167eb94540f88099c05cd5759b847979e54237d5.profdata
+chrome-win64-main-1659959824-9e7327fa2638d61d5552a9b4492a9fbc0d227569.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index a2897ab..1831a63 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -244,8 +244,6 @@
         "$root_gen_dir/chrome/audio_resources.pak",
         "$root_gen_dir/chrome/bluetooth_pairing_dialog_resources.pak",
         "$root_gen_dir/chrome/browser/supervised_user/supervised_user_unscaled_resources.pak",
-        "$root_gen_dir/chrome/cloud_upload_resources.pak",
-        "$root_gen_dir/chrome/common/chromeos/extensions/chromeos_system_extensions_resources.pak",
         "$root_gen_dir/chrome/emoji_picker_resources.pak",
         "$root_gen_dir/chrome/gaia_action_buttons_resources.pak",
         "$root_gen_dir/chrome/internet_config_dialog_resources.pak",
@@ -322,7 +320,6 @@
         "//chrome/browser/resources/nearby_share:resources",
         "//chrome/browser/resources/settings/chromeos:resources",
         "//chrome/browser/supervised_user:supervised_user_unscaled_resources",
-        "//chrome/common/chromeos/extensions:resources",
         "//chromeos/ash/resources",
         "//chromeos/resources",
         "//ui/file_manager:file_manager_gen_resources",
@@ -349,6 +346,10 @@
         deps += [ "//ash/ambient/resources:lottie_resources" ]
       }
     }
+    if (is_chromeos) {
+      sources += [ "$root_gen_dir/chrome/common/chromeos/extensions/chromeos_system_extensions_resources.pak" ]
+      deps += [ "//chrome/common/chromeos/extensions:resources" ]
+    }
     if (is_linux || is_chromeos) {
       sources += [ "$root_gen_dir/chrome/webui_js_error_resources.pak" ]
       deps += [ "//chrome/browser/resources/webui_js_error:resources" ]
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index aa50e5bf..0a12b55 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -380,10 +380,11 @@
       "extensions/api/input_ime/input_components_handler.h",
     ]
     public_deps += [ "//ash/keyboard/ui" ]
-    deps += [
-      "//ash/constants",
-      "//chrome/common/chromeos/extensions",
-    ]
+    deps += [ "//ash/constants" ]
+  }
+
+  if (is_chromeos) {
+    deps += [ "//chrome/common/chromeos/extensions" ]
   }
 
   if (enable_nacl) {
diff --git a/chrome/common/chromeos/extensions/api/_api_features.json b/chrome/common/chromeos/extensions/api/_api_features.json
index a3fe4eba..e18ae7c 100644
--- a/chrome/common/chromeos/extensions/api/_api_features.json
+++ b/chrome/common/chromeos/extensions/api/_api_features.json
@@ -13,6 +13,9 @@
     "contexts": [
       "blessed_extension"
     ],
+    "platforms": [
+      "chromeos"
+    ],
     "channel": "stable"
   },
   "os.telemetry": {
@@ -20,6 +23,10 @@
     "contexts": [
       "blessed_extension"
     ],
+    "platforms": [
+      "chromeos",
+      "lacros"
+    ],
     "channel": "stable"
   }
 }
diff --git a/chrome/common/chromeos/extensions/api/api_sources.gni b/chrome/common/chromeos/extensions/api/api_sources.gni
index ac91f8a..c7d2ae8 100644
--- a/chrome/common/chromeos/extensions/api/api_sources.gni
+++ b/chrome/common/chromeos/extensions/api/api_sources.gni
@@ -8,10 +8,11 @@
 
 assert(enable_extensions)
 
-schema_sources_ = [
-  "diagnostics.idl",
-  "telemetry.idl",
-]
+schema_sources_ = [ "telemetry.idl" ]
+
+if (is_chromeos_ash) {
+  schema_sources_ += [ "diagnostics.idl" ]
+}
 
 chromeos_system_extensions_api_schema_sources =
     get_path_info(schema_sources_, "abspath")
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index d40b0bc0..6f55e84 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -265,7 +265,7 @@
 
   callback IsLacrosPrimaryBrowserCallback = void (boolean primary);
 
-  // A mapping of crosapi::BrowserManager::State
+  // crosapi::BrowserManager::State
   enum LacrosState {
     NotInitialized,
     Mounting,
@@ -277,14 +277,6 @@
     Terminating
   };
 
-  // A mapping of crosapi::browser_util::LacrosMode
-  enum LacrosMode {
-    Disabled,
-    SideBySide,
-    Primary,
-    Only
-  };
-
   dictionary LacrosInfo {
     // The state of lacros.
     LacrosState state;
@@ -293,9 +285,6 @@
     // Path to lacros-chrome directory. Note that this may change over time if
     // omaha is used. This also may be empty if lacros is not running.
     DOMString lacrosPath;
-    // Specifies the mode Lacros is currently running.
-    // For a full list of supported mode, see LacrosMode enum definition.
-    LacrosMode lacrosMode;
   };
 
   callback GetLacrosInfoCallback = void (LacrosInfo info);
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl
index 2f8292e..7aa73bc 100644
--- a/chrome/common/extensions/api/file_manager_private.idl
+++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -387,6 +387,13 @@
   kOrganization
 };
 
+enum DlpLevel {
+  // User cannot perform an action.
+  block,
+  // No restriction.
+  allow
+};
+
 // These three fields together uniquely identify a task.
 dictionary FileTaskDescriptor {
   DOMString appId;
@@ -1040,6 +1047,17 @@
   boolean isDlpRestricted;
 };
 
+dictionary DlpRestrictionDetails {
+  // The level for which the restriction is enforced.
+  DlpLevel level;
+
+  // List of URLs for which the restriction is enforced.
+  DOMString[] urls;
+
+  // List of components for which the restriction is enforced.
+  VolumeType[] components;
+};
+
 // A Guest OS that supports guest->host file sharing. This definition should
 // match the one in file_manager_private.js.
 dictionary MountableGuest {
@@ -1107,6 +1125,11 @@
 callback GetDlpMetadataCallback =
     void(DlpMetadata[] dlpMetadata);
 
+// |restrictionDetails| A list of DlpRestrictionDetails containing
+// summarized restriction information about an entry.
+callback GetDlpRestrictionDetailsCallback =
+    void(DlpRestrictionDetails[] restrictionDetails);
+
 // |copyId| ID of the copy task. Can be used to identify the progress, and to
 // cancel the task.
 callback StartCopyCallback = void(long copyId);
@@ -1401,10 +1424,12 @@
       [instanceOf=Entry] object[] entries,
       GetDlpMetadataCallback callback);
 
-  // Shows a modal containing Data Leak Prevention (DLP) Restriction Details.
+  // Retrieves Data Leak Prevention (DLP) restriction details.
   // |sourceUrl| Source URL of the Entry for which the details should be shown.
-  static void showDlpRestrictionDetails(
-      DOMString sourceUrl);
+  // |callback| Result callback.
+  static void getDlpRestrictionDetails(
+      DOMString sourceUrl,
+      GetDlpRestrictionDetailsCallback callback);
 
   // Starts to copy an entry. If the source is a directory, the copy is done
   // recursively.
diff --git a/chrome/common/extensions/api/web_navigation.json b/chrome/common/extensions/api/web_navigation.json
index 77f907c9..78b8643 100644
--- a/chrome/common/extensions/api/web_navigation.json
+++ b/chrome/common/extensions/api/web_navigation.json
@@ -75,12 +75,12 @@
                   "nodoc": true
                 },
                 "documentLifecycle": {
-                  "type": "string",
+                  "$ref": "extensionTypes.DocumentLifecycle",
                   "description": "The lifecycle the document is in.",
                   "nodoc": true
                 },
                 "frameType": {
-                  "type": "string",
+                  "$ref": "extensionTypes.FrameType",
                   "description": "The type of frame the navigation occurred in.",
                   "nodoc": true
                 }
@@ -146,12 +146,12 @@
                     "nodoc": true
                   },
                   "documentLifecycle": {
-                    "type": "string",
+                    "$ref": "extensionTypes.DocumentLifecycle",
                     "description": "The lifecycle the document is in.",
                     "nodoc": true
                   },
                   "frameType": {
-                    "type": "string",
+                    "$ref": "extensionTypes.FrameType",
                     "description": "The type of frame the navigation occurred in.",
                     "nodoc": true
                   }
@@ -191,8 +191,8 @@
               "parentFrameId": {"type": "integer", "description": "The ID of the parent frame, or <code>-1</code> if this is the main frame."},
               "timeStamp": {"type": "number", "description": "The time when the browser was about to start the navigation, in milliseconds since the epoch."},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -224,8 +224,8 @@
               "timeStamp": {"type": "number", "description": "The time when the navigation was committed, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -255,8 +255,8 @@
               "timeStamp": {"type": "number", "description": "The time when the page's DOM was fully constructed, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -286,8 +286,8 @@
               "timeStamp": {"type": "number", "description": "The time when the document finished loading, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -322,8 +322,8 @@
               "timeStamp": {"type": "number", "description": "The time when the error occurred, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -382,8 +382,8 @@
               "timeStamp": {"type": "number", "description": "The time when the navigation was committed, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
@@ -431,8 +431,8 @@
               "timeStamp": {"type": "number", "description": "The time when the navigation was committed, in milliseconds since the epoch."},
               "documentId": {"type": "string", "description": "A UUID of the document loaded.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true}
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle","description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType","description": "The type of frame the navigation occurred in.","nodoc": true}
             }
           }
         ]
diff --git a/chrome/common/initialize_extensions_client.cc b/chrome/common/initialize_extensions_client.cc
index bababbe..a5f8654b 100644
--- a/chrome/common/initialize_extensions_client.cc
+++ b/chrome/common/initialize_extensions_client.cc
@@ -12,7 +12,7 @@
 #include "chrome/common/extensions/chrome_extensions_client.h"
 #include "extensions/common/extensions_client.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/common/chromeos/extensions/chromeos_system_extensions_api_provider.h"
 #endif
 
@@ -26,7 +26,7 @@
     initialized = true;
     extensions_client->AddAPIProvider(
         std::make_unique<chrome_apps::ChromeAppsAPIProvider>());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     extensions_client->AddAPIProvider(
         std::make_unique<chromeos::ChromeOSSystemExtensionsAPIProvider>());
 #endif
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9b233cb..5291986 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2669,7 +2669,6 @@
       sources += [
         "../browser/apps/app_service/webapk/webapk_utils_lacros_browsertest.cc",
         "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
         "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
         "../browser/chromeos/policy/dlp/dlp_content_restriction_set_browsertest.cc",
@@ -3869,7 +3868,6 @@
         "../browser/ash/web_applications/shortcut_customization_app_integration_browsertest.cc",
         "../browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc",
         "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
-        "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_restriction_set_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_data_transfer_notifier_browsertest.cc",
@@ -4652,6 +4650,7 @@
       ":sync_integration_test_support",
       ":test_support",
       "//chrome/app:command_ids",
+      "//chrome/browser/chromeos/extensions/telemetry/api:browser_tests",
       "//chromeos/crosapi/mojom",
       "//chromeos/lacros",
       "//chromeos/lacros:test_support",
@@ -6076,6 +6075,7 @@
       "../../testing/gtest_mac_unittest.mm",
       "../browser/app_controller_mac_unittest.mm",
       "../browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm",
+      "../browser/device_reauth/mac/biometric_authenticator_mac_unittest.mm",
       "../browser/global_keyboard_shortcuts_mac_unittest.mm",
       "../browser/mac/auth_session_request_unittest.mm",
       "../browser/mac/exception_processor_unittest.mm",
@@ -6954,6 +6954,7 @@
       "//chrome/browser/resources/new_tab_page_instant:resources_grit",
       "//chrome/browser/share/core:share_targets_unittest",
       "//chrome/browser/share/core/crow:crow_configuration_unittest",
+      "//chrome/browser/support_tool:support_tool_proto",
       "//chrome/browser/ui/color:color_headers",
       "//chrome/browser/ui/color:mixers",
       "//chrome/browser/ui/webui/discards:mojo_bindings",
@@ -7981,10 +7982,17 @@
         "../browser/chromeos/extensions/login_screen/login/external_logout_request/external_logout_request_event_handler_unittest.cc",
         "../browser/chromeos/extensions/login_screen/login_state/login_state_api_unittest.cc",
         "//chrome/browser/chromeos/extensions/contact_center_insights/contact_center_insights_extension_manager_unittest.cc",
+
+        # TODO(b/207754758): Move the following file into the appropriate target
+        "//chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc",
       ]
-      deps += [ "//chromeos/dbus/missive:missive" ]
-    } else {
-      sources += [ "../browser/extensions/api/messaging/native_messaging_policy_handler_unittest.cc" ]
+      deps += [
+        "//chrome/browser/chromeos/extensions/telemetry/api",
+        "//chrome/browser/chromeos/extensions/telemetry/api:fake_hardware_info_delegate",
+        "//chrome/browser/chromeos/extensions/telemetry/api:unit_tests",
+        "//chrome/common/chromeos/extensions",
+        "//chromeos/dbus/missive:missive",
+      ]
     }
 
     if (is_chromeos_ash) {
@@ -7999,8 +8007,7 @@
         "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api_ash_unittest.cc",
         "../browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc",
 
-        # TODO(b/207754758): Move the following two files into the appropriate target
-        "../browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc",
+        # TODO(b/207754758): Move the following file into the appropriate target
         "../browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc",
         "../browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api_ash_unittest.cc",
         "../browser/extensions/api/file_system/consent_provider_unittest.cc",
@@ -9585,6 +9592,7 @@
       deps += [
         "//ash/components/login/auth",
         "//ash/constants",
+        "//chrome/browser/chromeos:dlp_policy_event_proto",
         "//chrome/browser/chromeos:test_support",
         "//chrome/browser/media/router:test_support",
         "//chrome/browser/ui/ash/system_web_apps",
@@ -9619,7 +9627,33 @@
         "//chromeos/ui/base",
         "//chromeos/ui/frame",
         "//chromeos/ui/frame:test_support",
+        "//components/reporting/client:report_queue",
+        "//components/reporting/client:test_support",
+        "//components/reporting/storage:test_support",
+        "//components/reporting/util:test_callbacks_support",
       ]
+
+      sources += [
+        "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc",
+        "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h",
+        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc",
+        "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h",
+        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
+        "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
+        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc",
+        "../browser/chromeos/policy/dlp/mock_dlp_content_observer.h",
+        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc",
+        "../browser/chromeos/policy/dlp/mock_dlp_rules_manager.h",
+        "../browser/printing/test_print_preview_dialog_cloned_observer.cc",
+        "../browser/printing/test_print_preview_dialog_cloned_observer.h",
+        "../browser/printing/test_print_view_manager_for_request_preview.cc",
+        "../browser/printing/test_print_view_manager_for_request_preview.h",
+      ]
+
+      if (enable_basic_printing) {
+        deps += [ "//components/printing/common:mojo_interfaces" ]
+      }
     }
 
     if (is_chromeos_lacros) {
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn
index 44ecea1d..68fe940 100644
--- a/chrome/test/chromedriver/BUILD.gn
+++ b/chrome/test/chromedriver/BUILD.gn
@@ -146,6 +146,8 @@
     "chrome/non_blocking_navigation_tracker.h",
     "chrome/page_load_strategy.cc",
     "chrome/page_load_strategy.h",
+    "chrome/page_tracker.cc",
+    "chrome/page_tracker.h",
     "chrome/scoped_temp_dir_with_retry.cc",
     "chrome/scoped_temp_dir_with_retry.h",
     "chrome/status.cc",
diff --git a/chrome/test/chromedriver/chrome/cast_tracker.cc b/chrome/test/chromedriver/chrome/cast_tracker.cc
index 120aaef..50f0c1d 100644
--- a/chrome/test/chromedriver/chrome/cast_tracker.cc
+++ b/chrome/test/chromedriver/chrome/cast_tracker.cc
@@ -17,6 +17,10 @@
 
 CastTracker::~CastTracker() = default;
 
+bool CastTracker::ListensToConnections() const {
+  return false;
+}
+
 Status CastTracker::OnEvent(DevToolsClient* client,
                             const std::string& method,
                             const base::DictionaryValue& params) {
diff --git a/chrome/test/chromedriver/chrome/cast_tracker.h b/chrome/test/chromedriver/chrome/cast_tracker.h
index 46bee32c..0374ad0 100644
--- a/chrome/test/chromedriver/chrome/cast_tracker.h
+++ b/chrome/test/chromedriver/chrome/cast_tracker.h
@@ -24,6 +24,7 @@
   ~CastTracker() override;
 
   // DevToolsEventListener:
+  bool ListensToConnections() const override;
   Status OnEvent(DevToolsClient* client,
                  const std::string& method,
                  const base::DictionaryValue& params) override;
diff --git a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
index c623f36..6a2bfb23 100644
--- a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
@@ -5,6 +5,7 @@
 #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h"
 
 #include <stddef.h>
+#include <memory>
 #include <utility>
 
 #include "base/files/file_path.h"
@@ -19,6 +20,7 @@
 #include "build/build_config.h"
 #include "chrome/test/chromedriver/chrome/device_metrics.h"
 #include "chrome/test/chromedriver/chrome/devtools_client.h"
+#include "chrome/test/chromedriver/chrome/devtools_client_impl.h"
 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
 #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
 #include "chrome/test/chromedriver/chrome/status.h"
@@ -127,7 +129,7 @@
   WebViewInfo::Type type = WebViewInfo::Type::kPage;
   while (timeout.GetRemainingTime().is_positive()) {
     WebViewsInfo views_info;
-    Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
+    Status status = GetWebViewsInfo(&views_info);
     if (status.IsError())
       return status;
 
@@ -155,10 +157,21 @@
     // https://code.google.com/p/chromedriver/issues/detail?id=1205
     device_metrics = nullptr;
   }
-  std::unique_ptr<WebView> web_view_tmp(new WebViewImpl(
+
+  std::unique_ptr<DevToolsClientImpl> client;
+  Status status = CreateClient(id, &client);
+  if (status.IsError())
+    return status;
+  std::unique_ptr<WebViewImpl> web_view_tmp(new WebViewImpl(
       id, w3c_compliant, nullptr, devtools_http_client_->browser_info(),
-      CreateClient(id), device_metrics, page_load_strategy()));
-  Status status = web_view_tmp->ConnectIfNecessary();
+      std::move(client), device_metrics, page_load_strategy()));
+  DevToolsClientImpl* parent =
+      static_cast<DevToolsClientImpl*>(devtools_websocket_client_.get());
+  status = web_view_tmp->AttachTo(parent);
+  if (status.IsError()) {
+    return status;
+  }
+  status = web_view_tmp->ConnectIfNecessary();
   if (status.IsError())
     return status;
 
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc
index 051dd434..31a797c3 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -6,9 +6,11 @@
 
 #include <stddef.h>
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
+#include "base/check.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/platform_thread.h"
@@ -21,6 +23,7 @@
 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
 #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
 #include "chrome/test/chromedriver/chrome/page_load_strategy.h"
+#include "chrome/test/chromedriver/chrome/page_tracker.h"
 #include "chrome/test/chromedriver/chrome/status.h"
 #include "chrome/test/chromedriver/chrome/web_view_impl.h"
 #include "url/gurl.h"
@@ -56,10 +59,12 @@
 Status ChromeImpl::GetWebViewIdForFirstTab(std::string* web_view_id,
                                            bool w3c_compliant) {
   WebViewsInfo views_info;
-  Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
+  Status status = GetWebViewsInfo(&views_info);
   if (status.IsError())
     return status;
-  UpdateWebViews(views_info, w3c_compliant);
+  status = UpdateWebViews(views_info, w3c_compliant);
+  if (status.IsError())
+    return status;
   for (int i = views_info.GetSize() - 1; i >= 0; --i) {
     const WebViewInfo& view = views_info.Get(i);
     if (view.type == WebViewInfo::kPage) {
@@ -73,10 +78,12 @@
 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids,
                                  bool w3c_compliant) {
   WebViewsInfo views_info;
-  Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
+  Status status = GetWebViewsInfo(&views_info);
   if (status.IsError())
     return status;
-  UpdateWebViews(views_info, w3c_compliant);
+  status = UpdateWebViews(views_info, w3c_compliant);
+  if (status.IsError())
+    return status;
   std::list<std::string> web_view_ids_tmp;
   for (const auto& view : web_views_)
     web_view_ids_tmp.push_back(view->GetId());
@@ -84,14 +91,14 @@
   return Status(kOk);
 }
 
-void ChromeImpl::UpdateWebViews(const WebViewsInfo& views_info,
-                                bool w3c_compliant) {
+Status ChromeImpl::UpdateWebViews(const WebViewsInfo& views_info,
+                                  bool w3c_compliant) {
   // Check if some web views are closed (or in the case of background pages,
   // become inactive).
   auto it = web_views_.begin();
   while (it != web_views_.end()) {
     const WebViewInfo* view = views_info.GetForId((*it)->GetId());
-    if (!view || view->IsInactiveBackgroundPage()) {
+    if (!view) {
       it = web_views_.erase(it);
     } else {
       ++it;
@@ -101,8 +108,7 @@
   // Check for newly-opened web views.
   for (size_t i = 0; i < views_info.GetSize(); ++i) {
     const WebViewInfo& view = views_info.Get(i);
-    if (devtools_http_client_->IsBrowserWindow(view) &&
-        !view.IsInactiveBackgroundPage()) {
+    if (devtools_http_client_->IsBrowserWindow(view)) {
       bool found = false;
       for (const auto& web_view : web_views_) {
         if (web_view->GetId() == view.id) {
@@ -111,7 +117,12 @@
         }
       }
       if (!found) {
-        std::unique_ptr<DevToolsClient> client = CreateClient(view.id);
+        std::unique_ptr<DevToolsClientImpl> client;
+        Status status = CreateClient(view.id, &client);
+        if (status.IsError()) {
+          return status;
+        }
+
         for (const auto& listener : devtools_event_listeners_)
           client->AddListener(listener.get());
         // OnConnected will fire when DevToolsClient connects later.
@@ -126,9 +137,21 @@
               devtools_http_client_->browser_info(), std::move(client),
               device_metrics_.get(), page_load_strategy_));
         }
+        DevToolsClientImpl* parent =
+            static_cast<DevToolsClientImpl*>(devtools_websocket_client_.get());
+        status = web_views_.back()->AttachTo(parent);
+        if (status.IsError()) {
+          return status;
+        }
+        status = web_views_.back()->ConnectIfNecessary();
+        if (status.IsError()) {
+          return status;
+        }
       }
     }
   }
+
+  return Status(kOk);
 }
 
 Status ChromeImpl::GetWebViewById(const std::string& id, WebView** web_view) {
@@ -171,19 +194,47 @@
   return Status(kOk);
 }
 
-std::unique_ptr<DevToolsClient> ChromeImpl::CreateClient(
-    const std::string& id) {
-  auto result = std::make_unique<DevToolsClientImpl>(
-      id, "", devtools_http_client_->endpoint().GetDebuggerUrl(id),
-      socket_factory_);
-  result->SetFrontendCloserFunc(base::BindRepeating(
+Status ChromeImpl::CreateClient(const std::string& id,
+                                std::unique_ptr<DevToolsClientImpl>* client) {
+  Status status = devtools_websocket_client_->ConnectIfNecessary();
+  if (status.IsError()) {
+    return status;
+  }
+
+  std::string session_id;
+  {
+    base::Value params(base::Value::Type::DICT);
+    base::Value result;
+    params.GetDict().Set("targetId", id);
+    params.GetDict().Set("flatten", true);
+    status = devtools_websocket_client_->SendCommandAndGetResult(
+        "Target.attachToTarget", base::Value::AsDictionaryValue(params),
+        &result);
+    if (status.IsError()) {
+      return status;
+    }
+
+    std::string* session_id_ptr = result.GetDict().FindString("sessionId");
+
+    if (session_id_ptr == nullptr) {
+      return Status(kUnknownError,
+                    "No sessionId in the response to Target.attachToTarget");
+    }
+
+    session_id = *session_id_ptr;
+  }
+
+  *client = std::make_unique<DevToolsClientImpl>(id, session_id);
+  (*client)->SetFrontendCloserFunc(base::BindRepeating(
       &ChromeImpl::CloseFrontends, base::Unretained(this), id));
-  return result;
+  (*client)->SetMainPage(true);
+
+  return status;
 }
 
 Status ChromeImpl::CloseFrontends(const std::string& for_client_id) {
   WebViewsInfo views_info;
-  Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
+  Status status = GetWebViewsInfo(&views_info);
   if (status.IsError())
     return status;
 
@@ -217,13 +268,21 @@
 
   for (std::list<std::string>::const_iterator it = docked_frontend_ids.begin();
        it != docked_frontend_ids.end(); ++it) {
-    std::unique_ptr<DevToolsClient> client(new DevToolsClientImpl(
-        *it, "", devtools_http_client_->endpoint().GetDebuggerUrl(*it),
-        socket_factory_));
+    std::unique_ptr<DevToolsClientImpl> client;
+    Status status = CreateClient(*it, &client);
+    if (status.IsError())
+      return status;
     std::unique_ptr<WebViewImpl> web_view(new WebViewImpl(
         *it, false, nullptr, devtools_http_client_->browser_info(),
         std::move(client), nullptr, page_load_strategy_));
 
+    DevToolsClientImpl* parent =
+        static_cast<DevToolsClientImpl*>(devtools_websocket_client_.get());
+    status = web_view->AttachTo(parent);
+    if (status.IsError()) {
+      return status;
+    }
+
     status = web_view->ConnectIfNecessary();
     // Ignore disconnected error, because the debugger might have closed when
     // its container page was closed above.
@@ -236,22 +295,14 @@
       return status;
   }
 
-  // Wait until DevTools UI disconnects from the given web view.
-  base::TimeTicks deadline = base::TimeTicks::Now() + base::Seconds(20);
-  while (base::TimeTicks::Now() < deadline) {
-    status = devtools_http_client_->GetWebViewsInfo(&views_info);
-    if (status.IsError())
-      return status;
+  status = GetWebViewsInfo(&views_info);
+  if (status.IsError())
+    return status;
 
-    const WebViewInfo* view_info = views_info.GetForId(for_client_id);
-    if (!view_info)
-      return Status(kNoSuchWindow, "window was already closed");
-    if (view_info->debugger_url.size())
-      return Status(kOk);
-
-    base::PlatformThread::Sleep(base::Milliseconds(50));
-  }
-  return Status(kUnknownError, "failed to close UI debuggers");
+  const WebViewInfo* view_info = views_info.GetForId(for_client_id);
+  if (!view_info)
+    return Status(kNoSuchWindow, "window was already closed");
+  return Status(kOk);
 }
 
 Status ChromeImpl::GetWindow(const std::string& target_id, Window* window) {
@@ -514,6 +565,61 @@
   return MakeFailedStatus(*desired_state, window->state);
 }
 
+Status ChromeImpl::GetWebViewsInfo(WebViewsInfo* views_info) {
+  DCHECK(views_info);
+  Status status{kOk};
+
+  status = devtools_websocket_client_->ConnectIfNecessary();
+  if (status.IsError()) {
+    return status;
+  }
+
+  base::Value params{base::Value::Type::DICT};
+  base::Value result;
+  status = devtools_websocket_client_->SendCommandAndGetResult(
+      "Target.getTargets", base::Value::AsDictionaryValue(params), &result);
+  if (status.IsError()) {
+    return status;
+  }
+  if (!result.is_dict()) {
+    return Status(kUnknownError,
+                  "result of call to Target.getTargets is not a map");
+  }
+  base::Value* target_infos = result.GetDict().Find("targetInfos");
+  if (!target_infos) {
+    return Status(
+        kUnknownError,
+        "result of call to Target.getTargets does not contain targetInfos");
+  }
+  if (!target_infos->is_list()) {
+    return Status(kUnknownError,
+                  "targetInfos in Target.getTargets response is not a list");
+  }
+  std::vector<WebViewInfo> temp_views_info;
+  for (const base::Value& info_value : target_infos->GetList()) {
+    if (!info_value.is_dict())
+      return Status(kUnknownError, "DevTools contains non-dictionary item");
+    const base::DictionaryValue& info =
+        base::Value::AsDictionaryValue(info_value);
+    std::string id;
+    if (!info.GetString("targetId", &id))
+      return Status(kUnknownError, "DevTools did not include id");
+    std::string type_as_string;
+    if (!info.GetString("type", &type_as_string))
+      return Status(kUnknownError, "DevTools did not include type");
+    std::string url;
+    if (!info.GetString("url", &url))
+      return Status(kUnknownError, "DevTools did not include url");
+    WebViewInfo::Type type;
+    Status status = ParseType(type_as_string, &type);
+    if (status.IsError())
+      return status;
+    temp_views_info.emplace_back(id, std::string(), url, type);
+  }
+  *views_info = WebViewsInfo(temp_views_info);
+  return status;
+}
+
 Status ChromeImpl::ParseWindow(const base::Value& params, Window* window) {
   absl::optional<int> id = params.FindIntKey("windowId");
   if (!id)
@@ -570,9 +676,11 @@
   base::TimeTicks deadline = base::TimeTicks::Now() + base::Seconds(20);
   while (base::TimeTicks::Now() < deadline) {
     WebViewsInfo views_info;
-    Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
+    Status status = GetWebViewsInfo(&views_info);
     if (status.code() == kChromeNotReachable)
       return Status(kOk);
+    if (status.code() == kDisconnected)  // The closed target has gone
+      return Status(kOk);
     if (status.IsError())
       return status;
     if (!views_info.GetForId(id))
@@ -696,4 +804,7 @@
       devtools_http_client_(std::move(http_client)),
       devtools_websocket_client_(std::move(websocket_client)),
       devtools_event_listeners_(std::move(devtools_event_listeners)),
-      page_load_strategy_(page_load_strategy) {}
+      page_load_strategy_(page_load_strategy) {
+  page_tracker_ = std::make_unique<PageTracker>(
+      devtools_websocket_client_.get(), &web_views_);
+}
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.h b/chrome/test/chromedriver/chrome/chrome_impl.h
index cac8cb3..1403f07 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.h
+++ b/chrome/test/chromedriver/chrome/chrome_impl.h
@@ -15,8 +15,10 @@
 #include "chrome/test/chromedriver/net/sync_websocket_factory.h"
 
 class DevToolsClient;
+class DevToolsClientImpl;
 class DevToolsEventListener;
 class DevToolsHttpClient;
+class PageTracker;
 class Status;
 class WebView;
 class WebViewImpl;
@@ -69,7 +71,8 @@
 
   virtual Status QuitImpl() = 0;
 
-  std::unique_ptr<DevToolsClient> CreateClient(const std::string& id);
+  Status CreateClient(const std::string& id,
+                      std::unique_ptr<DevToolsClientImpl>* client);
   Status CloseFrontends(const std::string& for_client_id);
   Status CloseTarget(const std::string& id);
 
@@ -88,6 +91,7 @@
   Status SetWindowBounds(Window* window,
                          const std::string& target_id,
                          std::unique_ptr<base::DictionaryValue> bounds);
+  Status GetWebViewsInfo(WebViewsInfo* views_info);
 
   bool quit_ = false;
   std::unique_ptr<DeviceMetrics> device_metrics_;
@@ -101,10 +105,11 @@
       Chrome::PermissionState setting,
       std::vector<std::string>* chrome_permissions);
 
-  void UpdateWebViews(const WebViewsInfo& views_info, bool w3c_compliant);
+  Status UpdateWebViews(const WebViewsInfo& views_info, bool w3c_compliant);
 
   // Web views in this list are in the same order as they are opened.
   std::list<std::unique_ptr<WebViewImpl>> web_views_;
+  std::unique_ptr<PageTracker> page_tracker_;
   std::vector<std::unique_ptr<DevToolsEventListener>> devtools_event_listeners_;
   std::string page_load_strategy_;
 };
diff --git a/chrome/test/chromedriver/chrome/devtools_client.cc b/chrome/test/chromedriver/chrome/devtools_client.cc
index f34d69a9..4be66f90 100644
--- a/chrome/test/chromedriver/chrome/devtools_client.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client.cc
@@ -3,7 +3,3 @@
 // found in the LICENSE file.
 
 #include "chrome/test/chromedriver/chrome/devtools_client.h"
-
-bool DevToolsClient::IsMainPage() {
-  return GetRootClient() == this;
-}
diff --git a/chrome/test/chromedriver/chrome/devtools_client.h b/chrome/test/chromedriver/chrome/devtools_client.h
index 8b82821..5757cf9 100644
--- a/chrome/test/chromedriver/chrome/devtools_client.h
+++ b/chrome/test/chromedriver/chrome/devtools_client.h
@@ -32,11 +32,11 @@
 
   virtual bool WasCrashed() = 0;
 
+  virtual bool IsNull() const = 0;
+
   // Connect to DevTools if the DevToolsClient is disconnected.
   virtual Status ConnectIfNecessary() = 0;
 
-  virtual Status SetUpDevTools() = 0;
-
   virtual Status SendCommand(
       const std::string& method,
       const base::DictionaryValue& params) = 0;
@@ -94,7 +94,9 @@
 
   virtual DevToolsClient* GetRootClient() = 0;
 
-  virtual bool IsMainPage();
+  virtual DevToolsClient* GetParentClient() const = 0;
+
+  virtual bool IsMainPage() const = 0;
 };
 
 #endif  // CHROME_TEST_CHROMEDRIVER_CHROME_DEVTOOLS_CLIENT_H_
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
index 243e7e26..faa3c81 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -8,6 +8,8 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/check.h"
+#include "base/i18n/message_formatter.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
@@ -65,6 +67,15 @@
   return Status(kOk);
 }
 
+struct SessionId {
+  explicit SessionId(const std::string session_id) : session_id_(session_id) {}
+  std::string session_id_;
+};
+
+std::ostream& operator<<(std::ostream& os, const SessionId& ses_manip) {
+  return os << " (session_id=" << ses_manip.session_id_ << ")";
+}
+
 }  // namespace
 
 namespace internal {
@@ -97,7 +108,9 @@
       parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)),
       unnotified_event_(nullptr),
       next_id_(1),
-      stack_count_(0) {
+      stack_count_(0),
+      is_remote_end_configured_(false),
+      is_main_page_(false) {
   socket_->SetId(id_);
   // If error happens during proactive event consumption we ignore it
   // as there is no active user request where the error might be returned.
@@ -109,11 +122,10 @@
 }
 
 DevToolsClientImpl::DevToolsClientImpl(const std::string& id,
-                                       const std::string& session_id,
-                                       DevToolsClientImpl* parent)
+                                       const std::string& session_id)
     : owner_(nullptr),
       session_id_(session_id),
-      parent_(parent),
+      parent_(nullptr),
       crashed_(false),
       detached_(false),
       id_(id),
@@ -121,9 +133,9 @@
       parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)),
       unnotified_event_(nullptr),
       next_id_(1),
-      stack_count_(0) {
-  parent->children_[session_id] = this;
-}
+      stack_count_(0),
+      is_remote_end_configured_(false),
+      is_main_page_(false) {}
 
 DevToolsClientImpl::~DevToolsClientImpl() {
   if (parent_ != nullptr) {
@@ -154,14 +166,60 @@
   return crashed_;
 }
 
+bool DevToolsClientImpl::IsNull() const {
+  return parent_.get() == nullptr && socket_.get() == nullptr;
+}
+
+bool DevToolsClientImpl::IsConnected() const {
+  return parent_ ? parent_->IsConnected()
+                 : (socket_ ? socket_->IsConnected() : false);
+}
+
+Status DevToolsClientImpl::AttachTo(DevToolsClientImpl* parent) {
+  // checking the preconditions
+  DCHECK(parent != nullptr);
+  DCHECK(IsNull());
+  DCHECK(parent->GetParentClient() == nullptr);
+
+  if (!IsNull()) {
+    return Status{
+        kUnknownError,
+        "Attaching non-null DevToolsClient to a new parent is prohibited"};
+  }
+
+  // Class invariant: the hierarchy is flat
+  if (parent->GetParentClient() != nullptr) {
+    return Status{kUnknownError,
+                  "DevToolsClientImpl can be attached only to the root client"};
+  }
+
+  if (parent->IsConnected()) {
+    ResetListeners();
+    parent_ = parent;
+    parent_->children_[session_id_] = this;
+    Status status = OnConnected();
+    if (status.IsError()) {
+      return status;
+    }
+  } else {
+    parent_ = parent;
+    parent_->children_[session_id_] = this;
+  }
+
+  return Status{kOk};
+}
+
 Status DevToolsClientImpl::ConnectIfNecessary() {
   if (stack_count_)
     return Status(kUnknownError, "cannot connect when nested");
 
   if (parent_ == nullptr) {
+    // This is the browser level DevToolsClient
     if (socket_->IsConnected())
       return Status(kOk);
 
+    ResetListeners();
+
     if (!socket_->Connect(url_)) {
       // Try to close devtools frontend and then reconnect.
       Status status = frontend_closer_func_.Run();
@@ -170,19 +228,77 @@
       if (!socket_->Connect(url_))
         return Status(kDisconnected, "unable to connect to renderer");
     }
-  }
 
-  return SetUpDevTools();
+    return OnConnected();
+
+  } else {
+    // This is a page or frame level DevToolsClient
+    return parent_->ConnectIfNecessary();
+  }
 }
 
-Status DevToolsClientImpl::SetUpDevTools() {
-  // These lines must be before the following SendCommandXxx calls
-  unnotified_connect_listeners_ = listeners_;
+void DevToolsClientImpl::ResetListeners() {
+  // checking the preconditions
+  DCHECK(!IsConnected());
+
+  // We are going to reconnect, therefore the remote end must be reconfigured
+  is_remote_end_configured_ = false;
+
+  // These lines must be before the SendCommandXxx calls in SetUpDevTools
+  unnotified_connect_listeners_.clear();
+  for (DevToolsEventListener* listener : listeners_) {
+    if (listener->ListensToConnections()) {
+      unnotified_connect_listeners_.push_back(listener);
+    }
+  }
   unnotified_event_listeners_.clear();
   response_info_map_.clear();
 
+  for (auto child : children_) {
+    child.second->ResetListeners();
+  }
+}
+
+Status DevToolsClientImpl::OnConnected() {
+  // checking the preconditions
+  DCHECK(IsConnected());
+  if (!IsConnected()) {
+    return Status{kUnknownError,
+                  "The remote end can be configured only if the connection is "
+                  "established"};
+  }
+
+  Status status = SetUpDevTools();
+  if (status.IsError()) {
+    return status;
+  }
+
+  // Notify all listeners of the new connection. Do this now so that any errors
+  // that occur are reported now instead of later during some unrelated call.
+  // Also gives listeners a chance to send commands before other clients.
+  status = EnsureListenersNotifiedOfConnect();
+  if (status.IsError()) {
+    return status;
+  }
+
+  for (auto child : children_) {
+    status = child.second->OnConnected();
+    if (status.IsError()) {
+      break;
+    }
+  }
+
+  return status;
+}
+
+Status DevToolsClientImpl::SetUpDevTools() {
+  if (is_remote_end_configured_) {
+    return Status{kOk};
+  }
+
   if (id_ != kBrowserwideDevToolsClientId &&
       (GetOwner() == nullptr || !GetOwner()->IsServiceWorker())) {
+    // This is a page or frame level DevToolsClient
     base::DictionaryValue params;
     std::string script =
         "(function () {"
@@ -203,10 +319,8 @@
       return status;
   }
 
-  // Notify all listeners of the new connection. Do this now so that any errors
-  // that occur are reported now instead of later during some unrelated call.
-  // Also gives listeners a chance to send commands before other clients.
-  return EnsureListenersNotifiedOfConnect();
+  is_remote_end_configured_ = true;
+  return Status{kOk};
 }
 
 Status DevToolsClientImpl::SendCommand(
@@ -268,7 +382,14 @@
 }
 
 void DevToolsClientImpl::AddListener(DevToolsEventListener* listener) {
-  CHECK(listener);
+  DCHECK(listener);
+  DCHECK(!IsConnected() || !listener->ListensToConnections());
+  if (IsConnected() && listener->ListensToConnections()) {
+    LOG(WARNING)
+        << __PRETTY_FUNCTION__
+        << " subscribing a listener to the already connected DevToolsClient."
+        << " Connection notification will not arrive.";
+  }
   listeners_.push_back(listener);
 }
 
@@ -279,11 +400,15 @@
 
 Status DevToolsClientImpl::HandleEventsUntil(
     const ConditionalFunc& conditional_func, const Timeout& timeout) {
-  if (!socket_->IsConnected())
+  SyncWebSocket* socket =
+      static_cast<DevToolsClientImpl*>(GetRootClient())->socket_.get();
+  DCHECK(socket);
+  if (!socket->IsConnected()) {
     return Status(kDisconnected, "not connected to DevTools");
+  }
 
   while (true) {
-    if (!socket_->HasNextMessage()) {
+    if (!socket->HasNextMessage()) {
       bool is_condition_met = false;
       Status status = conditional_func.Run(&is_condition_met);
       if (status.IsError())
@@ -331,7 +456,24 @@
 DevToolsClientImpl::ResponseInfo::~ResponseInfo() {}
 
 DevToolsClient* DevToolsClientImpl::GetRootClient() {
-  return parent_ ? parent_.get() : this;
+  return parent_ ? parent_->GetRootClient() : this;
+}
+
+DevToolsClient* DevToolsClientImpl::GetParentClient() const {
+  return parent_.get();
+}
+
+bool DevToolsClientImpl::IsMainPage() const {
+  return is_main_page_;
+}
+
+void DevToolsClientImpl::SetMainPage(bool value) {
+  DCHECK(!IsConnected());
+  is_main_page_ = value;
+}
+
+int DevToolsClientImpl::NextMessageId() const {
+  return next_id_;
 }
 
 Status DevToolsClientImpl::SendCommandInternal(
@@ -342,6 +484,7 @@
     bool wait_for_response,
     const int client_command_id,
     const Timeout* timeout) {
+  DCHECK(IsConnected());
   if (parent_ == nullptr && !socket_->IsConnected())
     return Status(kDisconnected, "not connected to DevTools");
 
@@ -355,11 +498,13 @@
     command.SetString("sessionId", session_id_);
   }
   std::string message = SerializeValue(&command);
+
   if (IsVLogOn(1)) {
     // Note: ChromeDriver log-replay depends on the format of this logging.
     // see chromedriver/log_replay/devtools_log_reader.cc.
     VLOG(1) << "DevTools WebSocket Command: " << method << " (id=" << command_id
-            << ") " << id_ << " " << FormatValueForDisplay(params);
+            << ")" << SessionId(session_id_) << " " << id_ << " "
+            << FormatValueForDisplay(params);
   }
   SyncWebSocket* socket =
       static_cast<DevToolsClientImpl*>(GetRootClient())->socket_.get();
@@ -418,6 +563,7 @@
                                               bool log_timeout,
                                               const Timeout& timeout) {
   ScopedIncrementer increment_stack_count(&stack_count_);
+  DCHECK(IsConnected());
 
   Status status = EnsureListenersNotifiedOfConnect();
   if (status.IsError())
@@ -507,7 +653,8 @@
   if (IsVLogOn(1)) {
     // Note: ChromeDriver log-replay depends on the format of this logging.
     // see chromedriver/log_replay/devtools_log_reader.cc.
-    VLOG(1) << "DevTools WebSocket Event: " << event.method << " " << id_ << " "
+    VLOG(1) << "DevTools WebSocket Event: " << event.method
+            << SessionId(session_id_) << " " << id_ << " "
             << FormatValueForDisplay(*event.params);
   }
   unnotified_event_listeners_ = listeners_;
@@ -563,7 +710,8 @@
     // Note: ChromeDriver log-replay depends on the format of this logging.
     // see chromedriver/log_replay/devtools_log_reader.cc.
     VLOG(1) << "DevTools WebSocket Response: " << method
-            << " (id=" << response.id << ") " << id_ << " " << result;
+            << " (id=" << response.id << ")" << SessionId(session_id_) << " "
+            << id_ << " " << result;
   }
 
   if (iter == response_info_map_.end()) {
@@ -616,6 +764,7 @@
     if (status.IsError())
       return status;
   }
+
   return Status(kOk);
 }
 
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.h b/chrome/test/chromedriver/chrome/devtools_client_impl.h
index 9044810f..ecc9431 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.h
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.h
@@ -51,10 +51,15 @@
 class Status;
 class SyncWebSocket;
 
+// The next invariant means that the hierarchy must be flat,
+// we can have two levels of DevToolsClientImpl maximum.
+// Invariant: parent == nullptr || children.empty()
 class DevToolsClientImpl : public DevToolsClient {
  public:
   static const char kBrowserwideDevToolsClientId[];
 
+  // Postcondition: !IsNull()
+  // Postcondition: !IsConnected()
   DevToolsClientImpl(const std::string& id,
                      const std::string& session_id,
                      const std::string& url,
@@ -62,9 +67,9 @@
 
   typedef base::RepeatingCallback<Status()> FrontendCloserFunc;
 
-  DevToolsClientImpl(const std::string& id,
-                     const std::string& session_id,
-                     DevToolsClientImpl* parent);
+  // Postcondition: IsNull()
+  // Postcondition: !IsConnected()
+  DevToolsClientImpl(const std::string& id, const std::string& session_id);
 
   typedef base::RepeatingCallback<bool(const std::string&,
                                        int,
@@ -81,12 +86,33 @@
 
   void SetParserFuncForTesting(const ParserFunc& parser_func);
   void SetFrontendCloserFunc(const FrontendCloserFunc& frontend_closer_func);
+  // Make this DevToolsClient a child of 'parent'.
+  // All the commands of the child are routed via the parent.
+  // The parent demultiplexes the incoming events to the appropriate children.
+  // If the parent->IsConnected() this object changes its state to connected,
+  // it sets up the remote end and notifies the listeners about the connection.
+  // Precondition: parent != nullptr
+  // Precondition: IsNull()
+  // The next precondition secures the class invariant about flat hierarchy
+  // Precondition: parent->GetParentClient() == nullptr.
+  // Postcondition: result.IsError() || !IsNull()
+  Status AttachTo(DevToolsClientImpl* parent);
 
   // Overridden from DevToolsClient:
   const std::string& GetId() override;
+  // If the object IsNull then it cannot be connected to the remote end.
+  // Such an object needs to be attached to some !IsNull() parent first.
+  // Postcondition: IsNull() == (socket == nullptr && parent == nullptr)
+  bool IsNull() const override;
+  bool IsConnected() const;
   bool WasCrashed() override;
+  // Connect and configure the remote end.
+  // The children are also connected and their remote ends are configured.
+  // The listeners and the listeners of the children are notified appropriately.
+  // Does nothing if the connection is already established.
+  // Precondition: !IsNull()
+  // Postcondition: result.IsError() || IsConnected()
   Status ConnectIfNecessary() override;
-  Status SetUpDevTools() override;
   Status SendCommand(
       const std::string& method,
       const base::DictionaryValue& params) override;
@@ -110,6 +136,11 @@
   Status SendCommandAndIgnoreResponse(
       const std::string& method,
       const base::DictionaryValue& params) override;
+
+  // Add a listener for connection and events.
+  // Listeners cannot be added to the object that is already connected.
+  // Precondition: !IsConnected() || !listener.ListensToConnections()
+  // Precondition: listener != nullptr
   void AddListener(DevToolsEventListener* listener) override;
   Status HandleEventsUntil(const ConditionalFunc& conditional_func,
                            const Timeout& timeout) override;
@@ -118,6 +149,10 @@
   void SetOwner(WebViewImpl* owner) override;
   WebViewImpl* GetOwner() const override;
   DevToolsClient* GetRootClient() override;
+  DevToolsClient* GetParentClient() const override;
+  bool IsMainPage() const override;
+  void SetMainPage(bool value);
+  int NextMessageId() const;
 
  private:
   enum ResponseState {
@@ -161,6 +196,9 @@
   Status EnsureListenersNotifiedOfConnect();
   Status EnsureListenersNotifiedOfEvent();
   Status EnsureListenersNotifiedOfCommandResponse();
+  void ResetListeners();
+  Status OnConnected();
+  Status SetUpDevTools();
 
   std::unique_ptr<SyncWebSocket> socket_;
   GURL url_;
@@ -188,6 +226,8 @@
   std::map<int, scoped_refptr<ResponseInfo>> response_info_map_;
   int next_id_;  // The id identifying a particular request.
   int stack_count_;
+  bool is_remote_end_configured_;
+  bool is_main_page_;
 };
 
 namespace internal {
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
index ceeed466..c7d31e6 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
@@ -945,12 +945,15 @@
 
 class MockSyncWebSocket5 : public SyncWebSocket {
  public:
-  MockSyncWebSocket5() : request_no_(0) {}
-  ~MockSyncWebSocket5() override {}
+  MockSyncWebSocket5() = default;
+  ~MockSyncWebSocket5() override = default;
 
-  bool IsConnected() override { return true; }
+  bool IsConnected() override { return connected_; }
 
-  bool Connect(const GURL& url) override { return true; }
+  bool Connect(const GURL& url) override {
+    connected_ = true;
+    return true;
+  }
 
   bool Send(const std::string& message) override { return true; }
 
@@ -970,7 +973,8 @@
   bool HasNextMessage() override { return false; }
 
  private:
-  int request_no_;
+  int request_no_ = 0;
+  bool connected_ = false;
 };
 
 class OtherEventListener : public DevToolsEventListener {
@@ -1026,6 +1030,8 @@
   OnEventListener listener1(&client, &listener2);
   client.AddListener(&listener1);
   client.AddListener(&listener2);
+  Status status = client.ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue params;
   EXPECT_EQ(kOk, client.SendCommand("method", params).code());
 }
@@ -1102,11 +1108,14 @@
  public:
   explicit MockSyncWebSocket6(std::list<std::string>* messages)
       : messages_(messages) {}
-  ~MockSyncWebSocket6() override {}
+  ~MockSyncWebSocket6() override = default;
 
-  bool IsConnected() override { return true; }
+  bool IsConnected() override { return connected_; }
 
-  bool Connect(const GURL& url) override { return true; }
+  bool Connect(const GURL& url) override {
+    connected_ = true;
+    return true;
+  }
 
   bool Send(const std::string& message) override { return true; }
 
@@ -1124,22 +1133,25 @@
 
  private:
   raw_ptr<std::list<std::string>> messages_;
+  bool connected_ = false;
 };
 
 class MockDevToolsEventListener : public DevToolsEventListener {
  public:
-  MockDevToolsEventListener() : id_(1) {}
-  ~MockDevToolsEventListener() override {}
+  MockDevToolsEventListener() = default;
+  ~MockDevToolsEventListener() override = default;
 
   Status OnConnected(DevToolsClient* client) override { return Status(kOk); }
 
   Status OnEvent(DevToolsClient* client,
                  const std::string& method,
                  const base::DictionaryValue& params) override {
-    id_++;
+    DevToolsClientImpl* client_impl = static_cast<DevToolsClientImpl*>(client);
+    int msg_id = client_impl->NextMessageId();
+
     Status status = client->SendCommand("hello", params);
-    id_--;
-    if (id_ == 3) {
+
+    if (msg_id == expected_blocked_id_) {
       EXPECT_EQ(kUnexpectedAlertOpen, status.code());
     } else {
       EXPECT_EQ(kOk, status.code());
@@ -1147,8 +1159,10 @@
     return Status(kOk);
   }
 
+  void SetExpectedBlockedId(int value) { expected_blocked_id_ = value; }
+
  private:
-  int id_;
+  int expected_blocked_id_ = -1;
 };
 
 std::unique_ptr<SyncWebSocket> CreateMockSyncWebSocket6(
@@ -1163,6 +1177,8 @@
   SyncWebSocketFactory factory =
       base::BindRepeating(&CreateMockSyncWebSocket6, &msgs);
   DevToolsClientImpl client("id", "", "http://url", factory);
+  Status status = client.ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   msgs.push_back(
       "{\"method\": \"Page.javascriptDialogOpening\", \"params\": {}}");
   msgs.push_back("{\"id\": 2, \"result\": {}}");
@@ -1174,38 +1190,52 @@
 TEST_F(DevToolsClientImplTest, CorrectlyDeterminesWhichIsBlockedByAlert) {
   // OUT                 | IN
   //                       FirstEvent
-  // hello (id=1)
+  // hello (id1)
   //                       SecondEvent
-  // hello (id=2)
+  // hello (id2)
   //                       ThirdEvent
-  // hello (id=3)
+  // hello (id3)
   //                       FourthEvent
-  // hello (id=4)
-  //                       response for 1
+  // hello (id4)
+  //                       response for id1
   //                       alert
-  // hello (id=5)
-  // round trip command (id=6)
-  //                       response for 2
-  //                       response for 4
-  //                       response for 5
-  //                       response for 6
+  // hello (id5)
+  // round trip command (id6)
+  //                       response for id2
+  //                       response for id4
+  //                       response for id5
+  //                       response for id6
   std::list<std::string> msgs;
   SyncWebSocketFactory factory =
       base::BindRepeating(&CreateMockSyncWebSocket6, &msgs);
   DevToolsClientImpl client("id", "", "http://url", factory);
   MockDevToolsEventListener listener;
   client.AddListener(&listener);
+  Status status = client.ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  int next_msg_id = client.NextMessageId();
   msgs.push_back("{\"method\": \"FirstEvent\", \"params\": {}}");
   msgs.push_back("{\"method\": \"SecondEvent\", \"params\": {}}");
   msgs.push_back("{\"method\": \"ThirdEvent\", \"params\": {}}");
   msgs.push_back("{\"method\": \"FourthEvent\", \"params\": {}}");
-  msgs.push_back("{\"id\": 1, \"result\": {}}");
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
   msgs.push_back(
       "{\"method\": \"Page.javascriptDialogOpening\", \"params\": {}}");
-  msgs.push_back("{\"id\": 2, \"result\": {}}");
-  msgs.push_back("{\"id\": 4, \"result\": {}}");
-  msgs.push_back("{\"id\": 5, \"result\": {}}");
-  msgs.push_back("{\"id\": 6, \"result\": {}}");
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
+  listener.SetExpectedBlockedId(next_msg_id++);
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
   ASSERT_EQ(kOk, client.HandleReceivedEvents().code());
 }
 
@@ -1253,7 +1283,12 @@
   MockCommandListener listener2;
   client.AddListener(&listener1);
   client.AddListener(&listener2);
-  msgs.push_back("{\"id\": 1, \"result\": {}}");
+  Status status = client.ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  int next_msg_id = client.NextMessageId();
+  msgs.push_back((std::stringstream()
+                  << "{\"id\": " << next_msg_id++ << ", \"result\": {}}")
+                     .str());
   msgs.push_back("{\"method\": \"event\", \"params\": {}}");
   base::DictionaryValue params;
   ASSERT_EQ(kOk, client.SendCommand("cmd", params).code());
diff --git a/chrome/test/chromedriver/chrome/devtools_event_listener.cc b/chrome/test/chromedriver/chrome/devtools_event_listener.cc
index de963ca..ebd803d 100644
--- a/chrome/test/chromedriver/chrome/devtools_event_listener.cc
+++ b/chrome/test/chromedriver/chrome/devtools_event_listener.cc
@@ -8,6 +8,10 @@
 
 DevToolsEventListener::~DevToolsEventListener() {}
 
+bool DevToolsEventListener::ListensToConnections() const {
+  return true;
+}
+
 Status DevToolsEventListener::OnConnected(DevToolsClient* client) {
   return Status(kOk);
 }
diff --git a/chrome/test/chromedriver/chrome/devtools_event_listener.h b/chrome/test/chromedriver/chrome/devtools_event_listener.h
index eb996c8..c9bb5b1 100644
--- a/chrome/test/chromedriver/chrome/devtools_event_listener.h
+++ b/chrome/test/chromedriver/chrome/devtools_event_listener.h
@@ -21,6 +21,8 @@
  public:
   virtual ~DevToolsEventListener();
 
+  virtual bool ListensToConnections() const;
+
   // Called when a connection is made to the DevTools server.
   virtual Status OnConnected(DevToolsClient* client);
 
diff --git a/chrome/test/chromedriver/chrome/frame_tracker.cc b/chrome/test/chromedriver/chrome/frame_tracker.cc
index 8b729a05..10f8c91a 100644
--- a/chrome/test/chromedriver/chrome/frame_tracker.cc
+++ b/chrome/test/chromedriver/chrome/frame_tracker.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/json/json_writer.h"
+#include "base/logging.h"
 #include "base/values.h"
 #include "chrome/test/chromedriver/chrome/browser_info.h"
 #include "chrome/test/chromedriver/chrome/devtools_client.h"
@@ -202,7 +203,7 @@
                                                               *target_id));
         WebViewImplHolder child_holder(child.get());
         frame_to_target_map_[*target_id] = std::move(child);
-        frame_to_target_map_[*target_id]->SetUpDevTools();
+        frame_to_target_map_[*target_id]->ConnectIfNecessary();
       }
     }
   } else if (method == "Target.detachedFromTarget") {
diff --git a/chrome/test/chromedriver/chrome/heap_snapshot_taker.cc b/chrome/test/chromedriver/chrome/heap_snapshot_taker.cc
index 98f5a41..3c61ac87 100644
--- a/chrome/test/chromedriver/chrome/heap_snapshot_taker.cc
+++ b/chrome/test/chromedriver/chrome/heap_snapshot_taker.cc
@@ -55,6 +55,10 @@
   return Status(kOk);
 }
 
+bool HeapSnapshotTaker::ListensToConnections() const {
+  return false;
+}
+
 Status HeapSnapshotTaker::OnEvent(DevToolsClient* client,
                                   const std::string& method,
                                   const base::DictionaryValue& params) {
diff --git a/chrome/test/chromedriver/chrome/heap_snapshot_taker.h b/chrome/test/chromedriver/chrome/heap_snapshot_taker.h
index 9a9e34f..32c4f777 100644
--- a/chrome/test/chromedriver/chrome/heap_snapshot_taker.h
+++ b/chrome/test/chromedriver/chrome/heap_snapshot_taker.h
@@ -32,6 +32,7 @@
   Status TakeSnapshot(std::unique_ptr<base::Value>* snapshot);
 
   // Overridden from DevToolsEventListener:
+  bool ListensToConnections() const override;
   Status OnEvent(DevToolsClient* client,
                  const std::string& method,
                  const base::DictionaryValue& params) override;
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.cc b/chrome/test/chromedriver/chrome/navigation_tracker.cc
index 5ee9e18a3..ee8af8d 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.cc
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.cc
@@ -129,6 +129,11 @@
     // events from it until we reconnect.
     *is_pending = false;
     return Status(kOk);
+  } else if (status.code() == kTargetDetached) {
+    // If we receive a kTargetDetached status code from Runtime.evaluate, don't
+    // wait for pending navigations to complete, since the page has been closed.
+    *is_pending = false;
+    return status;
   } else if (status.code() == kUnexpectedAlertOpen) {
     // The JS event loop is paused while modal dialogs are open, so return
     // control to the test so that it can dismiss the dialog.
diff --git a/chrome/test/chromedriver/chrome/page_tracker.cc b/chrome/test/chromedriver/chrome/page_tracker.cc
new file mode 100644
index 0000000..df0663b1
--- /dev/null
+++ b/chrome/test/chromedriver/chrome/page_tracker.cc
@@ -0,0 +1,54 @@
+// Copyright (c) 2022 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/test/chromedriver/chrome/page_tracker.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "base/values.h"
+#include "chrome/test/chromedriver/chrome/devtools_client.h"
+#include "chrome/test/chromedriver/chrome/status.h"
+#include "chrome/test/chromedriver/chrome/web_view_impl.h"
+
+PageTracker::PageTracker(DevToolsClient* client,
+                         std::list<std::unique_ptr<WebViewImpl>>* web_views)
+    : web_views_(web_views) {
+  client->AddListener(this);
+}
+
+PageTracker::~PageTracker() = default;
+
+Status PageTracker::OnConnected(DevToolsClient* client) {
+  return Status(kOk);
+}
+
+Status PageTracker::OnEvent(DevToolsClient* client,
+                            const std::string& method,
+                            const base::DictionaryValue& params) {
+  if (method == "Target.detachedFromTarget") {
+    const std::string* target_id = params.GetDict().FindString("targetId");
+    if (!target_id)
+      // Some types of Target.detachedFromTarget events do not have targetId.
+      // We are not interested in those types of targets.
+      return Status(kOk);
+    auto it = std::find_if(
+        web_views_->begin(), web_views_->end(),
+        [id = *target_id](const std::unique_ptr<WebViewImpl>& view) {
+          return view->GetId() == id;
+        });
+    if (it == web_views_->end()) {
+      // There are some target types that we're not keeping track of, thus not
+      // finding the target in frame_to_target_map_ is OK.
+      return Status(kOk);
+    }
+    WebViewImpl* target = static_cast<WebViewImpl*>(it->get());
+    if (target->IsLocked()) {
+      target->SetDetached();
+    } else {
+      web_views_->erase(it);
+    }
+  }
+  return Status(kOk);
+}
diff --git a/chrome/test/chromedriver/chrome/page_tracker.h b/chrome/test/chromedriver/chrome/page_tracker.h
new file mode 100644
index 0000000..99c2afc
--- /dev/null
+++ b/chrome/test/chromedriver/chrome/page_tracker.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2022 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_TEST_CHROMEDRIVER_CHROME_PAGE_TRACKER_H_
+#define CHROME_TEST_CHROMEDRIVER_CHROME_PAGE_TRACKER_H_
+
+#include <list>
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+class DevToolsClient;
+class WebViewImpl;
+class Status;
+
+// Tracks execution context creation.
+class PageTracker : public DevToolsEventListener {
+ public:
+  PageTracker(DevToolsClient* client,
+              std::list<std::unique_ptr<WebViewImpl>>* web_views);
+
+  PageTracker(const PageTracker&) = delete;
+  PageTracker& operator=(const PageTracker&) = delete;
+
+  ~PageTracker() override;
+
+  // Overridden from DevToolsEventListener:
+  Status OnConnected(DevToolsClient* client) override;
+  Status OnEvent(DevToolsClient* client,
+                 const std::string& method,
+                 const base::DictionaryValue& params) override;
+
+ private:
+  raw_ptr<std::list<std::unique_ptr<WebViewImpl>>> web_views_;
+};
+
+#endif  // CHROME_TEST_CHROMEDRIVER_CHROME_PAGE_TRACKER_H_
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.cc b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
index c0f0d15..2a365d6 100644
--- a/chrome/test/chromedriver/chrome/stub_devtools_client.cc
+++ b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
@@ -19,6 +19,10 @@
   return id_;
 }
 
+bool StubDevToolsClient::IsNull() const {
+  return false;
+}
+
 bool StubDevToolsClient::WasCrashed() {
   return false;
 }
@@ -27,10 +31,6 @@
   return Status(kOk);
 }
 
-Status StubDevToolsClient::SetUpDevTools() {
-  return Status(kOk);
-}
-
 Status StubDevToolsClient::SendCommand(
     const std::string& method,
     const base::DictionaryValue& params) {
@@ -105,3 +105,11 @@
 DevToolsClient* StubDevToolsClient::GetRootClient() {
   return this;
 }
+
+DevToolsClient* StubDevToolsClient::GetParentClient() const {
+  return nullptr;
+}
+
+bool StubDevToolsClient::IsMainPage() const {
+  return true;
+}
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.h b/chrome/test/chromedriver/chrome/stub_devtools_client.h
index c5daffc..69722bbc 100644
--- a/chrome/test/chromedriver/chrome/stub_devtools_client.h
+++ b/chrome/test/chromedriver/chrome/stub_devtools_client.h
@@ -26,9 +26,9 @@
 
   // Overridden from DevToolsClient:
   const std::string& GetId() override;
+  bool IsNull() const override;
   bool WasCrashed() override;
   Status ConnectIfNecessary() override;
-  Status SetUpDevTools() override;
   Status SendCommand(
       const std::string& method,
       const base::DictionaryValue& params) override;
@@ -60,6 +60,8 @@
   void SetOwner(WebViewImpl* owner) override;
   WebViewImpl* GetOwner() const override;
   DevToolsClient* GetRootClient() override;
+  DevToolsClient* GetParentClient() const override;
+  bool IsMainPage() const override;
 
  protected:
   const std::string id_;
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.cc b/chrome/test/chromedriver/chrome/stub_web_view.cc
index 5f6c972..f121289 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.cc
+++ b/chrome/test/chromedriver/chrome/stub_web_view.cc
@@ -28,10 +28,6 @@
   return Status(kOk);
 }
 
-Status StubWebView::SetUpDevTools() {
-  return Status(kOk);
-}
-
 Status StubWebView::HandleReceivedEvents() {
   return Status(kOk);
 }
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.h b/chrome/test/chromedriver/chrome/stub_web_view.h
index 6b9a96f..95500112 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.h
+++ b/chrome/test/chromedriver/chrome/stub_web_view.h
@@ -20,7 +20,6 @@
   std::string GetId() override;
   bool WasCrashed() override;
   Status ConnectIfNecessary() override;
-  Status SetUpDevTools() override;
   Status HandleReceivedEvents() override;
   Status GetUrl(std::string* url) override;
   Status Load(const std::string& url, const Timeout* timeout) override;
diff --git a/chrome/test/chromedriver/chrome/web_view.h b/chrome/test/chromedriver/chrome/web_view.h
index 848df22..42a0cae 100644
--- a/chrome/test/chromedriver/chrome/web_view.h
+++ b/chrome/test/chromedriver/chrome/web_view.h
@@ -44,9 +44,6 @@
   // Make DevToolsCient connect to DevTools if it is disconnected.
   virtual Status ConnectIfNecessary() = 0;
 
-  // Make DevToolsCient set up DevTools.
-  virtual Status SetUpDevTools() = 0;
-
   // Handles events that have been received but not yet handled.
   virtual Status HandleReceivedEvents() = 0;
 
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc
index e67cb1f..d87652c3 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -369,10 +369,11 @@
   // Child WebViews should not have their own navigation_tracker, but defer
   // all related calls to their parent. All WebViews must have either parent_
   // or navigation_tracker_
-  if (!parent_)
+  if (!parent_) {
     navigation_tracker_ = std::unique_ptr<PageLoadStrategy>(
         PageLoadStrategy::Create(page_load_strategy, client_.get(), this,
                                  browser_info, dialog_manager_.get()));
+  }
   client_->SetOwner(this);
 }
 
@@ -388,11 +389,8 @@
   // hierarchy for DevToolsClientImpl is flat - there's a root which
   // sends/receives over the socket, and all child sessions are considered
   // its children (one level deep at most).
-  DevToolsClientImpl* root_client =
-      static_cast<DevToolsClientImpl*>(client_.get()->GetRootClient());
-  std::unique_ptr<DevToolsClient> child_client(
-      std::make_unique<DevToolsClientImpl>(session_id, session_id,
-                                           root_client));
+  std::unique_ptr<DevToolsClientImpl> child_client =
+      std::make_unique<DevToolsClientImpl>(session_id, session_id);
   WebViewImpl* child = new WebViewImpl(
       target_id, w3c_compliant_, this, browser_info_, std::move(child_client),
       nullptr,
@@ -418,11 +416,30 @@
 }
 
 Status WebViewImpl::ConnectIfNecessary() {
+  // The root client must never be IsNull as it has an instance of socket_.
+  // The child client can be IsNull but, by definition, the view has a parent.
+  DCHECK(!client_->IsNull() || parent_ != nullptr);
+  if (client_->IsNull() && parent_ == nullptr) {
+    return Status{kUnknownError, "Root WebView cannot be IsNull"};
+  }
+
+  if (parent_ != nullptr && client_->IsNull()) {
+    DevToolsClientImpl* root_client = static_cast<DevToolsClientImpl*>(
+        parent_->client_.get()->GetRootClient());
+    DevToolsClientImpl* client =
+        static_cast<DevToolsClientImpl*>(client_.get());
+    Status status = client->AttachTo(root_client);
+    if (status.IsError()) {
+      return status;
+    }
+  }
+  DCHECK(!client_->IsNull());
   return client_->ConnectIfNecessary();
 }
 
-Status WebViewImpl::SetUpDevTools() {
-  return client_->SetUpDevTools();
+Status WebViewImpl::AttachTo(DevToolsClient* parent) {
+  return static_cast<DevToolsClientImpl*>(client_.get())
+      ->AttachTo(static_cast<DevToolsClientImpl*>(parent));
 }
 
 Status WebViewImpl::HandleReceivedEvents() {
@@ -593,6 +610,12 @@
   Status status = GetContextIdForFrame(this, frame, &context_id);
   if (status.IsError())
     return status;
+  // If the target associated with the current view or its ancestor is detached
+  // during the script execution we don't want deleting the current WebView
+  // because we are executing the code in its method.
+  // Instead we lock the WebView with target holder and only label the view as
+  // detached.
+  WebViewImplHolder target_holder(this);
   return internal::EvaluateScriptAndGetValue(
       client_.get(), context_id, expression, timeout, awaitPromise, result);
 }
@@ -1045,6 +1068,11 @@
   const auto not_pending_navigation = base::BindRepeating(
       &WebViewImpl::IsNotPendingNavigation, base::Unretained(this), frame_id,
       base::Unretained(&timeout));
+  // If the target associated with the current view or its ancestor is detached
+  // while we are waiting for the pending navigation we don't want deleting the
+  // current WebView because we are executing the code in its method. Instead we
+  // lock the WebView with target holder and only label the view as detached.
+  WebViewImplHolder target_holder(this);
   Status status = client_->HandleEventsUntil(not_pending_navigation, timeout);
   if (status.code() == kTimeout && stop_load_on_timeout) {
     VLOG(0) << "Timed out. Stopping navigation...";
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.h b/chrome/test/chromedriver/chrome/web_view_impl.h
index 8bf3583..ac21a312 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.h
+++ b/chrome/test/chromedriver/chrome/web_view_impl.h
@@ -56,7 +56,7 @@
   std::string GetId() override;
   bool WasCrashed() override;
   Status ConnectIfNecessary() override;
-  Status SetUpDevTools() override;
+  Status AttachTo(DevToolsClient* parent);
   Status HandleReceivedEvents() override;
   Status GetUrl(std::string* url) override;
   Status Load(const std::string& url, const Timeout* timeout) override;
diff --git a/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc b/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc
index d45a0c5..6e87964 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc
@@ -6,10 +6,14 @@
 
 #include <list>
 #include <memory>
+#include <queue>
 #include <string>
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chrome/test/chromedriver/chrome/browser_info.h"
@@ -205,11 +209,13 @@
 class MockSyncWebSocket : public SyncWebSocket {
  public:
   explicit MockSyncWebSocket(SyncWebSocket::StatusCode next_status)
-      : connected_(true),
-        id_(-1),
-        queued_messages_(1),
-        next_status_(next_status) {}
-  ~MockSyncWebSocket() override {}
+      : connected_(false), id_(-1), next_status_(next_status) {}
+  MockSyncWebSocket() : MockSyncWebSocket(SyncWebSocket::StatusCode::kOk) {}
+  ~MockSyncWebSocket() override = default;
+
+  void SetNexStatusCode(SyncWebSocket::StatusCode statusCode) {
+    next_status_ = statusCode;
+  }
 
   bool IsConnected() override { return connected_; }
 
@@ -219,20 +225,44 @@
     return true;
   }
 
-  bool Send(const std::string& message) override { return false; }
+  bool Send(const std::string& message) override {
+    absl::optional<base::Value> value = base::JSONReader::Read(message);
+    if (!value) {
+      return false;
+    }
+
+    absl::optional<int> id = value->GetDict().FindInt("id");
+    if (!id) {
+      return false;
+    }
+
+    std::string responseStr;
+    base::Value::Dict response;
+    response.Set("id", *id);
+    base::Value result{base::Value::Type::DICT};
+    result.GetDict().Set("param", 1);
+    response.Set("result", result.Clone());
+    base::JSONWriter::Write(base::Value(std::move(response)), &responseStr);
+    messages_.push(responseStr);
+    return true;
+  }
 
   SyncWebSocket::StatusCode ReceiveNextMessage(
       std::string* message,
       const Timeout& timeout) override {
+    if (next_status_ == SyncWebSocket::StatusCode::kOk && !messages_.empty()) {
+      *message = messages_.front();
+      messages_.pop();
+    }
     return next_status_;
   }
 
-  bool HasNextMessage() override { return queued_messages_ > 0; }
+  bool HasNextMessage() override { return !messages_.empty(); }
 
  protected:
   bool connected_;
   int id_;
-  int queued_messages_;
+  std::queue<std::string> messages_;
   SyncWebSocket::StatusCode next_status_;
 };
 
@@ -241,6 +271,31 @@
   return std::make_unique<MockSyncWebSocket>(next_status);
 }
 
+class SyncWebSocketWrapper : public SyncWebSocket {
+ public:
+  explicit SyncWebSocketWrapper(SyncWebSocket* socket) : socket_(socket) {}
+  ~SyncWebSocketWrapper() override = default;
+
+  bool IsConnected() override { return socket_->IsConnected(); }
+
+  bool Connect(const GURL& url) override { return socket_->Connect(url); }
+
+  bool Send(const std::string& message) override {
+    return socket_->Send(message);
+  }
+
+  SyncWebSocket::StatusCode ReceiveNextMessage(
+      std::string* message,
+      const Timeout& timeout) override {
+    return socket_->ReceiveNextMessage(message, timeout);
+  }
+
+  bool HasNextMessage() override { return socket_->HasNextMessage(); }
+
+ private:
+  raw_ptr<SyncWebSocket> socket_;
+};
+
 }  // namespace
 
 TEST(CreateChild, MultiLevel) {
@@ -253,15 +308,20 @@
   BrowserInfo browser_info;
   WebViewImpl level1(client_ptr->GetId(), true, nullptr, &browser_info,
                      std::move(client_uptr), nullptr, PageLoadStrategy::kEager);
+  Status status = client_ptr->ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   std::string sessionid = "2";
   std::unique_ptr<WebViewImpl> level2 =
       std::unique_ptr<WebViewImpl>(level1.CreateChild(sessionid, "1234"));
+  level2->AttachTo(client_ptr);
   sessionid = "3";
   std::unique_ptr<WebViewImpl> level3 =
       std::unique_ptr<WebViewImpl>(level2->CreateChild(sessionid, "3456"));
+  level3->AttachTo(client_ptr);
   sessionid = "4";
   std::unique_ptr<WebViewImpl> level4 =
       std::unique_ptr<WebViewImpl>(level3->CreateChild(sessionid, "5678"));
+  level4->AttachTo(client_ptr);
 }
 
 TEST(CreateChild, IsNonBlocking_NoErrors) {
@@ -275,11 +335,14 @@
   WebViewImpl parent_view(client_ptr->GetId(), true, nullptr, &browser_info,
                           std::move(client_uptr), nullptr,
                           PageLoadStrategy::kEager);
+  Status status = client_ptr->ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_FALSE(parent_view.IsNonBlocking());
 
   std::string sessionid = "2";
   std::unique_ptr<WebViewImpl> child_view =
       std::unique_ptr<WebViewImpl>(parent_view.CreateChild(sessionid, "1234"));
+  child_view->AttachTo(client_ptr);
   ASSERT_NO_FATAL_FAILURE(child_view->IsNonBlocking());
   ASSERT_FALSE(child_view->IsNonBlocking());
 }
@@ -295,16 +358,24 @@
   WebViewImpl parent_view(client_ptr->GetId(), true, nullptr, &browser_info,
                           std::move(client_uptr), nullptr,
                           PageLoadStrategy::kNone);
+  Status status = client_ptr->ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   std::string sessionid = "2";
   std::unique_ptr<WebViewImpl> child_view =
       std::unique_ptr<WebViewImpl>(parent_view.CreateChild(sessionid, "1234"));
+  child_view->AttachTo(client_ptr);
 
   ASSERT_NO_FATAL_FAILURE(child_view->Load("chrome://version", nullptr));
 }
 
 TEST(CreateChild, WaitForPendingNavigations_NoErrors) {
+  std::unique_ptr<MockSyncWebSocket> socket =
+      std::make_unique<MockSyncWebSocket>(SyncWebSocket::StatusCode::kOk);
   SyncWebSocketFactory factory = base::BindRepeating(
-      &CreateMockSyncWebSocket, SyncWebSocket::StatusCode::kTimeout);
+      [](SyncWebSocket* socket) {
+        return std::unique_ptr<SyncWebSocket>(new SyncWebSocketWrapper(socket));
+      },
+      socket.get());
   // CreateChild relies on client_ being a DevToolsClientImpl, so no mocking
   std::unique_ptr<DevToolsClientImpl> client_uptr =
       std::make_unique<DevToolsClientImpl>("id", "", "http://url", factory);
@@ -313,11 +384,15 @@
   WebViewImpl parent_view(client_ptr->GetId(), true, nullptr, &browser_info,
                           std::move(client_uptr), nullptr,
                           PageLoadStrategy::kNone);
+  Status status = client_ptr->ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   std::string sessionid = "2";
   std::unique_ptr<WebViewImpl> child_view =
       std::unique_ptr<WebViewImpl>(parent_view.CreateChild(sessionid, "1234"));
+  child_view->AttachTo(client_ptr);
 
   // child_view gets no socket...
+  socket->SetNexStatusCode(SyncWebSocket::StatusCode::kTimeout);
   ASSERT_NO_FATAL_FAILURE(child_view->WaitForPendingNavigations(
       "1234", Timeout(base::Milliseconds(10)), true));
 }
@@ -333,9 +408,12 @@
   WebViewImpl parent_view(client_ptr->GetId(), true, nullptr, &browser_info,
                           std::move(client_uptr), nullptr,
                           PageLoadStrategy::kNormal);
+  Status status = client_ptr->ConnectIfNecessary();
+  ASSERT_EQ(kOk, status.code()) << status.message();
   std::string sessionid = "2";
   std::unique_ptr<WebViewImpl> child_view =
       std::unique_ptr<WebViewImpl>(parent_view.CreateChild(sessionid, "1234"));
+  child_view->AttachTo(client_ptr);
 
   Timeout timeout(base::Milliseconds(10));
   bool result;
diff --git a/chrome/test/chromedriver/client/chromedriver.py b/chrome/test/chromedriver/client/chromedriver.py
index 316f6a1..d2af048 100644
--- a/chrome/test/chromedriver/client/chromedriver.py
+++ b/chrome/test/chromedriver/client/chromedriver.py
@@ -784,3 +784,8 @@
       return None
     return self._session_id
 
+  def GetCastSinks(self, vendorId):
+    params = {'vendorId': vendorId}
+    return self.ExecuteCommand(Command.GET_CAST_SINKS, params)
+
+
diff --git a/chrome/test/chromedriver/client/command_executor.py b/chrome/test/chromedriver/client/command_executor.py
index b95a4ccb..b1e16f5 100644
--- a/chrome/test/chromedriver/client/command_executor.py
+++ b/chrome/test/chromedriver/client/command_executor.py
@@ -215,6 +215,9 @@
       '/session/:sessionId/secure-payment-confirmation/set-mode')
   SET_PERMISSION = (
       _Method.POST, '/session/:sessionId/permissions')
+  GET_CAST_SINKS = (
+      _Method.GET,
+      '/session/:sessionId/:vendorId/cast/get_sinks')
 
   # Custom Chrome commands.
   IS_LOADING = (_Method.GET, '/session/:sessionId/is_loading')
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc
index 090d02a..12b91bad 100644
--- a/chrome/test/chromedriver/commands.cc
+++ b/chrome/test/chromedriver/commands.cc
@@ -271,7 +271,8 @@
                   ", but failed to kill browser:" + quit_status.message();
           }
           status = Status(kUnknownError, message, status);
-        } else if (status.code() == kDisconnected) {
+        } else if (status.code() == kDisconnected ||
+                   status.code() == kTargetDetached) {
           // Some commands, like clicking a button or link which closes the
           // window, may result in a kDisconnected error code.
           std::list<std::string> web_view_ids;
diff --git a/chrome/test/chromedriver/log_replay/devtools_log_reader.cc b/chrome/test/chromedriver/log_replay/devtools_log_reader.cc
index 954d8918..aedf761 100644
--- a/chrome/test/chromedriver/log_replay/devtools_log_reader.cc
+++ b/chrome/test/chromedriver/log_replay/devtools_log_reader.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 #include "chrome/test/chromedriver/log_replay/devtools_log_reader.h"
 
+#include <cctype>
 #include <iostream>
 #include <string>
 
@@ -18,6 +19,36 @@
   header_stream.ignore(1);  // ignore the final parenthesis
   return id;
 }
+
+void putback(std::istringstream& stream, const std::string& str) {
+  for (auto it = str.rbegin(); it != str.rend(); ++it) {
+    stream.putback(*it);
+  }
+}
+
+// Parses the word (session_id=X) and just returns the session_id string
+bool GetSessionId(std::istringstream& header_stream, std::string* session_id) {
+  std::string spaces;
+  while (std::isspace(header_stream.peek())) {
+    char ch;
+    header_stream.get(ch);
+    spaces.push_back(ch);
+  }
+  std::string sid;  // (session_id=X)
+  header_stream >> sid;
+  if (sid.size() < 13  // (session_id=) is also valid
+      || sid.find("(session_id=") != 0 || sid.back() != ')') {
+    putback(header_stream, sid);
+    putback(header_stream, spaces);
+    return false;
+  }
+
+  // skip 12 leading characters: (session_id=
+  // and one trailing character: )
+  *session_id = sid.substr(12, sid.size() - 12 - 1);
+  return true;
+}
+
 }  // namespace
 
 LogEntry::LogEntry(std::istringstream& header_stream) {
@@ -66,6 +97,13 @@
           return;
         }
       }
+
+      session_id.clear();
+      if (!GetSessionId(header_stream, &session_id)) {
+        error = true;
+        LOG(ERROR) << "Could not read session_id from log entry header.";
+      }
+
       header_stream >> socket_id;
       if (socket_id == "") {
         error = true;
diff --git a/chrome/test/chromedriver/log_replay/devtools_log_reader.h b/chrome/test/chromedriver/log_replay/devtools_log_reader.h
index eaded71..10eef39 100644
--- a/chrome/test/chromedriver/log_replay/devtools_log_reader.h
+++ b/chrome/test/chromedriver/log_replay/devtools_log_reader.h
@@ -53,6 +53,7 @@
   std::string command_name;
   std::string payload;
   int id;
+  std::string session_id;
   std::string socket_id;
   bool error;
 };
diff --git a/chrome/test/chromedriver/log_replay/devtools_log_reader_unittest.cc b/chrome/test/chromedriver/log_replay/devtools_log_reader_unittest.cc
index 772ec84..cf663a5 100644
--- a/chrome/test/chromedriver/log_replay/devtools_log_reader_unittest.cc
+++ b/chrome/test/chromedriver/log_replay/devtools_log_reader_unittest.cc
@@ -16,6 +16,7 @@
                                      "log_replay", "test_data"};
 const char kTestGetTitlePath[] = "testGetTitle_simple.log";
 const char kOneEntryPath[] = "oneDevToolsEntry.log";
+const char kBrowserEntryPath[] = "oneDevToolsBrowserEntry.log";
 const char kTruncatedJSONPath[] = "truncatedJSON.log";
 const char kReadableTimestampPathLinux[] = "testReadableTimestampLinux.log";
 const char kReadableTimestampPathWin[] = "testReadableTimestampWindows.log";
@@ -91,6 +92,18 @@
   EXPECT_TRUE(next == nullptr);
 }
 
+TEST(DevToolsLogReaderTest, WebSocketBrowser) {
+  base::FilePath path = GetLogFileFromLiteral(kBrowserEntryPath);
+  DevToolsLogReader reader(path);
+  std::unique_ptr<LogEntry> next = reader.GetNext(LogEntry::kWebSocket);
+  EXPECT_TRUE(next != nullptr);
+  EXPECT_EQ(next->protocol_type, LogEntry::kWebSocket);
+  EXPECT_EQ(next->event_type, LogEntry::kRequest);
+  EXPECT_EQ(next->command_name, "Log.enable");
+  EXPECT_EQ(next->session_id, "");
+  EXPECT_EQ(next->id, 1);
+}
+
 TEST(DevToolsLogReaderTest, WebSocketBasic) {
   base::FilePath path = GetLogFileFromLiteral(kTestGetTitlePath);
   DevToolsLogReader reader(path);
@@ -99,6 +112,7 @@
   EXPECT_EQ(next->protocol_type, LogEntry::kWebSocket);
   EXPECT_EQ(next->event_type, LogEntry::kRequest);
   EXPECT_EQ(next->command_name, "Log.enable");
+  EXPECT_EQ(next->session_id, "AQUA");
   EXPECT_EQ(next->id, 1);
 }
 
@@ -110,6 +124,7 @@
   EXPECT_TRUE(next != nullptr);
   EXPECT_EQ(next->event_type, LogEntry::kRequest);
   EXPECT_EQ(next->command_name, "DOM.getDocument");
+  EXPECT_EQ(next->session_id, "AQUA");
   EXPECT_EQ(next->id, 2);
 }
 
@@ -122,6 +137,7 @@
   EXPECT_TRUE(next != nullptr);
   EXPECT_EQ(next->command_name, "Target.setAutoAttach");
   EXPECT_EQ(next->id, 3);
+  EXPECT_EQ(next->session_id, "AQUA");
   EXPECT_EQ(
       next->payload,
       "{\n   \"autoAttach\": true,\n   \"waitForDebuggerOnStart\": false\n}\n");
diff --git a/chrome/test/chromedriver/log_replay/log_replay_socket.cc b/chrome/test/chromedriver/log_replay/log_replay_socket.cc
index 815d781a..12e8030 100644
--- a/chrome/test/chromedriver/log_replay/log_replay_socket.cc
+++ b/chrome/test/chromedriver/log_replay/log_replay_socket.cc
@@ -9,6 +9,15 @@
 #include "base/json/json_reader.h"
 #include "base/values.h"
 
+namespace {
+
+std::string SessionIdJson(const std::string session_id) {
+  return session_id.empty() ? std::string()
+                            : ",\"session_id\":\"" + session_id + "\"";
+}
+
+}  // namespace
+
 LogReplaySocket::LogReplaySocket(const base::FilePath& log_path)
     : connected_(false), log_reader_(log_path) {}
 
@@ -40,9 +49,8 @@
     std::unique_ptr<LogEntry> next = log_reader_.GetNext(LogEntry::kWebSocket);
     if (next == nullptr)
       return nullptr;
-    // wrong socket or it's a request (and |include_requests| is false)
-    if (next->socket_id != socket_id_ ||
-        (!include_requests && next->event_type == LogEntry::kRequest))
+    // it's a request (and |include_requests| is false)
+    if (!include_requests && next->event_type == LogEntry::kRequest)
       continue;
     return next;
   }
@@ -59,11 +67,13 @@
     // We have to build the messages back up to what they would have been
     // in the actual WebSocket.
     *message = "{\"id\":" + std::to_string(next->id) +
+               SessionIdJson(next->session_id) +
                ",\"result\":" + next->payload + "}";
     return SyncWebSocket::StatusCode::kOk;
   }
   // it's an event
   *message = "{\"method\":\"" + next->command_name +
+             SessionIdJson(next->session_id) +
              "\",\"params\":" + next->payload + "}";
   return SyncWebSocket::StatusCode::kOk;
 }
diff --git a/chrome/test/chromedriver/log_replay/test_data/oneDevToolsBrowserEntry.log b/chrome/test/chromedriver/log_replay/test_data/oneDevToolsBrowserEntry.log
new file mode 100644
index 0000000..14636d23
--- /dev/null
+++ b/chrome/test/chromedriver/log_replay/test_data/oneDevToolsBrowserEntry.log
@@ -0,0 +1,2 @@
+[1534441987.292][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) (session_id=) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+}
diff --git a/chrome/test/chromedriver/log_replay/test_data/testGetTitle_simple.log b/chrome/test/chromedriver/log_replay/test_data/testGetTitle_simple.log
index 1d78a2c..429a15e 100644
--- a/chrome/test/chromedriver/log_replay/test_data/testGetTitle_simple.log
+++ b/chrome/test/chromedriver/log_replay/test_data/testGetTitle_simple.log
@@ -10,13 +10,13 @@
    "string_key2": "string_value2"
 } ]
 
-[1534441987.292][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[1534441987.292][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[1534441987.292][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[1534441987.292][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[1534441987.292][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[1534441987.292][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
    "autoAttach": true,
    "waitForDebuggerOnStart": false
 }
diff --git a/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampLinux.log b/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampLinux.log
index f3bb2894..4f6c3280 100644
--- a/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampLinux.log
+++ b/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampLinux.log
@@ -10,13 +10,13 @@
    "string_key2": "string_value2"
 } ]
 
-[08-20-2019 16:43:44.272071][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.272071][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[08-20-2019 16:43:44.276995][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.276995][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[08-20-2019 16:43:44.278068][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.278068][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
    "autoAttach": true,
    "waitForDebuggerOnStart": false
 }
diff --git a/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampWindows.log b/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampWindows.log
index 5c196d0e..8785b18 100644
--- a/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampWindows.log
+++ b/chrome/test/chromedriver/log_replay/test_data/testReadableTimestampWindows.log
@@ -10,13 +10,13 @@
    "string_key2": "string_value2"
 } ]
 
-[08-20-2019 16:43:44.272][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.272][DEBUG]: DevTools WebSocket Command: Log.enable (id=1) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[08-20-2019 16:43:44.276][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.276][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=2) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
 
 }
-[08-20-2019 16:43:44.278][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) 7A66E25ABD1F05841E3DEF9B221CBB42 {
+[08-20-2019 16:43:44.278][DEBUG]: DevTools WebSocket Command: Target.setAutoAttach (id=3) (session_id=AQUA) 7A66E25ABD1F05841E3DEF9B221CBB42 {
    "autoAttach": true,
    "waitForDebuggerOnStart": false
 }
diff --git a/chrome/test/chromedriver/log_replay/test_data/truncatedJSON.log b/chrome/test/chromedriver/log_replay/test_data/truncatedJSON.log
index 301bb007..0c28a73 100644
--- a/chrome/test/chromedriver/log_replay/test_data/truncatedJSON.log
+++ b/chrome/test/chromedriver/log_replay/test_data/truncatedJSON.log
@@ -1,3 +1,3 @@
-[1533082321.495][DEBUG]: DevTools WebSocket Command Target.setAutoAttach (id=3) 09BD0B99D6BC582B6BEC7F53F420E62B {
+[1533082321.495][DEBUG]: DevTools WebSocket Command Target.setAutoAttach (id=3) (session_id=AQUA) 09BD0B99D6BC582B6BEC7F53F420E62B {
    "autoAttach": true,
-   "waitForDebuggerOnStart": false,
\ No newline at end of file
+   "waitForDebuggerOnStart": false,
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 36d76d0d..c17d68d 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -5371,6 +5371,18 @@
     self._driver.Load(self.GetFileUrl('focus_test.html'))
     self.checkTestResult()
 
+class VendorSpecificTest(ChromeDriverBaseTestWithWebServer):
+
+  def setUp(self):
+    global _VENDOR_ID
+    self._vendor_id = _VENDOR_ID
+    self._driver = self.CreateDriver()
+
+  def testGetSinks(self):
+    # Regression test for chromedriver:4176
+    # This command crashed ChromeDriver on Android
+    self._driver.GetCastSinks(self._vendor_id)
+
 # 'Z' in the beginning is to make test executed in the end of suite.
 class ZChromeStartRetryCountTest(unittest.TestCase):
 
@@ -5409,6 +5421,9 @@
   parser.add_option(
       '', '--test-type',
       help='Select type of tests to run. Possible value: integration')
+  parser.add_option(
+      '', '--vendor',
+      help='Vendor id for vendor specific tests. Defaults to "goog"')
 
   options, args = parser.parse_args()
 
@@ -5484,6 +5499,12 @@
   if _ANDROID_PACKAGE_KEY:
     devil_chromium.Initialize()
 
+  global _VENDOR_ID
+  if options.vendor:
+    _VENDOR_ID = options.vendor
+  else:
+    _VENDOR_ID = 'goog'
+
   if options.filter == '':
     if _ANDROID_PACKAGE_KEY:
       negative_filter = _ANDROID_NEGATIVE_FILTER[_ANDROID_PACKAGE_KEY]
diff --git a/chrome/test/data/extensions/api_test/file_browser/dlp_metadata/test.js b/chrome/test/data/extensions/api_test/file_browser/dlp_metadata/test.js
index 7f6e784..4c9bb96 100644
--- a/chrome/test/data/extensions/api_test/file_browser/dlp_metadata/test.js
+++ b/chrome/test/data/extensions/api_test/file_browser/dlp_metadata/test.js
@@ -87,9 +87,11 @@
               }))
         },
         async function showDlpRestrictionDetails() {
-          chrome.fileManagerPrivate.showDlpRestrictionDetails(
-              'https://example1.com');
-          chrome.test.succeed();
+          chrome.fileManagerPrivate.getDlpRestrictionDetails(
+              'https://example1.com',
+              chrome.test.callbackPass(dlpRestrictionDetails => {
+                chrome.test.assertEq([], dlpRestrictionDetails);
+              }));
         }
       ]);
       break;
@@ -140,10 +142,12 @@
                     dlpMetadata);
               }))
         },
-        async function showDlpRestrictionDetails() {
-          chrome.fileManagerPrivate.showDlpRestrictionDetails(
-              'https://example1.com');
-          chrome.test.succeed();
+        async function getDlpRestrictionDetails() {
+          chrome.fileManagerPrivate.getDlpRestrictionDetails(
+              'https://example1.com',
+              chrome.test.callbackPass(dlpRestrictionDetails => {
+                chrome.test.assertEq([], dlpRestrictionDetails);
+              }));
         }
       ]);
       break;
diff --git a/chrome/test/data/webrtc/video_frame_detector.js b/chrome/test/data/webrtc/video_frame_detector.js
new file mode 100644
index 0000000..b6ba359
--- /dev/null
+++ b/chrome/test/data/webrtc/video_frame_detector.js
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2022 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.
+ */
+
+// This file requires the functions defined in test_functions.js.
+
+var gNumFrames = 0;
+
+// Public interface.
+
+/**
+ * Enables video frame callbacks for a video tag. The algorithm relies on
+ * requestVideoFrameCallback.
+ * After callbacks have been enabled, retrieve the current frame counter with
+ * getNumVideoFrameCallbacks.
+ */
+function enableVideoFrameCallbacks(videoElementId) {
+  const video = document.getElementById(videoElementId);
+  if (!video)
+    throw failTest('Could not find video element with id ' + videoElementId);
+  const callback = (now, metadata) => {
+    ++gNumFrames;
+    video.requestVideoFrameCallback(callback);
+  };
+  video.requestVideoFrameCallback(callback);
+  returnToTest('ok-started');
+}
+
+/**
+ * Returns the number of frame callback invocations so far.
+ */
+function getNumVideoFrameCallbacks() {
+  returnToTest(`${gNumFrames}`);
+}
diff --git a/chrome/test/data/webrtc/webrtc_jsep01_test.html b/chrome/test/data/webrtc/webrtc_jsep01_test.html
index f2286612..8501332f 100644
--- a/chrome/test/data/webrtc/webrtc_jsep01_test.html
+++ b/chrome/test/data/webrtc/webrtc_jsep01_test.html
@@ -7,6 +7,7 @@
   <script type="text/javascript" src="munge_sdp.js"></script>
   <script type="text/javascript" src="getusermedia.js"></script>
   <script type="text/javascript" src="video_detector.js"></script>
+  <script type="text/javascript" src="video_frame_detector.js"></script>
   <script type="text/javascript" src="media_devices.js"></script>
   <script type="text/javascript" src="indexeddb.js"></script>
   <script type="text/javascript" src="peerconnection_getstats.js"></script>
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index e58de34..c3574ba 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -92,6 +92,8 @@
   "reset_page_test.ts",
   "reset_profile_banner_test.ts",
   "safety_check_page_test.ts",
+  "safety_check_permissions_test.ts",
+  "safety_check_test_utils.ts",
   "search_engines_page_test.ts",
   "search_page_test.ts",
   "search_settings_test.ts",
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 1b687d6..16cb5cdf 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -341,6 +341,26 @@
   mocha.run();
 });
 
+var CrSettingsSafetyCheckPermissionsTest = class extends CrSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/safety_check_permissions_test.js';
+  }
+
+  /** @override */
+  get featureListInternal() {
+    return {
+      enabled: [
+        'features::kSafetyCheckPermissions',
+      ],
+    };
+  }
+};
+
+TEST_F('CrSettingsSafetyCheckPermissionsTest', 'All', function() {
+  mocha.run();
+});
+
 GEN('#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)');
 var CrSettingsSafetyCheckChromeCleanerTest =
     class extends CrSettingsBrowserTest {
diff --git a/chrome/test/data/webui/settings/safety_check_page_test.ts b/chrome/test/data/webui/settings/safety_check_page_test.ts
index 6697aad..6f47cff8 100644
--- a/chrome/test/data/webui/settings/safety_check_page_test.ts
+++ b/chrome/test/data/webui/settings/safety_check_page_test.ts
@@ -6,7 +6,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {HatsBrowserProxyImpl, LifetimeBrowserProxyImpl, MetricsBrowserProxyImpl, OpenWindowProxyImpl, PasswordCheckReferrer, PasswordManagerImpl, Router, routes, SafetyCheckBrowserProxy, SafetyCheckBrowserProxyImpl, SafetyCheckCallbackConstants, SafetyCheckChromeCleanerStatus, SafetyCheckExtensionsStatus, SafetyCheckIconStatus, SafetyCheckInteractions, SafetyCheckParentStatus, SafetyCheckPasswordsStatus, SafetyCheckSafeBrowsingStatus, SafetyCheckUpdatesStatus, SettingsSafetyCheckChildElement, SettingsSafetyCheckExtensionsChildElement, SettingsSafetyCheckPageElement, SettingsSafetyCheckPasswordsChildElement, SettingsSafetyCheckSafeBrowsingChildElement, SettingsSafetyCheckUpdatesChildElement, TrustSafetyInteraction} from 'chrome://settings/settings.js';
+import {HatsBrowserProxyImpl, LifetimeBrowserProxyImpl, MetricsBrowserProxyImpl, OpenWindowProxyImpl, PasswordCheckReferrer, PasswordManagerImpl, Router, routes, SafetyCheckBrowserProxy, SafetyCheckBrowserProxyImpl, SafetyCheckCallbackConstants, SafetyCheckChromeCleanerStatus, SafetyCheckExtensionsStatus, SafetyCheckIconStatus, SafetyCheckInteractions, SafetyCheckParentStatus, SafetyCheckPasswordsStatus, SafetyCheckSafeBrowsingStatus, SafetyCheckUpdatesStatus, SettingsSafetyCheckChildElement, SettingsSafetyCheckExtensionsChildElement, SettingsSafetyCheckPageElement, SettingsSafetyCheckPasswordsChildElement, SettingsSafetyCheckSafeBrowsingChildElement ,SettingsSafetyCheckUpdatesChildElement, TrustSafetyInteraction} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
@@ -15,6 +15,7 @@
 import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
 import {TestOpenWindowProxy} from './test_open_window_proxy.js';
 import {TestPasswordManagerProxy} from './test_password_manager_proxy.js';
+import {assertSafetyCheckChild} from './safety_check_test_utils.js';
 
 // clang-format on
 
@@ -95,45 +96,6 @@
       SafetyCheckCallbackConstants.CHROME_CLEANER_CHANGED, event);
 }
 
-interface SafetyCheckChildExpectation {
-  page: HTMLElement;
-  iconStatus: SafetyCheckIconStatus;
-  label: string;
-  buttonLabel?: string;
-  buttonAriaLabel?: string;
-  buttonClass?: string;
-  managedIcon?: boolean;
-  rowClickable?: boolean;
-}
-
-/**
- * Verify that the safety check child inside the page has been configured as
- * specified.
- */
-function assertSafetyCheckChild({
-  page,
-  iconStatus,
-  label,
-  buttonLabel,
-  buttonAriaLabel,
-  buttonClass,
-  managedIcon,
-  rowClickable,
-}: SafetyCheckChildExpectation) {
-  const safetyCheckChild =
-      page.shadowRoot!.querySelector<SettingsSafetyCheckChildElement>(
-          '#safetyCheckChild')!;
-  assertTrue(safetyCheckChild.iconStatus === iconStatus);
-  assertTrue(safetyCheckChild.label === label);
-  assertTrue(safetyCheckChild.subLabel === testDisplayString);
-  assertTrue(!buttonLabel || safetyCheckChild.buttonLabel === buttonLabel);
-  assertTrue(
-      !buttonAriaLabel || safetyCheckChild.buttonAriaLabel === buttonAriaLabel);
-  assertTrue(!buttonClass || safetyCheckChild.buttonClass === buttonClass);
-  assertTrue(!!managedIcon === !!safetyCheckChild.managedIcon);
-  assertTrue(!!rowClickable === !!safetyCheckChild.rowClickable);
-}
-
 class TestSafetyCheckBrowserProxy extends TestBrowserProxy implements
     SafetyCheckBrowserProxy {
   private parentRanDisplayString_ = '';
@@ -426,6 +388,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.RUNNING,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 
@@ -436,6 +399,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 
@@ -446,6 +410,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.RUNNING,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 
@@ -456,6 +421,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Updates',
+      sublabel: testDisplayString,
       buttonLabel: page.i18n('aboutRelaunch'),
       buttonAriaLabel: page.i18n('safetyCheckUpdatesButtonAriaLabel'),
       buttonClass: 'action-button',
@@ -484,6 +450,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Updates',
+      sublabel: testDisplayString,
       managedIcon: true,
     });
   });
@@ -495,6 +462,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 
@@ -505,6 +473,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.WARNING,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 
@@ -515,6 +484,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Updates',
+      sublabel: testDisplayString,
     });
   });
 });
@@ -545,6 +515,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.RUNNING,
       label: passwordsString,
+      sublabel: testDisplayString,
     });
   });
 
@@ -555,6 +526,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: passwordsString,
+      sublabel: testDisplayString,
       rowClickable: true,
     });
 
@@ -582,6 +554,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.WARNING,
       label: passwordsString,
+      sublabel: testDisplayString,
       buttonLabel: 'Review',
       buttonAriaLabel: 'Review passwords',
       buttonClass: 'action-button',
@@ -620,6 +593,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: passwordsString,
+      sublabel: testDisplayString,
       rowClickable: true,
     });
 
@@ -657,6 +631,7 @@
             page: page,
             iconStatus: SafetyCheckIconStatus.INFO,
             label: passwordsString,
+            sublabel: testDisplayString,
           });
           break;
         case SafetyCheckPasswordsStatus.QUOTA_LIMIT:
@@ -665,6 +640,7 @@
             page: page,
             iconStatus: SafetyCheckIconStatus.INFO,
             label: passwordsString,
+            sublabel: testDisplayString,
             rowClickable: true,
           });
           break;
@@ -702,6 +678,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.RUNNING,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
     });
   });
 
@@ -713,6 +690,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
 
@@ -740,6 +718,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
   });
@@ -752,6 +731,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
   });
@@ -763,6 +743,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       buttonLabel: 'Manage',
       buttonAriaLabel: 'Manage Safe Browsing',
       buttonClass: 'action-button',
@@ -792,6 +773,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       managedIcon: true,
       rowClickable: true,
     });
@@ -805,6 +787,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Safe Browsing',
+      sublabel: testDisplayString,
       managedIcon: true,
       rowClickable: true,
     });
@@ -858,6 +841,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.RUNNING,
       label: 'Extensions',
+      sublabel: testDisplayString,
     });
   });
 
@@ -868,6 +852,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Extensions',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
   });
@@ -880,6 +865,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Extensions',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
 
@@ -908,6 +894,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.SAFE,
       label: 'Extensions',
+      sublabel: testDisplayString,
       rowClickable: true,
     });
 
@@ -928,6 +915,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.WARNING,
       label: 'Extensions',
+      sublabel: testDisplayString,
       buttonLabel: 'Review',
       buttonAriaLabel: 'Review extensions',
       buttonClass: 'action-button',
@@ -943,6 +931,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.WARNING,
       label: 'Extensions',
+      sublabel: testDisplayString,
       buttonLabel: 'Review',
       buttonAriaLabel: 'Review extensions',
       buttonClass: 'action-button',
@@ -959,6 +948,7 @@
       page: page,
       iconStatus: SafetyCheckIconStatus.INFO,
       label: 'Extensions',
+      sublabel: testDisplayString,
       managedIcon: true,
       rowClickable: true,
     });
diff --git a/chrome/test/data/webui/settings/safety_check_permissions_test.ts b/chrome/test/data/webui/settings/safety_check_permissions_test.ts
new file mode 100644
index 0000000..d1ff012
--- /dev/null
+++ b/chrome/test/data/webui/settings/safety_check_permissions_test.ts
@@ -0,0 +1,47 @@
+// Copyright 2022 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 {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Router, routes, SafetyCheckIconStatus, SettingsSafetyCheckUnusedSitePermissionsElement} from 'chrome://settings/settings.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+
+import {assertSafetyCheckChild} from './safety_check_test_utils.js';
+// clang-format on
+
+suite('SafetyCheckUnusedSitePermissionsUiTests', function() {
+  let page: SettingsSafetyCheckUnusedSitePermissionsElement;
+
+  setup(function() {
+    document.body.innerHTML = '';
+    page =
+        document.createElement('settings-safety-check-unused-site-permissions');
+    document.body.appendChild(page);
+    flush();
+  });
+
+  teardown(function() {
+    page.remove();
+  });
+
+  test('unusedSitesPermissionsReviewUiTest', function() {
+    flush();
+
+    // Ensure the elements are correct.
+    assertSafetyCheckChild({
+      page: page,
+      iconStatus: SafetyCheckIconStatus.WARNING,
+      label: 'Permissions removed from unused websites.',
+      buttonLabel: 'Review',
+      buttonAriaLabel: 'Review',
+    });
+
+    // User clicks review button.
+    page.$.safetyCheckChild.shadowRoot!.querySelector<HTMLElement>(
+                                           '#button')!.click();
+
+    // Ensure the correct Settings page is shown.
+    assertEquals(routes.SITE_SETTINGS, Router.getInstance().getCurrentRoute());
+  });
+});
\ No newline at end of file
diff --git a/chrome/test/data/webui/settings/safety_check_test_utils.ts b/chrome/test/data/webui/settings/safety_check_test_utils.ts
new file mode 100644
index 0000000..124436d
--- /dev/null
+++ b/chrome/test/data/webui/settings/safety_check_test_utils.ts
@@ -0,0 +1,51 @@
+// Copyright 2022 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 {SafetyCheckIconStatus, SettingsSafetyCheckChildElement} from 'chrome://settings/settings.js';
+import {assertTrue} from 'chrome://webui-test/chai_assert.js';
+// clang-format on
+
+export interface SafetyCheckChildExpectation {
+  page: HTMLElement;
+  iconStatus: SafetyCheckIconStatus;
+  label: string;
+  sublabel?: string;
+  buttonLabel?: string;
+  buttonAriaLabel?: string;
+  buttonClass?: string;
+  managedIcon?: boolean;
+  rowClickable?: boolean;
+}
+
+/**
+ * Verify that the safety check child inside the page has been configured as
+ * specified.
+ */
+export function assertSafetyCheckChild({
+  page,
+  iconStatus,
+  label,
+  sublabel,
+  buttonLabel,
+  buttonAriaLabel,
+  buttonClass,
+  managedIcon,
+  rowClickable,
+}: SafetyCheckChildExpectation) {
+  const safetyCheckChild =
+      page.shadowRoot!.querySelector<SettingsSafetyCheckChildElement>(
+          '#safetyCheckChild')!;
+  assertTrue(safetyCheckChild.iconStatus === iconStatus);
+  assertTrue(safetyCheckChild.label === label);
+  assertTrue(
+      (!sublabel && !safetyCheckChild.subLabel) ||
+      safetyCheckChild.subLabel === sublabel);
+  assertTrue(!buttonLabel || safetyCheckChild.buttonLabel === buttonLabel);
+  assertTrue(
+      !buttonAriaLabel || safetyCheckChild.buttonAriaLabel === buttonAriaLabel);
+  assertTrue(!buttonClass || safetyCheckChild.buttonClass === buttonClass);
+  assertTrue(!!managedIcon === !!safetyCheckChild.managedIcon);
+  assertTrue(!!rowClickable === !!safetyCheckChild.rowClickable);
+}
\ No newline at end of file
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index 14ff49fe..8518d7d 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -666,6 +666,7 @@
         "//chrome/updater/win:updater_test",
         "//chrome/updater/win/installer:installer_test",
         "//chrome/updater/win/installer:installer_unittest",
+        "//chrome/updater/win/test:updater_test_process",
       ]
 
       data = [
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc
index 906a6e7..cdb69ba1 100644
--- a/chrome/updater/test/integration_tests_impl.cc
+++ b/chrome/updater/test/integration_tests_impl.cc
@@ -21,6 +21,7 @@
 #include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/path_service.h"
 #include "base/process/launch.h"
@@ -48,6 +49,7 @@
 #include "chrome/updater/registration_data.h"
 #include "chrome/updater/service_proxy_factory.h"
 #include "chrome/updater/test/server.h"
+#include "chrome/updater/unittest_util.h"
 #include "chrome/updater/update_service.h"
 #include "chrome/updater/updater_branding.h"
 #include "chrome/updater/updater_scope.h"
@@ -59,8 +61,11 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/re2/src/re2/re2.h"
 
-namespace updater {
-namespace test {
+#if BUILDFLAG(IS_WIN)
+#include "chrome/updater/win/test/test_executables.h"
+#endif
+
+namespace updater::test {
 namespace {
 
 constexpr char kSelfUpdateCRXName[] = "updater_selfupdate.crx3";
@@ -656,5 +661,45 @@
                    .is_null());
 }
 
-}  // namespace test
-}  // namespace updater
+std::vector<base::FilePath::StringType> GetTestProcessNames() {
+#if BUILDFLAG(IS_MAC)
+  return {
+      GetExecutableRelativePath().value(),
+      GetSetupExecutablePath().value(),
+  };
+#elif BUILDFLAG(IS_WIN)
+  return {
+      GetExecutableRelativePath().value(),
+      GetSetupExecutablePath().value(),
+      kTestProcessExecutableName,
+      []() {
+        const base::FilePath test_executable =
+            base::FilePath::FromASCII(kExecutableName);
+        return test_executable.RemoveExtension()
+            .AppendASCII(kExecutableSuffix)
+            .Append(test_executable.Extension())
+            .value();
+      }(),
+  };
+#else
+  NOTREACHED();
+  return {};
+#endif
+}
+
+void CleanProcesses() {
+  for (const base::FilePath::StringType& process_name : GetTestProcessNames()) {
+    EXPECT_TRUE(KillProcesses(process_name, -1));
+    EXPECT_TRUE(
+        WaitForProcessesToExit(process_name, TestTimeouts::action_timeout()));
+    EXPECT_FALSE(IsProcessRunning(process_name));
+  }
+}
+
+void ExpectCleanProcesses() {
+  for (const base::FilePath::StringType& process_name : GetTestProcessNames()) {
+    EXPECT_FALSE(IsProcessRunning(process_name));
+  }
+}
+
+}  // namespace updater::test
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h
index 87b4a64..52c7489 100644
--- a/chrome/updater/test/integration_tests_impl.h
+++ b/chrome/updater/test/integration_tests_impl.h
@@ -16,25 +16,36 @@
 #include "build/build_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+class GURL;
+
 namespace base {
 class CommandLine;
 class Value;
 class Version;
 }  // namespace base
 
-class GURL;
-
 namespace updater {
-
 enum class UpdaterScope;
+}  // namespace updater
 
-namespace test {
+namespace updater::test {
 
 class ScopedServer;
 
-// Returns the path to the updater executable (in the build output directory).
+// Returns the path to the updater installer program (in the build output
+// directory). This is typically the updater setup, or the updater itself for
+// the platforms where a setup program is not provided.
 base::FilePath GetSetupExecutablePath();
 
+// Returns the names for processes which may be running during unit tests.
+std::vector<base::FilePath::StringType> GetTestProcessNames();
+
+// Ensures test processes are not running after the function is called.
+void CleanProcesses();
+
+// Verifies that test processes are not running.
+void ExpectCleanProcesses();
+
 // Prints the updater.log file to stdout.
 void PrintLog(UpdaterScope scope);
 
@@ -228,7 +239,6 @@
 
 void RunOfflineInstall(UpdaterScope scope);
 
-}  // namespace test
-}  // namespace updater
+}  // namespace updater::test
 
 #endif  // CHROME_UPDATER_TEST_INTEGRATION_TESTS_IMPL_H_
diff --git a/chrome/updater/test/integration_tests_mac.mm b/chrome/updater/test/integration_tests_mac.mm
index 461324de..251468d 100644
--- a/chrome/updater/test/integration_tests_mac.mm
+++ b/chrome/updater/test/integration_tests_mac.mm
@@ -137,6 +137,8 @@
 }
 
 void Clean(UpdaterScope scope) {
+  CleanProcesses();
+
   Launchd::Domain launchd_domain = LaunchdDomain(scope);
   Launchd::Type launchd_type = LaunchdType(scope);
 
@@ -191,6 +193,8 @@
 }
 
 void ExpectClean(UpdaterScope scope) {
+  ExpectCleanProcesses();
+
   Launchd::Domain launchd_domain = LaunchdDomain(scope);
   Launchd::Type launchd_type = LaunchdType(scope);
 
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc
index 3a99dd7..64a1db4 100644
--- a/chrome/updater/test/integration_tests_win.cc
+++ b/chrome/updater/test/integration_tests_win.cc
@@ -48,6 +48,7 @@
 #include "chrome/updater/persisted_data.h"
 #include "chrome/updater/prefs.h"
 #include "chrome/updater/test/integration_tests_impl.h"
+#include "chrome/updater/unittest_util.h"
 #include "chrome/updater/unittest_util_win.h"
 #include "chrome/updater/updater_branding.h"
 #include "chrome/updater/updater_scope.h"
@@ -66,8 +67,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
-namespace updater {
-namespace test {
+namespace updater::test {
 namespace {
 
 constexpr wchar_t kDidRun[] = L"dr";
@@ -323,7 +323,7 @@
 // Returns true is any updater process is found running in any session in the
 // system, regardless of its path.
 bool IsUpdaterRunning() {
-  return IsProcessRunning(GetExecutableRelativePath().value().c_str());
+  return test::IsProcessRunning(GetExecutableRelativePath().value());
 }
 
 void SleepFor(int seconds) {
@@ -481,6 +481,8 @@
 }
 
 void Clean(UpdaterScope scope) {
+  CleanProcesses();
+
   const HKEY root = UpdaterScopeToHKeyRoot(scope);
   for (const wchar_t* key : {CLIENT_STATE_KEY, CLIENTS_KEY, UPDATER_KEY}) {
     EXPECT_TRUE(DeleteRegKey(root, key));
@@ -558,6 +560,7 @@
 }
 
 void ExpectClean(UpdaterScope scope) {
+  ExpectCleanProcesses();
   CheckInstallation(scope, CheckInstallationStatus::kCheckIsNotInstalled,
                     CheckInstallationVersions::kCheckActiveAndSxS);
 }
@@ -1365,5 +1368,4 @@
   DeleteRegKey(key_hive, kTestRegKey);
 }
 
-}  // namespace test
-}  // namespace updater
+}  // namespace updater::test
diff --git a/chrome/updater/unittest_util.cc b/chrome/updater/unittest_util.cc
index 3da23be..22e3032b 100644
--- a/chrome/updater/unittest_util.cc
+++ b/chrome/updater/unittest_util.cc
@@ -4,8 +4,27 @@
 
 #include "chrome/updater/unittest_util.h"
 
+#include "base/files/file_path.h"
+#include "base/process/kill.h"
+#include "base/process/process_iterator.h"
+#include "base/time/time.h"
+
 namespace updater::test {
 
 const char kChromeAppId[] = "{8A69D345-D564-463C-AFF1-A69D9E530F96}";
 
+bool IsProcessRunning(const base::FilePath::StringType& executable_name) {
+  return base::GetProcessCount(executable_name, nullptr) != 0;
+}
+
+bool WaitForProcessesToExit(const base::FilePath::StringType& executable_name,
+                            base::TimeDelta wait) {
+  return base::WaitForProcessesToExit(executable_name, wait, nullptr);
+}
+
+bool KillProcesses(const base::FilePath::StringType& executable_name,
+                   int exit_code) {
+  return base::KillProcesses(executable_name, exit_code, nullptr);
+}
+
 }  // namespace updater::test
diff --git a/chrome/updater/unittest_util.h b/chrome/updater/unittest_util.h
index 62dcd13e..71e88c98 100644
--- a/chrome/updater/unittest_util.h
+++ b/chrome/updater/unittest_util.h
@@ -5,10 +5,30 @@
 #ifndef CHROME_UPDATER_UNITTEST_UTIL_H_
 #define CHROME_UPDATER_UNITTEST_UTIL_H_
 
+#include "base/files/file_path.h"
+
+namespace base {
+class TimeDelta;
+}
+
 namespace updater::test {
 
 extern const char kChromeAppId[];
 
+// Returns true if a process based on the named executable is running.
+bool IsProcessRunning(const base::FilePath::StringType& executable_name);
+
+// Returns true is all processes based on the named executable have exited.
+// Otherwise, it returns false if the time delta has expired.
+bool WaitForProcessesToExit(const base::FilePath::StringType& executable_name,
+                            base::TimeDelta wait);
+
+// Terminates all the processes on the current machine that were launched
+// from the given executable name, ending them with the given exit code.
+// Returns true if all processes were able to be killed off.
+bool KillProcesses(const base::FilePath::StringType& executable_name,
+                   int exit_code);
+
 }  // namespace updater::test
 
 #endif  // CHROME_UPDATER_UNITTEST_UTIL_H_
diff --git a/chrome/updater/unittest_util_unittest.cc b/chrome/updater/unittest_util_unittest.cc
index b1379a7..56d93e1 100644
--- a/chrome/updater/unittest_util_unittest.cc
+++ b/chrome/updater/unittest_util_unittest.cc
@@ -4,11 +4,57 @@
 
 #include "chrome/updater/unittest_util.h"
 
+#include "base/path_service.h"
+#include "base/test/test_timeouts.h"
 #include "base/version.h"
+#include "build/build_config.h"
+#include "chrome/updater/win/test/test_executables.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace updater {
+namespace updater::test {
+namespace {
 
-// TODO(crbug.com/1337086) - test unit test process utilities.
+// Returns the name of the unit test program, which is this program.
+base::FilePath::StringType GetUnitTestExecutableName() {
+  base::FilePath unit_test_executable;
+  base::PathService::Get(base::FILE_EXE, &unit_test_executable);
+  return unit_test_executable.BaseName().value();
+}
 
-}  // namespace updater
+}  // namespace
+
+TEST(UnitTestUtil, Processes) {
+  // Test the state of the process for the unit test process itself.
+  base::FilePath::StringType unit_test = GetUnitTestExecutableName();
+  EXPECT_TRUE(IsProcessRunning(unit_test));
+  EXPECT_FALSE(WaitForProcessesToExit(unit_test, base::Milliseconds(1)));
+
+#if BUILDFLAG(IS_WIN)
+  EXPECT_FALSE(IsProcessRunning(kTestProcessExecutableName));
+
+  std::vector<base::Process> long_running;
+  long_running.push_back(LongRunningProcess(nullptr));
+  long_running.push_back(LongRunningProcess(nullptr));
+  for (const base::Process& p : long_running) {
+    EXPECT_TRUE(p.IsValid());
+  }
+  EXPECT_TRUE(IsProcessRunning(kTestProcessExecutableName));
+
+  constexpr int kExitCode = 12345;
+  EXPECT_FALSE(WaitForProcessesToExit(kTestProcessExecutableName,
+                                      base::Milliseconds(1)));
+  EXPECT_TRUE(KillProcesses(kTestProcessExecutableName, kExitCode));
+  EXPECT_TRUE(WaitForProcessesToExit(kTestProcessExecutableName,
+                                     TestTimeouts::action_timeout()));
+  EXPECT_FALSE(IsProcessRunning(kTestProcessExecutableName));
+
+  for (const base::Process& p : long_running) {
+    int exit_code = 0;
+    EXPECT_TRUE(
+        p.WaitForExitWithTimeout(TestTimeouts::tiny_timeout(), &exit_code));
+    EXPECT_EQ(exit_code, kExitCode);
+  }
+#endif  // IS_WIN
+}
+
+}  // namespace updater::test
diff --git a/chrome/updater/win/task_scheduler_unittest.cc b/chrome/updater/win/task_scheduler_unittest.cc
index 231de494..0b8a2b9b 100644
--- a/chrome/updater/win/task_scheduler_unittest.cc
+++ b/chrome/updater/win/task_scheduler_unittest.cc
@@ -33,6 +33,7 @@
 #include "chrome/updater/constants.h"
 #include "chrome/updater/test/integration_tests_impl.h"
 #include "chrome/updater/test_scope.h"
+#include "chrome/updater/unittest_util.h"
 #include "chrome/updater/updater_branding.h"
 #include "chrome/updater/util.h"
 #include "chrome/updater/win/test/test_executables.h"
@@ -69,7 +70,7 @@
     task_scheduler_ = TaskScheduler::CreateInstance();
     EXPECT_TRUE(task_scheduler_->DeleteTask(kTaskName1));
     EXPECT_TRUE(task_scheduler_->DeleteTask(kTaskName2));
-    ASSERT_FALSE(IsProcessRunning(kTestProcessExecutableName));
+    ASSERT_FALSE(test::IsProcessRunning(kTestProcessExecutableName));
     EXPECT_TRUE(IsServiceRunning(SERVICE_SCHEDULE));
   }
 
@@ -78,7 +79,9 @@
     EXPECT_TRUE(task_scheduler_->DeleteTask(kTaskName2));
 
     // Make sure every processes launched with scheduled task are completed.
-    ASSERT_TRUE(WaitForProcessesStopped(kTestProcessExecutableName));
+    test::WaitForProcessesToExit(kTestProcessExecutableName,
+                                 TestTimeouts::action_max_timeout());
+    EXPECT_FALSE(test::IsProcessRunning(kTestProcessExecutableName));
 
     DeleteLogFile();
   }
diff --git a/chrome/updater/win/test/BUILD.gn b/chrome/updater/win/test/BUILD.gn
index 2e5c8c9..15845e2 100644
--- a/chrome/updater/win/test/BUILD.gn
+++ b/chrome/updater/win/test/BUILD.gn
@@ -38,8 +38,6 @@
     "test_executables.h",
   ]
 
-  data_deps = [ ":updater_test_process" ]
-
   deps = [
     ":test_common",
     ":test_strings",
diff --git a/chrome/updater/win/test/test_executables.h b/chrome/updater/win/test/test_executables.h
index 41420c2..14a2b7a 100644
--- a/chrome/updater/win/test/test_executables.h
+++ b/chrome/updater/win/test/test_executables.h
@@ -14,9 +14,6 @@
 
 namespace updater {
 
-// The name of the service executable used for tests.
-extern const wchar_t kTestServiceExecutableName[];
-
 // The name of the executable used for tests.
 extern const wchar_t kTestProcessExecutableName[];
 
diff --git a/chrome/updater/win/win_util.cc b/chrome/updater/win/win_util.cc
index 11587cfd..7647975 100644
--- a/chrome/updater/win/win_util.cc
+++ b/chrome/updater/win/win_util.cc
@@ -48,22 +48,8 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace updater {
-
-ProcessFilterName::ProcessFilterName(const std::wstring& process_name)
-    : process_name_(process_name) {}
-
-bool ProcessFilterName::Includes(const base::ProcessEntry& entry) const {
-  return base::EqualsCaseInsensitiveASCII(entry.exe_file(), process_name_);
-}
-
 namespace {
 
-// The number of iterations to poll if a process is stopped correctly.
-const unsigned int kMaxProcessQueryIterations = 50;
-
-// The sleep time in ms between each poll.
-const unsigned int kProcessQueryWaitTimeMs = 100;
-
 HRESULT IsUserRunningSplitToken(bool& is_split_token) {
   HANDLE token = NULL;
   if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token))
@@ -136,8 +122,7 @@
 }
 
 bool IsExplorerRunningAtMediumOrLower() {
-  ProcessFilterName filter(L"EXPLORER.EXE");
-  base::ProcessIterator iter(&filter);
+  base::NamedProcessIterator iter(L"EXPLORER.EXE", nullptr);
   while (const base::ProcessEntry* process_entry = iter.NextProcessEntry()) {
     MANDATORY_LEVEL level = MandatoryLevelUntrusted;
     if (SUCCEEDED(GetProcessIntegrityLevel(process_entry->pid(), &level)) &&
@@ -203,29 +188,6 @@
   return (error_code != NO_ERROR) ? HRESULT_FROM_WIN32(error_code) : E_FAIL;
 }
 
-bool IsProcessRunning(const wchar_t* executable) {
-  base::NamedProcessIterator iter(executable, nullptr);
-  const base::ProcessEntry* entry = iter.NextProcessEntry();
-  return entry != nullptr;
-}
-
-bool WaitForProcessesStopped(const wchar_t* executable) {
-  DCHECK(executable);
-  VLOG(1) << "Wait for processes '" << executable << "'.";
-
-  // Wait until the process is completely stopped.
-  for (unsigned int iteration = 0; iteration < kMaxProcessQueryIterations;
-       ++iteration) {
-    if (!IsProcessRunning(executable))
-      return true;
-    ::Sleep(kProcessQueryWaitTimeMs);
-  }
-
-  // The process didn't terminate.
-  LOG(ERROR) << "Cannot stop process '" << executable << "', timeout.";
-  return false;
-}
-
 // This sets up COM security to allow NetworkService, LocalService, and System
 // to call back into the process. It is largely inspired by
 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa378987.aspx
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 3300e20..9afeed4 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -63,6 +63,7 @@
 import "chromeos/crosapi/mojom/network_settings_service.mojom";
 import "chromeos/crosapi/mojom/prefs.mojom";
 import "chromeos/crosapi/mojom/printing_metrics.mojom";
+import "chromeos/crosapi/mojom/probe_service.mojom";
 import "chromeos/crosapi/mojom/remoting.mojom";
 import "chromeos/crosapi/mojom/resource_manager.mojom";
 import "chromeos/crosapi/mojom/screen_manager.mojom";
@@ -123,8 +124,8 @@
 // please note the milestone when you added it, to help us reason about
 // compatibility between the client applications and older ash-chrome binaries.
 //
-// Next version: 93
-// Next method id: 97
+// Next version: 94
+// Next method id: 98
 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e",
  RenamedFrom="crosapi.mojom.AshChromeService"]
 interface Crosapi {
@@ -541,6 +542,12 @@
   // Added in M91.
   [MinVersion=19] BindTaskManager@24(pending_receiver<TaskManager> receiver);
 
+  // Binds the telemetry probe service to allow Lacros request telemetry data
+  // from Ash.
+  // Added in M106.
+  [MinVersion=93] BindTelemetryProbeService@97(
+      pending_receiver<crosapi.mojom.TelemetryProbeService> receiver);
+
   // Binds the test controller service, which tests can use to mutate ash. This
   // is not available on production devices.
   [MinVersion=9] BindTestController@14(
diff --git a/chromeos/crosapi/mojom/probe_service.mojom b/chromeos/crosapi/mojom/probe_service.mojom
index 32d38c8e..ba83946d 100644
--- a/chromeos/crosapi/mojom/probe_service.mojom
+++ b/chromeos/crosapi/mojom/probe_service.mojom
@@ -47,8 +47,8 @@
 // Interface for getting device telemetry information. Implemented in
 // ash-chrome.
 [Stable, Uuid="f3dbbe3b-a810-43a9-889e-b130b4f94869",
-RenamedFrom="ash.health.mojom.ProbeService"]
-interface ProbeService {
+RenamedFrom="crosapi.mojom.ProbeService"]
+interface TelemetryProbeService {
   // Returns telemetry information for the desired categories.
   //
   // The request:
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc
index 1f5fff5d..dd29a30 100644
--- a/chromeos/lacros/lacros_service.cc
+++ b/chromeos/lacros/lacros_service.cc
@@ -70,6 +70,7 @@
 #include "chromeos/crosapi/mojom/power.mojom.h"
 #include "chromeos/crosapi/mojom/prefs.mojom.h"
 #include "chromeos/crosapi/mojom/printing_metrics.mojom.h"
+#include "chromeos/crosapi/mojom/probe_service.mojom.h"
 #include "chromeos/crosapi/mojom/remoting.mojom.h"
 #include "chromeos/crosapi/mojom/resource_manager.mojom.h"
 #include "chromeos/crosapi/mojom/screen_manager.mojom.h"
@@ -453,6 +454,10 @@
   ConstructRemote<crosapi::mojom::TaskManager,
                   &crosapi::mojom::Crosapi::BindTaskManager,
                   Crosapi::MethodMinVersions::kBindTaskManagerMinVersion>();
+  ConstructRemote<
+      crosapi::mojom::TelemetryProbeService,
+      &crosapi::mojom::Crosapi::BindTelemetryProbeService,
+      Crosapi::MethodMinVersions::kBindTelemetryProbeServiceMinVersion>();
   ConstructRemote<crosapi::mojom::TimeZoneService,
                   &crosapi::mojom::Crosapi::BindTimeZoneService,
                   Crosapi::MethodMinVersions::kBindTimeZoneServiceMinVersion>();
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index d419024..552dabf 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-106-5195.5-1659346912-benchmark-106.0.5222.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-106-5195.5-1659346912-benchmark-106.0.5225.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 78d3215..20a5b82 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-106-5195.5-1659348806-benchmark-106.0.5222.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-106-5195.5-1659348806-benchmark-106.0.5225.0-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index 827eef66a..d96253d 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Speel/Laat wag</translation>
 <translation id="1201402288615127009">Volgende</translation>
 <translation id="1204296502688602597">DNS-traagheid</translation>
+<translation id="1207734034680156868">Voorstelle word op jou beskrywing gegrond</translation>
 <translation id="123124571410524056">Portaal vermoed</translation>
 <translation id="1236400083787698183">Powerwash jou toestel voordat jy herbegin. As jou toestel ’n deksel het, moet jy wag totdat Powerwash klaar is voordat jy die deksel toemaak. Powerwash kan tot ’n minuut neem om klaar te maak.</translation>
 <translation id="1238612778414822719">HTTPS-traaagheid</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 4876136..c429dae 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">پخش/ مکث</translation>
 <translation id="1201402288615127009">بعدی</translation>
 <translation id="1204296502688602597">تأخیر ساناد</translation>
+<translation id="1207734034680156868">پیشنهادها براساس شرح شما است</translation>
 <translation id="123124571410524056">احتمالاً درگاهی وجود دارد</translation>
 <translation id="1236400083787698183">‏قبل‌از بازراه‌اندازی، Powerwash را در دستگاهتان اجرا کنید. اگر دستگاهتان درب دارد، تا زمانی که Powerwash تکمیل نشده است، درب را نبندید. تکمیل Powerwash ممکن است حداکثر یک دقیقه طول بکشد.</translation>
 <translation id="1238612778414822719">‏تأخیر در HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index 07aa86c..422979d 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Afspelen/Onderbreken</translation>
 <translation id="1201402288615127009">Volgende</translation>
 <translation id="1204296502688602597">DNS-latentie</translation>
+<translation id="1207734034680156868">Suggesties zijn gebaseerd op je beschrijving</translation>
 <translation id="123124571410524056">Vermoedelijke portal</translation>
 <translation id="1236400083787698183">Voordat je het apparaat opnieuw opstart, voer je een Powerwash uit. Als je apparaat een klep heeft, wacht je totdat de Powerwash klaar is voordat je de klep sluit. Het kan een minuut duren voordat de Powerwash klaar is.</translation>
 <translation id="1238612778414822719">HTTPS-latentie</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index bdc416f..c532f9e6 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Spill av / sett på pause</translation>
 <translation id="1201402288615127009">Neste</translation>
 <translation id="1204296502688602597">DNS-tidsforsinkelse</translation>
+<translation id="1207734034680156868">Forslagene er basert på beskrivelsen din</translation>
 <translation id="123124571410524056">Mistanke om portal</translation>
 <translation id="1236400083787698183">Utfør en powerwash på enheten før du starter den på nytt. Hvis enheten har lokk, må du vente til powerwashen er fullført før du lukker lokket. Det kan ta opptil et minutt å fullføre powerwashen.</translation>
 <translation id="1238612778414822719">HTTPS-tidsforsinkelse</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index 1eda6de..e6dd82d 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Redă / Întrerupe</translation>
 <translation id="1201402288615127009">Înainte</translation>
 <translation id="1204296502688602597">Latența DNS</translation>
+<translation id="1207734034680156868">Sugestiile se bazează pe descrierea ta</translation>
 <translation id="123124571410524056">Posibil portal</translation>
 <translation id="1236400083787698183">Înainte de repornire, rulează funcția Powerwash pe dispozitiv. Dacă dispozitivul are capac, așteaptă să se finalizeze funcția Powerwash înainte de a închide capacul. Finalizarea funcției Powerwash poate dura maximum un minut.</translation>
 <translation id="1238612778414822719">Latență a solicitărilor HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index bea02bd..befa06e8 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Prehratie alebo pozastavenie</translation>
 <translation id="1201402288615127009">Ďalej</translation>
 <translation id="1204296502688602597">Latencia DNS</translation>
+<translation id="1207734034680156868">Návrhy vychádzajú z vášho opisu</translation>
 <translation id="123124571410524056">Podozrenie na portál</translation>
 <translation id="1236400083787698183">Pred reštartom vykonajte obnovu zariadenia prostredníctvom funkcie Powerwash. Ak má zariadenie kryt, zatvorte ho až po dokončení obnovy prostredníctvom funkcie Powerwash. Jej dokončenie môže trvať až minútu.</translation>
 <translation id="1238612778414822719">Latencia protokolu HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 3d40210f..0ff41a1 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">Ijro/Pauza</translation>
 <translation id="1201402288615127009">Keyingisi</translation>
 <translation id="1204296502688602597">DNS kechikishi</translation>
+<translation id="1207734034680156868">Tavsiyalar tavsiflarga asoslangan</translation>
 <translation id="123124571410524056">Portal muzlatildi</translation>
 <translation id="1236400083787698183">Qayta ishga tushirishdan oldin qurilmangizni format qiling. Qurilmangiz qopqogʻi boʻlsa, Powerwash ishni yakunlashini kuting. Powerwash ishni yakunlashi bir daqiqagacha vaqt oladi.</translation>
 <translation id="1238612778414822719">HTTPS kechikishi</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 1ad8e83..9b698ec 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">播放/暫停</translation>
 <translation id="1201402288615127009">下一個</translation>
 <translation id="1204296502688602597">DNS 延遲時間</translation>
+<translation id="1207734034680156868">系統是根據你的說明提供建議</translation>
 <translation id="123124571410524056">可能有網絡入口</translation>
 <translation id="1236400083787698183">重新開機前請先在裝置上執行 Powerwash。如果裝置有蓋,請等待 Powerwash 完成,然後才關上蓋。Powerwash 需要最多一分鐘才能完成。</translation>
 <translation id="1238612778414822719">HTTPS 延遲時間</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 076fbe3..876d1e26 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -27,6 +27,7 @@
 <translation id="1199355487114804640">播放/暫停</translation>
 <translation id="1201402288615127009">繼續</translation>
 <translation id="1204296502688602597">DNS 延遲</translation>
+<translation id="1207734034680156868">系統是根據你的說明提供建議</translation>
 <translation id="123124571410524056">可能有網路入口</translation>
 <translation id="1236400083787698183">重新啟動前,請先在裝置上執行 Powerwash。如果你的裝置有上蓋,在關閉上蓋前請先等待 Powerwash 完成。Powerwash 可能需要一分鐘的時間才會完成。</translation>
 <translation id="1238612778414822719">HTTPS 延遲</translation>
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index de3a73b..54ae9d9 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -641,11 +641,9 @@
   for (const FormData& form_data : forms) {
     bool is_new_form = !base::Contains(form_structures_, form_data.global_id());
     if (num_managed_forms + is_new_form > kAutofillManagerMaxFormCacheSize) {
-      if (log_manager_) {
-        log_manager_->Log()
-            << LoggingScope::kAbortParsing
-            << LogMessage::kAbortParsingTooManyForms << form_data;
-      }
+      LOG_AF(log_manager_) << LoggingScope::kAbortParsing
+                           << LogMessage::kAbortParsingTooManyForms
+                           << form_data;
       continue;
     }
 
@@ -738,10 +736,8 @@
   bool is_new_form = !base::Contains(form_structures_, form_data.global_id());
   if (form_structures_.size() + is_new_form >
       kAutofillManagerMaxFormCacheSize) {
-    if (log_manager_) {
-      log_manager_->Log() << LoggingScope::kAbortParsing
-                          << LogMessage::kAbortParsingTooManyForms << form_data;
-    }
+    LOG_AF(log_manager_) << LoggingScope::kAbortParsing
+                         << LogMessage::kAbortParsingTooManyForms << form_data;
     return;
   }
 
diff --git a/components/autofill/core/browser/logging/log_manager.cc b/components/autofill/core/browser/logging/log_manager.cc
index fd43d0a..023a939 100644
--- a/components/autofill/core/browser/logging/log_manager.cc
+++ b/components/autofill/core/browser/logging/log_manager.cc
@@ -107,9 +107,4 @@
                                           std::move(notification_callback));
 }
 
-// static
-LogBufferSubmitter LogManager::DevNull() {
-  return LogBufferSubmitter(nullptr, false);
-}
-
 }  // namespace autofill
diff --git a/components/autofill/core/browser/logging/log_manager.h b/components/autofill/core/browser/logging/log_manager.h
index e34e8c9..bbdc3a9 100644
--- a/components/autofill/core/browser/logging/log_manager.h
+++ b/components/autofill/core/browser/logging/log_manager.h
@@ -58,9 +58,6 @@
 
   // This is the preferred way to submitting log entries.
   virtual LogBufferSubmitter Log() = 0;
-
-  // Returns a LogBufferSubmitter that ignores all input.
-  static LogBufferSubmitter DevNull();
 };
 
 inline LogBuffer::IsActive IsLoggingActive(LogManager* log_manager) {
diff --git a/components/autofill/core/browser/logging/log_receiver.h b/components/autofill/core/browser/logging/log_receiver.h
index ddc78ae..16d6fa911 100644
--- a/components/autofill/core/browser/logging/log_receiver.h
+++ b/components/autofill/core/browser/logging/log_receiver.h
@@ -13,12 +13,12 @@
 // logs about progress of actions like saving a password.
 class LogReceiver {
  public:
-  LogReceiver() {}
+  LogReceiver() = default;
 
   LogReceiver(const LogReceiver&) = delete;
   LogReceiver& operator=(const LogReceiver&) = delete;
 
-  virtual ~LogReceiver() {}
+  virtual ~LogReceiver() = default;
 
   virtual void LogEntry(const base::Value::Dict& entry) = 0;
 };
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index a65e5ac..5706494 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -161,7 +161,7 @@
 
 // When enabled, Autofill will attempt to find International Bank Account Number
 // (IBAN) fields when parsing forms.
-const base::Feature kAutofillParseIbanFields{"AutofillParseIbanFields",
+const base::Feature kAutofillParseIBANFields{"AutofillParseIBANFields",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
 // When enabled, Autofill will attempt to find merchant promo/coupon/gift code
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index cfca1f66..557f15d 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -40,7 +40,7 @@
 extern const base::Feature kAutofillEnforceDelaysInStrikeDatabase;
 extern const base::Feature kAutofillFillIbanFields;
 extern const base::Feature kAutofillFillMerchantPromoCodeFields;
-extern const base::Feature kAutofillParseIbanFields;
+extern const base::Feature kAutofillParseIBANFields;
 extern const base::Feature kAutofillParseMerchantPromoCodeFields;
 extern const base::Feature kAutofillParseVcnCardOnFileStandaloneCvcFields;
 extern const base::Feature kAutofillRemoveCardExpiryFromDownstreamSuggestion;
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc
index 5404f674..d847cc11 100644
--- a/components/autofill/core/common/form_field_data.cc
+++ b/components/autofill/core/common/form_field_data.cc
@@ -234,14 +234,9 @@
   // uniquely identify the field as well.
   return std::tuple_cat(
       SimilarityTuple(f),
-      std::tie(
-// TODO(crbug.com/896689): On iOS the unique_id member uniquely addresses
-// this field in the DOM.
-#if BUILDFLAG(IS_IOS)
-          f.unique_id,
-#endif
-          f.autocomplete_attribute, f.placeholder, f.max_length, f.css_classes,
-          f.is_focusable, f.should_autocomplete, f.role, f.text_direction));
+      std::tie(f.autocomplete_attribute, f.placeholder, f.max_length,
+               f.css_classes, f.is_focusable, f.should_autocomplete, f.role,
+               f.text_direction));
 }
 
 }  // namespace
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h
index 082e6116..cf24a41 100644
--- a/components/autofill/core/common/form_field_data.h
+++ b/components/autofill/core/common/form_field_data.h
@@ -193,20 +193,6 @@
   bool HadFocus() const;
   bool WasAutofilled() const;
 
-#if BUILDFLAG(IS_IOS)
-  // The identifier which uniquely addresses this field in the DOM. This is an
-  // ephemeral value which is not guaranteed to be stable across page loads. It
-  // serves to allow a given field to be found during the current navigation.
-  //
-  // TODO(crbug.com/896689): Expand the logic/application of this to other
-  // platforms and/or merge this concept with |unique_renderer_id|.
-  std::u16string unique_id;
-#define EXPECT_EQ_UNIQUE_ID(expected, actual) \
-  EXPECT_EQ((expected).unique_id, (actual).unique_id)
-#else
-#define EXPECT_EQ_UNIQUE_ID(expected, actual)
-#endif
-
   // NOTE: update SameFieldAs()            if needed when adding new a member.
   // NOTE: update SimilarFieldAs()         if needed when adding new a member.
   // NOTE: update DynamicallySameFieldAs() if needed when adding new a member.
@@ -326,7 +312,6 @@
 // TODO(crbug.com/1208354): Replace this with FormData::DeepEqual().
 #define EXPECT_FORM_FIELD_DATA_EQUALS(expected, actual)                        \
   do {                                                                         \
-    EXPECT_EQ_UNIQUE_ID(expected, actual);                                     \
     EXPECT_EQ(expected.label, actual.label);                                   \
     EXPECT_EQ(expected.name, actual.name);                                     \
     EXPECT_EQ(expected.value, actual.value);                                   \
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm
index 075109b..b42ea2c 100644
--- a/components/autofill/ios/browser/autofill_agent_unittests.mm
+++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -143,7 +143,6 @@
   field.name = u"number";
   field.name_attribute = field.name;
   field.id_attribute = u"number";
-  field.unique_id = field.id_attribute;
   field.value = u"number_value";
   field.is_autofilled = true;
   field.unique_renderer_id = FieldRendererId(2);
@@ -152,7 +151,6 @@
   field.name = u"name";
   field.name_attribute = field.name;
   field.id_attribute = u"name";
-  field.unique_id = field.id_attribute;
   field.value = u"name_value";
   field.is_autofilled = true;
   field.unique_renderer_id = FieldRendererId(3);
@@ -161,7 +159,6 @@
   field.name = u"expiry_month";
   field.name_attribute = field.name;
   field.id_attribute = u"expiry_month";
-  field.unique_id = field.id_attribute;
   field.value = u"01";
   field.is_autofilled = false;
   field.unique_renderer_id = FieldRendererId(4);
@@ -170,7 +167,6 @@
   field.name = u"unknown";
   field.name_attribute = field.name;
   field.id_attribute = u"unknown";
-  field.unique_id = field.id_attribute;
   field.value = u"";
   field.is_autofilled = true;
   field.unique_renderer_id = FieldRendererId(5);
diff --git a/components/autofill/ios/browser/autofill_util.mm b/components/autofill/ios/browser/autofill_util.mm
index a4d0e58..3705d11 100644
--- a/components/autofill/ios/browser/autofill_util.mm
+++ b/components/autofill/ios/browser/autofill_util.mm
@@ -193,15 +193,14 @@
 
 bool ExtractFormFieldData(const base::Value::Dict& field,
                           autofill::FormFieldData* field_data) {
-  const std::string *name, *identifier, *form_control_type;
+  const std::string* name;
+  const std::string* form_control_type;
   if (!(name = field.FindString("name")) ||
-      !(identifier = field.FindString("identifier")) ||
       !(form_control_type = field.FindString("form_control_type"))) {
     return false;
   }
 
   field_data->name = base::UTF8ToUTF16(*name);
-  field_data->unique_id = base::UTF8ToUTF16(*identifier);
   field_data->form_control_type = *form_control_type;
 
   const std::string* unique_renderer_id =
diff --git a/components/autofill_assistant/browser/basic_interactions_unittest.cc b/components/autofill_assistant/browser/basic_interactions_unittest.cc
index 87d60e0..a98658c 100644
--- a/components/autofill_assistant/browser/basic_interactions_unittest.cc
+++ b/components/autofill_assistant/browser/basic_interactions_unittest.cc
@@ -12,6 +12,7 @@
 #include "components/autofill_assistant/browser/fake_script_executor_ui_delegate.h"
 #include "components/autofill_assistant/browser/generic_ui.pb.h"
 #include "components/autofill_assistant/browser/mock_execution_delegate.h"
+#include "components/autofill_assistant/browser/user_action.h"
 #include "components/autofill_assistant/browser/user_model.h"
 #include "components/autofill_assistant/browser/value_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -56,6 +57,10 @@
   BasicInteractions basic_interactions_{&ui_delegate_, &execution_delegate_};
 };
 
+TEST_F(BasicInteractionsTest, GetWeakPtr) {
+  EXPECT_EQ(basic_interactions_.GetWeakPtr().get(), &basic_interactions_);
+}
+
 TEST_F(BasicInteractionsTest, SetValue) {
   SetModelValueProto proto;
   *proto.mutable_value()->mutable_value() = SimpleValue(std::string("success"));
@@ -68,6 +73,109 @@
   EXPECT_EQ(user_model_.GetValue("output"), proto.value().value());
 }
 
+TEST_F(BasicInteractionsTest, SetUserActions) {
+  SetUserActionsProto proto;
+  // UserActions not set
+  EXPECT_FALSE(basic_interactions_.SetUserActions(proto));
+
+  // UserActions value not set
+  proto.mutable_user_actions();
+  EXPECT_FALSE(basic_interactions_.SetUserActions(proto));
+
+  // UserActions value doesn't have any actions
+  ValueProto done_user_actions_value;
+  *proto.mutable_user_actions()->mutable_value() = done_user_actions_value;
+  EXPECT_FALSE(basic_interactions_.SetUserActions(proto));
+
+  // Successfully set user action
+  UserActionProto done_user_action;
+  done_user_action.set_identifier("done_identifier");
+  done_user_action.mutable_chip()->set_type(ChipType::HIGHLIGHTED_ACTION);
+  done_user_action.mutable_chip()->set_text("Done");
+  done_user_action.set_enabled(true);
+  *done_user_actions_value.mutable_user_actions()->add_values() =
+      done_user_action;
+  *proto.mutable_user_actions()->mutable_value() = done_user_actions_value;
+  EXPECT_TRUE(basic_interactions_.SetUserActions(proto));
+
+  EXPECT_THAT(*ui_delegate_.GetUserActions(),
+              ElementsAre(AllOf(
+                  Property(&UserAction::identifier, StrEq("done_identifier")),
+                  Property(&UserAction::has_chip, Eq(true)),
+                  Property(&UserAction::enabled, Eq(true)))));
+
+  // Successfully replace user actions
+  ValueProto cancel_user_actions_value;
+  UserActionProto cancel_user_action;
+  cancel_user_action.set_identifier("cancel_identifier");
+  cancel_user_action.mutable_chip()->set_type(ChipType::CANCEL_ACTION);
+  cancel_user_action.mutable_chip()->set_text("Cancel");
+  cancel_user_action.set_enabled(false);
+  *cancel_user_actions_value.mutable_user_actions()->add_values() =
+      cancel_user_action;
+  *proto.mutable_user_actions()->mutable_value() = cancel_user_actions_value;
+  EXPECT_TRUE(basic_interactions_.SetUserActions(proto));
+
+  EXPECT_THAT(*ui_delegate_.GetUserActions(),
+              ElementsAre(AllOf(
+                  Property(&UserAction::identifier, StrEq("cancel_identifier")),
+                  Property(&UserAction::has_chip, Eq(true)),
+                  Property(&UserAction::enabled, Eq(false)))));
+}
+
+TEST_F(BasicInteractionsTest, ComputeValueNoKindOrValue) {
+  // Kind not set
+  ComputeValueProto proto_no_kind_or_value;
+  proto_no_kind_or_value.set_result_model_identifier("output");
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_no_kind_or_value));
+
+  // Kind set but no value was added
+  ComputeValueProto proto_boolean_and;
+  proto_boolean_and.set_result_model_identifier("output");
+  proto_boolean_and.mutable_boolean_and();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_boolean_and));
+
+  ComputeValueProto proto_boolean_or;
+  proto_boolean_or.set_result_model_identifier("output");
+  proto_boolean_or.mutable_boolean_or();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_boolean_or));
+
+  ComputeValueProto proto_boolean_not;
+  proto_boolean_not.set_result_model_identifier("output");
+  proto_boolean_not.mutable_boolean_not();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_boolean_not));
+
+  ComputeValueProto proto_to_string;
+  proto_to_string.set_result_model_identifier("output");
+  proto_to_string.mutable_to_string();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_to_string));
+
+  ComputeValueProto proto_comparison;
+  proto_comparison.set_result_model_identifier("output");
+  proto_comparison.mutable_comparison();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_comparison));
+
+  ComputeValueProto proto_integer_sum;
+  proto_integer_sum.set_result_model_identifier("output");
+  proto_integer_sum.mutable_integer_sum();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_integer_sum));
+
+  ComputeValueProto proto_credit_card_response;
+  proto_credit_card_response.set_result_model_identifier("output");
+  proto_credit_card_response.mutable_create_credit_card_response();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_credit_card_response));
+
+  ComputeValueProto proto_login_options_response;
+  proto_login_options_response.set_result_model_identifier("output");
+  proto_login_options_response.mutable_create_login_option_response();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_login_options_response));
+
+  ComputeValueProto proto_string_empty;
+  proto_string_empty.set_result_model_identifier("output");
+  proto_string_empty.mutable_string_empty();
+  EXPECT_FALSE(basic_interactions_.ComputeValue(proto_string_empty));
+}
+
 TEST_F(BasicInteractionsTest, ComputeValueBooleanAnd) {
   ComputeValueProto proto;
   proto.mutable_boolean_and()->add_values()->set_model_identifier("value_1");
@@ -437,7 +545,31 @@
 
   EXPECT_CALL(callback,
               Run(Property(&ClientStatus::proto_status, ACTION_APPLIED)));
-  basic_interactions_.NotifyViewInflationFinished(ClientStatus(ACTION_APPLIED));
+  EXPECT_TRUE(basic_interactions_.NotifyViewInflationFinished(
+      ClientStatus(ACTION_APPLIED)));
+}
+
+TEST_F(BasicInteractionsTest, NotifyPersistentViewInflationFinishedCallback) {
+  base::MockCallback<base::OnceCallback<void(const ClientStatus&)>> callback;
+
+  // |persistent_view_inflation_finished_callback_| not set
+  EXPECT_FALSE(basic_interactions_.NotifyPersistentViewInflationFinished(
+      ClientStatus(ACTION_APPLIED)));
+
+  basic_interactions_.SetPersistentViewInflationFinishedCallback(
+      callback.Get());
+  EXPECT_CALL(callback,
+              Run(Property(&ClientStatus::proto_status, ACTION_APPLIED)));
+
+  EXPECT_TRUE(basic_interactions_.NotifyPersistentViewInflationFinished(
+      ClientStatus(ACTION_APPLIED)));
+
+  // |persistent_view_inflation_finished_callback_| cleared
+  basic_interactions_.SetPersistentViewInflationFinishedCallback(
+      callback.Get());
+  basic_interactions_.ClearPersistentUiCallbacks();
+  EXPECT_FALSE(basic_interactions_.NotifyPersistentViewInflationFinished(
+      ClientStatus(ACTION_APPLIED)));
 }
 
 TEST_F(BasicInteractionsTest, EndActionResetsViewInflationCallback) {
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
index 6ee4a47..d9778113 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Om <ph name="APP_NAME" /> AR te laat gebruik, moet jy kamera ook in <ph name="BEGIN_LINK" />Android-instellings<ph name="END_LINK" /> aanskakel.</translation>
 <translation id="1864927262126810325">Vanaf <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Liggingtoegang is af vir hierdie toestel. Skakel dit in <ph name="BEGIN_LINK" />Android-instellings<ph name="END_LINK" /> aan.</translation>
-<translation id="1915307458270490472">Sit neer</translation>
 <translation id="1919345977826869612">Advertensies</translation>
 <translation id="1919950603503897840">Kies kontakte</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> van <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Gaan uit</translation>
 <translation id="2687403674020088961">Blokkeer alle webkoekies (nie aanbeveel nie)</translation>
 <translation id="2704606927547763573">Gekopieer</translation>
-<translation id="2713106313042589954">Skakel kamera af</translation>
 <translation id="2717722538473713889">E-posadresse</translation>
 <translation id="2750481671343847896">Werwe kan vir jou aanmeldporboodskappe van identiteitsdienste af wys.</translation>
 <translation id="2785051990912111074">Hierdie keuse sal webkoekies uitvee vir <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Vra eers voordat werwe toegelaat word om jou kamera te gebruik (aanbeveel)</translation>
 <translation id="4505788138578415521">URL is uitgevou</translation>
 <translation id="4534723447064627427">Om <ph name="APP_NAME" /> toegang tot jou mikrofoon te gee, moet jy mikrofoon ook in <ph name="BEGIN_LINK" />Android-instellings<ph name="END_LINK" /> aanskakel.</translation>
-<translation id="4566417217121906555">Demp mikrofoon</translation>
 <translation id="4570913071927164677">Besonderhede</translation>
 <translation id="4645575059429386691">Deur jou ouer bestuur</translation>
 <translation id="4670064810192446073">Virtuele realiteit</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opsie is naby die bokant van die skerm beskikbaar</translation>
 <translation id="5197729504361054390">Die kontakte wat jy kies, sal gedeel word met <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Laas vandag besoek</translation>
-<translation id="5225463052809312700">Skakel kamera aan</translation>
 <translation id="5264323282659631142">Verwyder "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Sleep van bo af en raak die terugknoppie om volskerm te verlaat.</translation>
 <translation id="5300589172476337783">Wys</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 webkoekie word tans gebruik}other{# webkoekies word tans gebruik}}</translation>
 <translation id="8487700953926739672">Vanlyn beskikbaar</translation>
 <translation id="848952951823693243">Versoek altyd mobiele werf</translation>
-<translation id="8499083585497694743">Ontdemp mikrofoon</translation>
 <translation id="851751545965956758">Keer dat werwe aan toestelle koppel</translation>
 <translation id="8525306231823319788">Volskerm</translation>
 <translation id="857943718398505171">Toegelaat (aanbeveel)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
index 0310089..7054fed 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> ኤአር እንዲጠቀም ለማስቻል፣ በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ካሜራን በተጨማሪ ያብሩ።</translation>
 <translation id="1864927262126810325">ከ<ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">የአካባቢ መዳረሻ ለዚህ መሣሪያ ጠፍቷል። በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ያብሩት።</translation>
-<translation id="1915307458270490472">ዝጋ</translation>
 <translation id="1919345977826869612">ማስታወቂያዎች</translation>
 <translation id="1919950603503897840">ዕውቂያዎችን ምረጥ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ለቅቀህ ውጣ</translation>
 <translation id="2687403674020088961">ሁሉንም ኩኪዎች አግድ (አይመከርም)</translation>
 <translation id="2704606927547763573">ተቀድቷል</translation>
-<translation id="2713106313042589954">ካሜራ አጥፋ</translation>
 <translation id="2717722538473713889">ኢሜይል አድራሻዎች</translation>
 <translation id="2750481671343847896">ጣቢያዎች ከማንነት አገልግሎቶች የመግቢያ ጥያቄዎችን ማሳየት ይችላሉ።</translation>
 <translation id="2785051990912111074">ይህ ምርጫ ኩኪዎችን ለ<ph name="WEBSITE" /> ያጸዳል</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ጣቢያዎች ካሜራዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation>
 <translation id="4505788138578415521">ዩአርኤል ተዘርግቷል</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> የእርስዎን ማይክራፎን እንዲደርስ ለማድረግ፣ በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ማይክራፎንን በተጨማሪ ያብሩ።</translation>
-<translation id="4566417217121906555">የማይክሮፎን ድምፀ-ከል አድርግ</translation>
 <translation id="4570913071927164677">ዝርዝሮች</translation>
 <translation id="4645575059429386691">በእርስዎ ወላጅ የሚቀናበር</translation>
 <translation id="4670064810192446073">ምናባዊ እውነታ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">አማራጮች ከማያ ገጹ አናት አጠገብ ይገኛሉ</translation>
 <translation id="5197729504361054390">የመረጧቸው እውቂያዎች ለ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ይጋራሉ።</translation>
 <translation id="5216942107514965959">መጨረሻ የተጎበኘው ዛሬ</translation>
-<translation id="5225463052809312700">ካሜራን አብራ</translation>
 <translation id="5264323282659631142">«<ph name="CHIP_LABEL" />»ን ያስወግዱ</translation>
 <translation id="528192093759286357">ከሙሉ ማያ ገጽ ለመውጣት ከላይ ይጎትቱ እና የተመለስ አዝራሩን ይንኩ።</translation>
 <translation id="5300589172476337783">አሳይ</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{በጥቅም ላይ ያለ 1 ኩኪ}one{# ጥቅም ላይ የዋሉ ኩኪዎች}other{# ጥቅም ላይ የዋሉ ኩኪዎች}}</translation>
 <translation id="8487700953926739672">ከመስመር ውጪ ይገኛል</translation>
 <translation id="848952951823693243">ሁልጊዜ የሞባይል ጣቢያን ጠይቅ</translation>
-<translation id="8499083585497694743">የማይክሮፎን ድምፀ-ከል አንሳ</translation>
 <translation id="851751545965956758">ጣቢያዎች ከመሣሪያዎች ጋር እንዳይገናኙ አግድ</translation>
 <translation id="8525306231823319788">ሙሉ ማያ ገጽ</translation>
 <translation id="857943718398505171">ተፈቅዷል (የሚመከር)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index 0025e856..f095c6e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">‏للسماح لتطبيق <ph name="APP_NAME" /> باستخدام ميزة الواقع المعزَّز، يُرجى أيضًا تفعيل الكاميرا في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">من <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">‏الوصول إلى الموقع الجغرافي متوقف لهذا الجهاز. يمكنك تفعليه في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">قطع الاتصال</translation>
 <translation id="1919345977826869612">الإعلانات</translation>
 <translation id="1919950603503897840">اختيار جهات الاتصال</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">الخروج</translation>
 <translation id="2687403674020088961">حظر كل ملفات تعريف الارتباط (غير مُستحسَن)</translation>
 <translation id="2704606927547763573">تم النسخ</translation>
-<translation id="2713106313042589954">إيقاف الكاميرا</translation>
 <translation id="2717722538473713889">عنوان البريد الإلكتروني</translation>
 <translation id="2750481671343847896">بإمكان المواقع الإلكترونية حظر رسائل المطالبة بتسجيل الدخول من خدمات تقديم الهويات.</translation>
 <translation id="2785051990912111074">سيؤدي هذا الخيار إلى محو ملفات تعريف الارتباط للموقع الإلكتروني <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">السؤال أولاً قبل السماح للمواقع الإلكترونية باستخدام الكاميرا (موصى به)</translation>
 <translation id="4505788138578415521">‏تم توسيع عنوان URL.</translation>
 <translation id="4534723447064627427">‏للسماح لتطبيق <ph name="APP_NAME" /> بالوصول إلى الميكروفون، يُرجى أيضًا تفعيل الميكروفون في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">كتم صوت الميكروفون</translation>
 <translation id="4570913071927164677">التفاصيل</translation>
 <translation id="4645575059429386691">يديره والداك</translation>
 <translation id="4670064810192446073">الواقع الافتراضي</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">يمكنك العثور على خيار حفظ كلمة المرور بالقرب من أعلى الشاشة.</translation>
 <translation id="5197729504361054390">ستتم مشاركة جهات الاتصال التي تختارها مع الموقع الإلكتروني <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">تمّت زيارة الموقع الإلكتروني آخر مرّة اليوم.</translation>
-<translation id="5225463052809312700">تفعيل الكاميرا</translation>
 <translation id="5264323282659631142">إزالة شريحة "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">اسحب من الجزء العلوي والمس زر الرجوع للخروج من وضع ملء الشاشة.</translation>
 <translation id="5300589172476337783">عرض</translation>
@@ -342,7 +338,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{ملف تعريف ارتباط واحد قيد الاستخدام}zero{# ملف تعريف ارتباط قيد الاستخدام}two{ملفا تعريف ارتباط قيد الاستخدام}few{# ملفات تعريف ارتباط قيد الاستخدام}many{# ملف تعريف ارتباط قيد الاستخدام}other{# ملف تعريف ارتباط قيد الاستخدام}}</translation>
 <translation id="8487700953926739672">التوفر بلا إنترنت</translation>
 <translation id="848952951823693243">طلب موقع إلكتروني متوافق مع الأجهزة الجوّالة دومًا</translation>
-<translation id="8499083585497694743">إعادة صوت الميكروفون</translation>
 <translation id="851751545965956758">حظر المواقع الإلكترونية من الاتصال بأجهزة</translation>
 <translation id="8525306231823319788">ملء الشاشة</translation>
 <translation id="857943718398505171">مسموح بها (موصى بها)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
index ec2d159..c7cb3e00 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />ক AR ব্যৱহাৰ কৰিবলৈ দিবলৈ <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />তো কেমেৰা অন কৰক।</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" />ৰ পৰা</translation>
 <translation id="1887786770086287077">এই ডিভাইচটোত অৱস্থান এক্সেছ বন্ধ কৰা আছে। ইয়াক <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />লৈ গৈ অন কৰক।</translation>
-<translation id="1915307458270490472">কল শেষ কৰক</translation>
 <translation id="1919345977826869612">বিজ্ঞাপনসমূহ</translation>
 <translation id="1919950603503897840">সম্পৰ্কসমূহ বাছনি কৰক</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ত্যাগ কৰক</translation>
 <translation id="2687403674020088961">সকলো কুকি অৱৰোধ কৰক (চুপাৰিছ কৰা নহয়)</translation>
 <translation id="2704606927547763573">প্ৰতিলিপি কৰা হ'ল</translation>
-<translation id="2713106313042589954">কেমেৰা অফ কৰক</translation>
 <translation id="2717722538473713889">ইমেইল ঠিকনাবোৰ</translation>
 <translation id="2750481671343847896">ছাইটবিলাকে পৰিচয় সেৱাসমূহৰ পৰা ছাইন-ইনৰ প্ৰম্প্‌ট দেখুৱাব পাৰে।</translation>
 <translation id="2785051990912111074">এই বাছনিটোৱে <ph name="WEBSITE" />ৰ কুকি মচিব</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">আপোনাৰ কেমেৰা ছাইটসমূহক ব্যৱহাৰ কৰিবলৈ দিয়াৰ পূর্বে অনুমতি ল'বলৈ দিয়ক(চুপাৰিছ কৰা)</translation>
 <translation id="4505788138578415521">URL বিস্তাৰ কৰা হৈছে</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" />ক আপোনাৰ মাইক্ৰ’ফ’ন এক্সেছ কৰিবলৈ দিবলৈ <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />তো মাইক্ৰ’ফ’ন অন কৰক।</translation>
-<translation id="4566417217121906555">মাইক্ৰ’ফ’ন মিউট কৰক</translation>
 <translation id="4570913071927164677">সবিশেষ</translation>
 <translation id="4645575059429386691">আপোনাৰ অভিভাৱকৰ দ্বাৰা পৰিচালিত</translation>
 <translation id="4670064810192446073">ভাৰ্চুৱেল ৰিয়েলিটি</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">স্ক্ৰীনৰ ওপৰৰ অংশৰ ওচৰত বিকল্পটো উপলব্ধ</translation>
 <translation id="5197729504361054390">আপুনি বাছনি কৰা সম্পৰ্কবোৰ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />ৰ সৈতে শ্বেয়াৰ কৰা হ’ব।</translation>
 <translation id="5216942107514965959">শেষবাৰ আজি চাইছে</translation>
-<translation id="5225463052809312700">কেমেৰা অন কৰক</translation>
 <translation id="5264323282659631142">‘<ph name="CHIP_LABEL" />’ আঁতৰাওক</translation>
 <translation id="528192093759286357">সম্পূৰ্ণ স্ক্ৰীণৰ পৰা প্ৰস্থান কৰিবলৈ ওপৰৰ পৰা টানি আনক আৰু বেক বুটামটো টিপক।</translation>
 <translation id="5300589172476337783">দেখুৱাওক</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{১ টা কুকি ব্যৱহাৰ হৈ আছে}one{# টা কুকি ব্যৱহাৰ হৈ আছে}other{# টা কুকি ব্যৱহাৰ হৈ আছে}}</translation>
 <translation id="8487700953926739672">অফলাইনত উপলব্ধ</translation>
 <translation id="848952951823693243">সদায়েই ম’বাইল ছাইট অনুৰোধ কৰিব</translation>
-<translation id="8499083585497694743">মাইক্ৰ’ফ’ন আনমিউট কৰক</translation>
 <translation id="851751545965956758">ডিভাইচৰ সৈতে সংযোগ কৰাৰ পৰা ছাইটসমূহক অৱৰোধ কৰক</translation>
 <translation id="8525306231823319788">সম্পূর্ণ স্ক্ৰীণ</translation>
 <translation id="857943718398505171">অনুমোদিত (চুপাৰিছ কৰা)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
index f711af0..4f24351 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> tətbiqinə AR-dan istifadə icazəsi vermək üçün <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> kameranı da aktiv edin.</translation>
 <translation id="1864927262126810325">Mənbə: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Bu cihazda məkan girişi də deaktivdir. <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> girişi aktiv edin.</translation>
-<translation id="1915307458270490472">Dəstəyi qoyun</translation>
 <translation id="1919345977826869612">Reklamlar</translation>
 <translation id="1919950603503897840">Kontaktları seçin</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Tərk edin</translation>
 <translation id="2687403674020088961">Bütün kukiləri bloklayın (tövsiyə edilmir)</translation>
 <translation id="2704606927547763573">Kopyalandı</translation>
-<translation id="2713106313042589954">Kameranı deaktiv edin</translation>
 <translation id="2717722538473713889">E-poçt ünvanları</translation>
 <translation id="2750481671343847896">Saytlar kimlik xidmətlərindən daxil olma sorğularını göstərə bilər.</translation>
 <translation id="2785051990912111074">Bu seçim <ph name="WEBSITE" /> üçün kukiləri siləcək</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Saytlara kameranızı istifadə etmək icazəsi verməmişdən əvvəl soruşun (tövsiyə olunur)</translation>
 <translation id="4505788138578415521">URL genişləndirilib</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> tətbiqinə mikrofonunuza giriş icazəsi vermək üçün <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> mikrofonu da aktiv edin.</translation>
-<translation id="4566417217121906555">Mikrofonu susdurun</translation>
 <translation id="4570913071927164677">Ətraflı</translation>
 <translation id="4645575059429386691">Valideyniniz tərəfindən idarə olunur</translation>
 <translation id="4670064810192446073">Virtual reallıq</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Seçim ekranın yuxarısına yaxın yerdə əlçatandır</translation>
 <translation id="5197729504361054390">Seçdiyiniz kontaktlar <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ilə paylaşılacaq.</translation>
 <translation id="5216942107514965959">Son ziyarət bu gün olub</translation>
-<translation id="5225463052809312700">Kameranı aktiv edin</translation>
 <translation id="5264323282659631142">"<ph name="CHIP_LABEL" />" daxiletməsini silin</translation>
 <translation id="528192093759286357">Yuxarıdan sürüşdürün və tam ekrandan çıxmaq üçün geri düyməsinə basın.</translation>
 <translation id="5300589172476337783">Göstərin</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Saytların virtual reallıq cihazınızı və datanızı istifadə etməsinin qarşısını alın</translation>
 <translation id="6447842834002726250">Kukilər</translation>
+<translation id="6467852467360539617">Datanı silin və icazələri sıfırlayın</translation>
 <translation id="6527303717912515753">Paylaşın</translation>
 <translation id="6545864417968258051">Bluetooth axtarışı</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə bloklanıb}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə bloklanıb}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> seçildi</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> və <ph name="PERMISSION_2" /> üçün icazə verilib</translation>
 <translation id="7302486331832100261">Adətən bildirişləri bloklayırsınız. İcazə vermək üçün Detallar seçiminə toxunun.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> üçün ayarlar</translation>
 <translation id="7423098979219808738">Öncə soruşun</translation>
 <translation id="7423538860840206698">Buferdə oxu girişi blok edildi</translation>
 <translation id="7425915948813553151">Saytlar üçün tünd tema</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 kuki istifadə olunur}other{# kuki istifadə olunur}}</translation>
 <translation id="8487700953926739672">Oflayn olaraq əlçatan</translation>
 <translation id="848952951823693243">Həmişə mobil sayt tələb edin</translation>
-<translation id="8499083585497694743">Mikrofonu səssiz rejimdən çıxarın</translation>
 <translation id="851751545965956758">Saytların cihazlara qoşulmasını blok edin</translation>
 <translation id="8525306231823319788">Tam ekran</translation>
 <translation id="857943718398505171">İcazə verilib (tövsiyə olunur)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
index 5fa35d4..413ad67 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Каб праграма "<ph name="APP_NAME" />" магла выкарыстоўваць дапоўненую рэальнасць, уключыце таксама камеру ў <ph name="BEGIN_LINK" />Наладах Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Крыніца: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Доступ да месцазнаходжання для гэтай прылады выключаны. Уключыце яго ў <ph name="BEGIN_LINK" />Наладах Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Закрыць</translation>
 <translation id="1919345977826869612">Рэклама</translation>
 <translation id="1919950603503897840">Выберыце кантакты</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Выйсці</translation>
 <translation id="2687403674020088961">Блакіраваць усе файлы cookie (не рэкамендуецца)</translation>
 <translation id="2704606927547763573">Скапіравана</translation>
-<translation id="2713106313042589954">Выключыць камеру</translation>
 <translation id="2717722538473713889">Адрасы электроннай пошты</translation>
 <translation id="2750481671343847896">Сайты могуць паказваць запыты на ўваход ад сэрвісаў ідэнтыфікацыі.</translation>
 <translation id="2785051990912111074">Будуць выдалены файлы cookie для вэб-сайта <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Пытацца, перш чым дазволіць сайтам выкарыстоўваць камеру (рэкамендуецца)</translation>
 <translation id="4505788138578415521">URL-адрас разгорнуты</translation>
 <translation id="4534723447064627427">Каб даць праграме "<ph name="APP_NAME" />" доступ да мікрафона, уключыце апошні ў <ph name="BEGIN_LINK" />Наладах Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Выключыць мікрафон</translation>
 <translation id="4570913071927164677">Падрабязныя звесткі</translation>
 <translation id="4645575059429386691">Пад кіраваннем бацькоў</translation>
 <translation id="4670064810192446073">Віртуальная рэальнасць</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Гэты выбар можна зрабіць уверсе экрана</translation>
 <translation id="5197729504361054390">Выбраныя вамі кантакты будуць абагулены з сайтам <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Апошняе наведванне: сёння</translation>
-<translation id="5225463052809312700">Уключыць камеру</translation>
 <translation id="5264323282659631142">Выдаліць чып "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Каб выйсці з поўнаэкраннага рэжыму, правядзіце зверху ўніз і націсніце кнопку "Назад".</translation>
 <translation id="5300589172476337783">Паказаць</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Выкарыстоўваецца 1 файл cookie}one{Выкарыстоўваецца # файл cookie}few{Выкарыстоўваюцца # файлы cookie}many{Выкарыстоўваюцца # файлаў cookie}other{Выкарыстоўваюцца # файла cookie}}</translation>
 <translation id="8487700953926739672">Даступна па-за сеткай</translation>
 <translation id="848952951823693243">Заўсёды запытваць версію сайта для мабільных прылад</translation>
-<translation id="8499083585497694743">Уключыць мікрафон</translation>
 <translation id="851751545965956758">Блакіраваць сайтам падключэнне да прылад</translation>
 <translation id="8525306231823319788">Поўнаэкранны рэжым</translation>
 <translation id="857943718398505171">Дазволена (рэкамендуецца)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
index f8f9689..2d43470 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">За да разрешите на <ph name="APP_NAME" /> да използва AR, камерата трябва да бъде включена от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">От <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Достъпът до местоположението е изключен за това устройство. Включете го от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Затваряне</translation>
 <translation id="1919345977826869612">Реклами</translation>
 <translation id="1919950603503897840">Избор на контакти</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> от <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Излизане</translation>
 <translation id="2687403674020088961">Блокиране на всички „бисквитки“ (не се препоръчва)</translation>
 <translation id="2704606927547763573">Копирано</translation>
-<translation id="2713106313042589954">Изключване на камерата</translation>
 <translation id="2717722538473713889">Имейл адреси</translation>
 <translation id="2750481671343847896">Сайтовете могат да показват подкани за вход от услуги за идентифициране.</translation>
 <translation id="2785051990912111074">Така ще се изчистят „бисквитките“ за <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Извеждане на запитване, преди да се разреши на сайтовете да използват камерата (препоръчително)</translation>
 <translation id="4505788138578415521">URL адресът е разгънат</translation>
 <translation id="4534723447064627427">За да разрешите на <ph name="APP_NAME" /> да осъществява достъп до микрофона ви, той трябва да бъде включен и от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Заглушаване на микрофона</translation>
 <translation id="4570913071927164677">Подробности</translation>
 <translation id="4645575059429386691">Управлява се от ваш родител</translation>
 <translation id="4670064810192446073">Виртуална реалност</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Опцията е в горната част на екрана</translation>
 <translation id="5197729504361054390">Избраните от вас контакти ще бъдат споделени със сайта <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Последно посещение: днес</translation>
-<translation id="5225463052809312700">Включване на камерата</translation>
 <translation id="5264323282659631142">Премахване на „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Плъзнете пръст от горната част на екрана и докоснете бутона за връщане назад, за да излезете от режима на цял екран.</translation>
 <translation id="5300589172476337783">Показване</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Използва се 1 „бисквитка“}other{Използват се # „бисквитки“}}</translation>
 <translation id="8487700953926739672">Налице офлайн</translation>
 <translation id="848952951823693243">Винаги да се заявява мобилният сайт</translation>
-<translation id="8499083585497694743">Включване на микрофона</translation>
 <translation id="851751545965956758">Блокиране на сайтовете, така че да не се свързват с устройства</translation>
 <translation id="8525306231823319788">На цял екран</translation>
 <translation id="857943718398505171">Разрешено (препоръчително)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
index 2cb5a319..edf6cdc 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">তাছাড়া, যাতে <ph name="APP_NAME" /> এ আর (AR) ব্যবহার করতে পারে, তার জন্য <ph name="BEGIN_LINK" />Android সেটিংসে<ph name="END_LINK" /> গিয়েও ক্যামেরা চালু করে দিন।</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> থেকে</translation>
 <translation id="1887786770086287077">এই ডিভাইসে লোকেশন অ্যাক্সেস বন্ধ আছে। চালু করতে <ph name="BEGIN_LINK" />Android সেটিংসে<ph name="END_LINK" /> যান।</translation>
-<translation id="1915307458270490472">কল নামিয়ে রাখুন</translation>
 <translation id="1919345977826869612">বিজ্ঞাপন</translation>
 <translation id="1919950603503897840">পরিচিতিগুলি বেছে নিন</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ছেড়ে চলে যান</translation>
 <translation id="2687403674020088961">সব কুকি ব্লক করুন (সাজেস্ট করা হচ্ছে না)</translation>
 <translation id="2704606927547763573">প্রতিলিপি করা হয়েছে</translation>
-<translation id="2713106313042589954">ক্যামেরা বন্ধ করুন</translation>
 <translation id="2717722538473713889">ইমেল আইডি</translation>
 <translation id="2750481671343847896">সাইটগুলি পরিচয় পরিষেবা প্রদানকারী থেকে সাইন-ইন প্রম্পট দেখাতে পারে।</translation>
 <translation id="2785051990912111074">এটি পছন্দ করলে <ph name="WEBSITE" /> থেকে সব কুকি সাফ হয়ে যাবে</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">সাইটগুলিকে আপনার ক্যামেরা ব্যবহার করতে দিতে মঞ্জুরি দেওয়ার আগে প্রথমে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation>
 <translation id="4505788138578415521">ইউআরএল বড় করা হয়েছে</translation>
 <translation id="4534723447064627427">তাছাড়া, যাতে <ph name="APP_NAME" /> আপনার মাইক্রোফোন অ্যাক্সেস করতে পারে, তার জন্য <ph name="BEGIN_LINK" />Android সেটিংসে<ph name="END_LINK" /> গিয়েও মাইক্রোফোন চালু করে দিন।</translation>
-<translation id="4566417217121906555">মাইক্রোফোন মিউট করুন</translation>
 <translation id="4570913071927164677">বিবরণ</translation>
 <translation id="4645575059429386691">আপনার পিতামাতার দ্বারা পরিচালিত</translation>
 <translation id="4670064810192446073">ভার্চুয়াল রিয়ালিটি</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">স্ক্রিনের উপরের দিকে বিকল্পগুলি দেখানো হয়েছে</translation>
 <translation id="5197729504361054390">আপনার বেছে নেওয়া পরিচিতি <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />-এর সাথে শেয়ার করা হবে।</translation>
 <translation id="5216942107514965959">আজ শেষবার দেখা হয়েছে</translation>
-<translation id="5225463052809312700">ক্যামেরা চালু করুন</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' সরান</translation>
 <translation id="528192093759286357">উপর থেকে টেনে আনুন এবং পূর্ণ স্ক্রিন থেকে বেরিয়ে যেতে পিছনে ফেরার বোতাম স্পর্শ করুন।</translation>
 <translation id="5300589172476337783">দেখান</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{১টি কুকি ব্যবহার করা হচ্ছে}one{#টি কুকি ব্যবহার করা হচ্ছে}other{#টি কুকি ব্যবহার করা হচ্ছে}}</translation>
 <translation id="8487700953926739672">অফলাইনে উপলব্ধ</translation>
 <translation id="848952951823693243">সবসময় মোবাইল সাইটের অনুরোধ করুন</translation>
-<translation id="8499083585497694743">মাইক্রোফোন আনমিউট করুন</translation>
 <translation id="851751545965956758">সাইটকে ডিভাইসের সাথে কানেক্ট করা থেকে ব্লক করুন</translation>
 <translation id="8525306231823319788">পূর্ণ স্ক্রীণ</translation>
 <translation id="857943718398505171">অনুমোদিত (প্রস্তাবিত)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
index 2d0ab2f..805735f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Da aplikaciji <ph name="APP_NAME" /> dozvolite korištenje AR-a, također uključite kameru u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Izvor: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Pristup lokaciji je isključen za ovaj uređaj. Uključite ga u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Prekini vezu</translation>
 <translation id="1919345977826869612">Oglasi</translation>
 <translation id="1919950603503897840">Odaberite kontakte</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Napusti</translation>
 <translation id="2687403674020088961">Blokiraj sve kolačiće (ne preporučuje se)</translation>
 <translation id="2704606927547763573">Kopirano</translation>
-<translation id="2713106313042589954">Isključi kameru</translation>
 <translation id="2717722538473713889">Adrese e-pošte</translation>
 <translation id="2750481671343847896">Web lokacije vam mogu prikazati upite za prijavu koji potiču od usluga identiteta.</translation>
 <translation id="2785051990912111074">Ovim odabirom će se obrisati kolačići za web lokaciju <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Web-lokacije moraju tražiti dopuštenje za pristup kameri (preporučeno)</translation>
 <translation id="4505788138578415521">URL je proširen</translation>
 <translation id="4534723447064627427">Da aplikaciji <ph name="APP_NAME" /> dozvolite pristup mikrofonu, također uključite mikrofon u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Isključi mikrofon</translation>
 <translation id="4570913071927164677">Detalji</translation>
 <translation id="4645575059429386691">Upravlja roditelj</translation>
 <translation id="4670064810192446073">Virtuelna realnost</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opcije su dostupne pri vrhu ekrana</translation>
 <translation id="5197729504361054390">Kontakti koje odaberete će se podijeliti s web lokacijom <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Posljednji put je posjećeno danas</translation>
-<translation id="5225463052809312700">Uključi kameru</translation>
 <translation id="5264323282659631142">Uklanjanje stavke "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Povucite s vrha i dodirnite dugme za nazad da napustite prikaz preko cijelog ekrana.</translation>
 <translation id="5300589172476337783">Prikaži</translation>
@@ -243,7 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Blokira web lokacijama korištenje uređaja i podataka virtuelne realnosti</translation>
 <translation id="6447842834002726250">Kolačići</translation>
-<translation id="6467852467360539617">Izbriši podatke i poništi dopuštenja</translation>
+<translation id="6467852467360539617">Obriši podatke i poništi odobrenja</translation>
 <translation id="6527303717912515753">Dijeli</translation>
 <translation id="6545864417968258051">Skeniranje Bluetootha</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation>
@@ -283,7 +279,7 @@
 <translation id="7250468141469952378">Odabrano <ph name="ITEM_COUNT" /></translation>
 <translation id="7260727271532453612">Dozvoljeno: <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation>
 <translation id="7302486331832100261">Obično blokirate obavještenja. Da dozvolite, dodirnite Detalji.</translation>
-<translation id="7383715096023715447">Postavke domene <ph name="DOMAIN" /></translation>
+<translation id="7383715096023715447">Postavke za domenu <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Prvo pitaj</translation>
 <translation id="7423538860840206698">Čitanje međumemorije je blokirano</translation>
 <translation id="7425915948813553151">Tamna tema za web lokacije</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Koristi se 1 kolačić}one{Koristi se # kolačić}few{Koriste se # kolačića}other{Koristi se # kolačića}}</translation>
 <translation id="8487700953926739672">Dostupno van mreže</translation>
 <translation id="848952951823693243">Uvijek zatraži verziju web lokacije za mobilni uređaj</translation>
-<translation id="8499083585497694743">Uključi mikrofon</translation>
 <translation id="851751545965956758">Blokiraj povezivanje web-lokacija s uređajima</translation>
 <translation id="8525306231823319788">Cijeli ekran</translation>
 <translation id="857943718398505171">Dozvoljeno (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
index 89f99178..a5fdd3f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Per permetre que <ph name="APP_NAME" /> utilitzi RA, activa també la càmera a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">L'accés a la ubicació està desactivat en aquest dispositiu. Activa'l a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Penja</translation>
 <translation id="1919345977826869612">Anuncis</translation>
 <translation id="1919950603503897840">Selecciona contactes</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Surt</translation>
 <translation id="2687403674020088961">Bloqueja totes les galetes (opció no recomanada)</translation>
 <translation id="2704606927547763573">Copiada</translation>
-<translation id="2713106313042589954">Desactiva la càmera</translation>
 <translation id="2717722538473713889">Adreces electròniques</translation>
 <translation id="2750481671343847896">Els llocs web poden mostrar sol·licituds d'inici de sessió procedents de serveis d'identitat.</translation>
 <translation id="2785051990912111074">Amb aquesta opció, s'esborraran les galetes per a <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pregunta abans de permetre que els llocs web utilitzin la càmera (opció recomanada)</translation>
 <translation id="4505788138578415521">L'URL s'ha ampliat</translation>
 <translation id="4534723447064627427">Perquè <ph name="APP_NAME" /> pugui accedir al micròfon, també has d'activar-lo a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Silencia el micròfon</translation>
 <translation id="4570913071927164677">Detalls</translation>
 <translation id="4645575059429386691">Gestionat pels pares</translation>
 <translation id="4670064810192446073">Realitat virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">L'opció està disponible a prop de la part superior de la pantalla.</translation>
 <translation id="5197729504361054390">Els contactes que seleccionis es compartiran amb <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Darrera visita: avui</translation>
-<translation id="5225463052809312700">Activa la càmera</translation>
 <translation id="5264323282659631142">Suprimeix <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Arrossegueu la pantalla des de la part superior i toqueu el botó Enrere per sortir de la pantalla completa.</translation>
 <translation id="5300589172476337783">Mostra</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 galeta en ús}other{# galetes en ús}}</translation>
 <translation id="8487700953926739672">Disponible sense connexió</translation>
 <translation id="848952951823693243">Sol·licita sempre el lloc web per a mòbils</translation>
-<translation id="8499083585497694743">Deixa de silenciar el micròfon</translation>
 <translation id="851751545965956758">Impedeix que els llocs web es connectin a dispositius</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="857943718398505171">Permès (opció recomanada)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
index e3169ae..d37c310 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Pokud aplikaci <ph name="APP_NAME" /> chcete povolit používání rozšířené reality, zapněte také v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" /> fotoaparát.</translation>
 <translation id="1864927262126810325">Od <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Přístup k poloze je v tomto zařízení vypnut. Zapnete jej v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Zavěsit</translation>
 <translation id="1919345977826869612">Reklamy</translation>
 <translation id="1919950603503897840">Vyberte kontakty</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Odejít</translation>
 <translation id="2687403674020088961">Blokovat všechny soubory cookie (nedoporučujeme)</translation>
 <translation id="2704606927547763573">Zkopírováno</translation>
-<translation id="2713106313042589954">Vypnout kameru</translation>
 <translation id="2717722538473713889">E‑mailové adresy</translation>
 <translation id="2750481671343847896">Weby mohou zobrazovat výzvy k přihlášení od služeb zjišťujících identitu</translation>
 <translation id="2785051990912111074">Výběrem této možnosti vymažete soubory cookie webu <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pokud web bude chtít použít vaši kameru, zobrazit dotaz (doporučeno)</translation>
 <translation id="4505788138578415521">Rozbalená adresa URL</translation>
 <translation id="4534723447064627427">Pokud aplikaci <ph name="APP_NAME" /> chcete umožnit přístup k mikrofonu, zapněte mikrofon také v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Vypnout mikrofon</translation>
 <translation id="4570913071927164677">Podrobnosti</translation>
 <translation id="4645575059429386691">Spravováno vaším rodičem</translation>
 <translation id="4670064810192446073">Virtuální realita</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Možnost je k dispozici u horního okraje obrazovky</translation>
 <translation id="5197729504361054390">Vybrané kontakty budou sdíleny s webem <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Naposledy navštíveno dnes</translation>
-<translation id="5225463052809312700">Zapnout kameru</translation>
 <translation id="5264323282659631142">Odstranit položku <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Režim celé obrazovky ukončíte přetažením z horního okraje obrazovky a klepnutím na tlačítko Zpět.</translation>
 <translation id="5300589172476337783">Zobrazit</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Je používán 1 soubor cookie}few{Jsou používány # soubory cookie}many{Je používáno # souboru cookie}other{Je používáno # souborů cookie}}</translation>
 <translation id="8487700953926739672">Dostupné offline</translation>
 <translation id="848952951823693243">Vždy požadovat zobrazení na mobilu</translation>
-<translation id="8499083585497694743">Zapnout mikrofon</translation>
 <translation id="851751545965956758">Bránit webům v připojení k zařízením</translation>
 <translation id="8525306231823319788">Celá obrazovka</translation>
 <translation id="857943718398505171">Povoleno (doporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
index 17620cd..8d15e378 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">I ganiatáu i <ph name="APP_NAME" /> ddefnyddio AR, trowch y camera ymlaen yn <ph name="BEGIN_LINK" />Gosodiadau Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">O <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Mae mynediad lleoliad wedi'i ddiffodd ar gyfer y ddyfais hon. Trowch ef ymlaen yn <ph name="BEGIN_LINK" />Gosodiadau Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Dod â'r sgwrs i ben</translation>
 <translation id="1919345977826869612">Hysbysebion</translation>
 <translation id="1919950603503897840">Dewis cysylltiadau</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Gadael</translation>
 <translation id="2687403674020088961">Rhwystro pob cwci (ni argymhellir)</translation>
 <translation id="2704606927547763573">Copïwyd</translation>
-<translation id="2713106313042589954">Diffodd y camera</translation>
 <translation id="2717722538473713889">Cyfeiriadau e-bost</translation>
 <translation id="2750481671343847896">Gall gwefannau ddangos anogwyr mewngofnodi o wasanaethau hunaniaeth.</translation>
 <translation id="2785051990912111074">Bydd y dewis hwn yn clirio cwcis ar gyfer <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Gofyn yn gyntaf cyn caniatáu i wefannau ddefnyddio'ch camera (argymhellir)</translation>
 <translation id="4505788138578415521">URL wedi'i ehangu</translation>
 <translation id="4534723447064627427">I ganiatáu i <ph name="APP_NAME" /> gael mynediad at eich meicroffon, trowch y meicroffon ymlaen yn <ph name="BEGIN_LINK" />Gosodiadau Android<ph name="END_LINK" /> hefyd.</translation>
-<translation id="4566417217121906555">Distewi'r meicroffon</translation>
 <translation id="4570913071927164677">Manylion</translation>
 <translation id="4645575059429386691">Rheolir gan dy riant</translation>
 <translation id="4670064810192446073">Realiti rhithwir</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Mae'r opsiwn ar gael yn agos at frig y sgrîn</translation>
 <translation id="5197729504361054390">Bydd y cysylltiadau rydych yn eu dewis yn cael eu rhannu gyda <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Ymwelwyd ddiwethaf heddiw</translation>
-<translation id="5225463052809312700">Troi'r camera ymlaen</translation>
 <translation id="5264323282659631142">Tynnu '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Llusgwch o'r brig a chyffyrddwch â'r botwm nôl i adael y sgrîn lawn.</translation>
 <translation id="5300589172476337783">Arddangos</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Rhwystro gwefannau rhag defnyddio eich dyfais rhithwrionedd a'i data</translation>
 <translation id="6447842834002726250">Cwcis</translation>
+<translation id="6467852467360539617">Clirio data ac ailosod caniatadau</translation>
 <translation id="6527303717912515753">Rhannu</translation>
 <translation id="6545864417968258051">Sganio Bluetooth</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ac <ph name="NUM_MORE" /> arall wedi'u rhwystro}zero{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, a <ph name="NUM_MORE" /> arall wedi'u rhwystro}two{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, a <ph name="NUM_MORE" /> arall wedi'u rhwystro}few{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, a <ph name="NUM_MORE" /> arall wedi'u rhwystro}many{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, a <ph name="NUM_MORE" /> arall wedi'u rhwystro}other{Mae <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, a <ph name="NUM_MORE" /> arall wedi'u rhwystro}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378">Mae <ph name="ITEM_COUNT" /> wedi'u dewis</translation>
 <translation id="7260727271532453612">Caniateir <ph name="PERMISSION_1" /> a <ph name="PERMISSION_2" /></translation>
 <translation id="7302486331832100261">Rydych fel arfer yn rhwystro hysbysiadau. I'w caniatáu, tapiwch Manylion.</translation>
+<translation id="7383715096023715447">Gosodiadau ar gyfer <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Gofyn yn gyntaf</translation>
 <translation id="7423538860840206698">Wedi'i rwystro rhag darllen y clipfwrdd</translation>
 <translation id="7425915948813553151">Thema dywyll ar gyfer gwefannau</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Mae 1 cwci yn cael ei ddefnyddio}zero{Mae # cwci yn cael eu defnyddio}two{Mae # gwci yn cael eu defnyddio}few{Mae # chwci yn cael eu defnyddio}many{Mae # chwci yn cael eu defnyddio}other{Mae # cwci yn cael eu defnyddio}}</translation>
 <translation id="8487700953926739672">Ar gael all-lein</translation>
 <translation id="848952951823693243">Gofyn am wefan symudol bob amser</translation>
-<translation id="8499083585497694743">Dad-ddistewi'r meicroffon</translation>
 <translation id="851751545965956758">Rhwystro gwefannau rhag cysylltu â dyfeisiau</translation>
 <translation id="8525306231823319788">Sgrîn lawn</translation>
 <translation id="857943718398505171">Caniateir (argymhellir)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
index 39303b7..2a5e2749 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Aktivér også kameraet i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" /> for at give <ph name="APP_NAME" /> tilladelse til at bruge AR.</translation>
 <translation id="1864927262126810325">Fra <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Lokationsadgang er deaktiveret for denne enhed. Aktivér det under <ph name="BEGIN_LINK" />indstillinger for Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Læg på</translation>
 <translation id="1919345977826869612">Annoncer</translation>
 <translation id="1919950603503897840">Vælg kontakter</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Forlad</translation>
 <translation id="2687403674020088961">Bloker alle cookies (anbefales ikke)</translation>
 <translation id="2704606927547763573">Kopieret</translation>
-<translation id="2713106313042589954">Slå kamera fra</translation>
 <translation id="2717722538473713889">Mailadresser</translation>
 <translation id="2750481671343847896">Websites kan vise loginmeddelelser fra identitetstjenester.</translation>
 <translation id="2785051990912111074">Denne handling rydder cookies for <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Spørg, før websites bruger dit kamera (anbefales)</translation>
 <translation id="4505788138578415521">Webadressen er udvidet</translation>
 <translation id="4534723447064627427">Aktivér også din mikrofon i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" /> for at give <ph name="APP_NAME" /> adgang til mikrofonen.</translation>
-<translation id="4566417217121906555">Slå mikrofon fra</translation>
 <translation id="4570913071927164677">Info</translation>
 <translation id="4645575059429386691">Administreret af en af dine forældre</translation>
 <translation id="4670064810192446073">Virtual reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Se valgmuligheden øverst på skærmen</translation>
 <translation id="5197729504361054390">De kontakter, du vælger, deles med <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Senest besøgt i dag</translation>
-<translation id="5225463052809312700">Slå kamera til</translation>
 <translation id="5264323282659631142">Fjern "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Træk fra toppen, og tryk på tilbageknappen igen for at afslutte fuld skærm.</translation>
 <translation id="5300589172476337783">Vis</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie er i brug}one{# cookie er i brug}other{# cookies er i brug}}</translation>
 <translation id="8487700953926739672">Tilgængelig offline</translation>
 <translation id="848952951823693243">Anmod altid om mobilwebsite</translation>
-<translation id="8499083585497694743">Slå mikrofon til</translation>
 <translation id="851751545965956758">Bloker websites fra at oprette forbindelse til enheder</translation>
 <translation id="8525306231823319788">Fuld skærm</translation>
 <translation id="857943718398505171">Tilladt (anbefales)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
index fd5f54d..a152c3c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Damit <ph name="APP_NAME" /> AR verwenden kann, muss die Kameraberechtigung auch in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktiviert sein.</translation>
 <translation id="1864927262126810325">Quelle: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Der Standortzugriff ist für dieses Gerät deaktiviert. Du kannst ihn in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren.</translation>
-<translation id="1915307458270490472">Auflegen</translation>
 <translation id="1919345977826869612">Werbung</translation>
 <translation id="1919950603503897840">Kontakte auswählen</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> von <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Verlassen</translation>
 <translation id="2687403674020088961">Alle Cookies blockieren (nicht empfohlen)</translation>
 <translation id="2704606927547763573">Kopiert</translation>
-<translation id="2713106313042589954">Kamera ausschalten</translation>
 <translation id="2717722538473713889">E-Mail-Adressen</translation>
 <translation id="2750481671343847896">Websites dürfen Anmeldungsaufforderungen von Identitätsdiensten anzeigen.</translation>
 <translation id="2785051990912111074">Mit dieser Option werden Cookies für <ph name="WEBSITE" /> gelöscht</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Nachfragen, bevor Websites Zugriff auf meine Kamera erhalten (empfohlen)</translation>
 <translation id="4505788138578415521">URL maximiert</translation>
 <translation id="4534723447064627427">Um <ph name="APP_NAME" /> Zugriff auf dein Mikrofon zu gewähren, muss die Mikrofonberechtigung auch in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktiviert werden.</translation>
-<translation id="4566417217121906555">Mikrofon stummschalten</translation>
 <translation id="4570913071927164677">Details</translation>
 <translation id="4645575059429386691">Von deinen Eltern verwaltet</translation>
 <translation id="4670064810192446073">Virtual Reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Option ist oben auf dem Bildschirm verfügbar</translation>
 <translation id="5197729504361054390">Die von dir ausgewählten Kontakte werden mit <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> geteilt.</translation>
 <translation id="5216942107514965959">Heute zuletzt besucht</translation>
-<translation id="5225463052809312700">Kamera einschalten</translation>
 <translation id="5264323282659631142">"<ph name="CHIP_LABEL" />" entfernen</translation>
 <translation id="528192093759286357">Ziehe zum Beenden des Vollbildmodus von oben und tippe auf die Zurück-Taste.</translation>
 <translation id="5300589172476337783">Anzeigen</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 verwendeter Cookie}other{# verwendete Cookies}}</translation>
 <translation id="8487700953926739672">Offline verfügbar</translation>
 <translation id="848952951823693243">Mobile Website immer anfordern</translation>
-<translation id="8499083585497694743">Mikrofon einschalten</translation>
 <translation id="851751545965956758">Verhindern, dass Websites eine Verbindung zu Geräten herstellen</translation>
 <translation id="8525306231823319788">Vollbildmodus</translation>
 <translation id="857943718398505171">Zugelassen (empfohlen)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
index bfb9a1950..c03e0f2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Για να επιτρέπεται στην εφαρμογή <ph name="APP_NAME" /> να χρησιμοποιεί AR, ενεργοποιήστε επίσης την κάμερα στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Από <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Η πρόσβαση στην Τοποθεσία είναι απενεργοποιημένη γι' αυτήν τη συσκευή. Ενεργοποιήστε τη στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Τερματισμός κλήσης</translation>
 <translation id="1919345977826869612">Διαφημίσεις</translation>
 <translation id="1919950603503897840">Επιλογή επαφών</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Αποχώρηση</translation>
 <translation id="2687403674020088961">Αποκλεισμός όλων των cookie (δεν συνιστάται)</translation>
 <translation id="2704606927547763573">Αντιγράφ.</translation>
-<translation id="2713106313042589954">Απενεργοποίηση κάμερας</translation>
 <translation id="2717722538473713889">Διευθύνσεις ηλεκτρονικού ταχυδρομείου</translation>
 <translation id="2750481671343847896">Οι ιστότοποι μπορούν πλέον να εμφανίζουν προτροπές σύνδεσης από υπηρεσίες ταυτότητας.</translation>
 <translation id="2785051990912111074">Αυτή η επιλογή θα διαγράψει τα cookie για τον ιστότοπο <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να χρησιμοποιούν την κάμερά σας (συνιστάται)</translation>
 <translation id="4505788138578415521">Το URL επεκτάθηκε</translation>
 <translation id="4534723447064627427">Για να επιτρέψετε στην εφαρμογή <ph name="APP_NAME" /> να αποκτήσει πρόσβαση στο μικρόφωνό σας, ενεργοποιήστε επίσης το μικρόφωνο στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Σίγαση μικροφώνου</translation>
 <translation id="4570913071927164677">Λεπτομέρειες</translation>
 <translation id="4645575059429386691">Διαχειρίζεται από τους γονείς σου</translation>
 <translation id="4670064810192446073">Εικονική πραγματικότητα</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Η επιλογή είναι διαθέσιμη κοντά στην κορυφή της οθόνης</translation>
 <translation id="5197729504361054390">Οι επαφές που επιλέγετε θα κοινοποιηθούν στον ιστότοπο <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Τελευταία επίσκεψη σήμερα</translation>
-<translation id="5225463052809312700">Ενεργοποίηση κάμερας</translation>
 <translation id="5264323282659631142">Κατάργηση <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Σύρετε από το επάνω τμήμα και αγγίξτε το κουμπί επιστροφής για έξοδο από την πλήρη οθόνη.</translation>
 <translation id="5300589172476337783">Εμφάνιση</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Χρησιμοποιείται 1 cookie}other{Χρησιμοποιούνται # cookie}}</translation>
 <translation id="8487700953926739672">Διαθέσιμο εκτός σύνδεσης</translation>
 <translation id="848952951823693243">Να ζητείται πάντα ιστότοπος για κινητά</translation>
-<translation id="8499083585497694743">Κατάργηση σίγασης μικροφώνου</translation>
 <translation id="851751545965956758">Αποκλεισμός ιστοτόπων από τη σύνδεση σε συσκευές</translation>
 <translation id="8525306231823319788">Πλήρης οθόνη</translation>
 <translation id="857943718398505171">Επιτρέπεται (συνιστάται)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
index 3a5434f..a0b2ea50 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">To let <ph name="APP_NAME" /> use AR, also turn on camera in <ph name="BEGIN_LINK" />Android settings<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">From <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Location access is off for this device. Turn it on in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Hang up</translation>
 <translation id="1919345977826869612">Ads</translation>
 <translation id="1919950603503897840">Select contacts</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Leave</translation>
 <translation id="2687403674020088961">Block all cookies (not recommended)</translation>
 <translation id="2704606927547763573">Copied</translation>
-<translation id="2713106313042589954">Turn off camera</translation>
 <translation id="2717722538473713889">Email addresses</translation>
 <translation id="2750481671343847896">Sites can show sign-in prompts from identity services.</translation>
 <translation id="2785051990912111074">This choice will clear cookies for <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Ask first before allowing sites to use your camera (recommended)</translation>
 <translation id="4505788138578415521">URL expanded</translation>
 <translation id="4534723447064627427">To let <ph name="APP_NAME" /> access your microphone, also turn on microphone in <ph name="BEGIN_LINK" />Android settings<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Mute microphone</translation>
 <translation id="4570913071927164677">Details</translation>
 <translation id="4645575059429386691">Managed by your parent</translation>
 <translation id="4670064810192446073">Virtual reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Option available near top of the screen</translation>
 <translation id="5197729504361054390">The contacts that you select will be shared with <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Last visited today</translation>
-<translation id="5225463052809312700">Turn on camera</translation>
 <translation id="5264323282659631142">Remove '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Drag from top and touch the back button to exit full screen.</translation>
 <translation id="5300589172476337783">Show</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie in use}other{# cookies in use}}</translation>
 <translation id="8487700953926739672">Available offline</translation>
 <translation id="848952951823693243">Always request mobile site</translation>
-<translation id="8499083585497694743">Unmute microphone</translation>
 <translation id="851751545965956758">Block sites from connecting to devices</translation>
 <translation id="8525306231823319788">Full screen</translation>
 <translation id="857943718398505171">Allowed (recommended)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
index bbe9d12b..e2df105 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para permitir el uso de la RA en <ph name="APP_NAME" />, también debes activar la cámara en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">En este dispositivo, el acceso a la ubicación está desactivado. Actívalo en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Colgar</translation>
 <translation id="1919345977826869612">Anuncios</translation>
 <translation id="1919950603503897840">Seleccionar contactos</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Abandonar</translation>
 <translation id="2687403674020088961">Bloquear todas las cookies (opción no recomendada)</translation>
 <translation id="2704606927547763573">Copiado</translation>
-<translation id="2713106313042589954">Desactivar la cámara</translation>
 <translation id="2717722538473713889">Direcciones de correo electrónico</translation>
 <translation id="2750481671343847896">Los sitios pueden mostrarte mensajes de acceso de servicios de identidad.</translation>
 <translation id="2785051990912111074">Esta acción borrará las cookies de <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Preguntar primero antes de permitir que los sitios usen tu cámara (recomendado)</translation>
 <translation id="4505788138578415521">URL expandida</translation>
 <translation id="4534723447064627427">Para permitir que <ph name="APP_NAME" /> acceda a tu micrófono, actívalo también en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Silenciar micrófono</translation>
 <translation id="4570913071927164677">Detalles</translation>
 <translation id="4645575059429386691">Administrado por tus padres</translation>
 <translation id="4670064810192446073">Realidad virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Esta opción está disponible cerca de la parte superior de la pantalla.</translation>
 <translation id="5197729504361054390">Los contactos que selecciones se compartirán con <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Última visita: hoy</translation>
-<translation id="5225463052809312700">Activar la cámara</translation>
 <translation id="5264323282659631142">Quitar "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Arrastra el dedo desde la parte superior y toca el botón Atrás para salir de la pantalla completa.</translation>
 <translation id="5300589172476337783">Mostrar</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie en uso}other{# cookies en uso}}</translation>
 <translation id="8487700953926739672">Disponible sin conexión</translation>
 <translation id="848952951823693243">Solicitar siempre la versión para dispositivos móviles</translation>
-<translation id="8499083585497694743">Dejar de silenciar el micrófono</translation>
 <translation id="851751545965956758">Impedir que los sitios se conecten a los dispositivos</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
index 9160353..749416d4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para que <ph name="APP_NAME" /> pueda usar la realidad aumentada, activa la cámara también en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">El acceso a la ubicación está desactivado en este dispositivo. Actívalo en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Colgar</translation>
 <translation id="1919345977826869612">Anuncios</translation>
 <translation id="1919950603503897840">Seleccionar contactos</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Salir</translation>
 <translation id="2687403674020088961">Bloquear todas las cookies (no recomendado)</translation>
 <translation id="2704606927547763573">Copiado</translation>
-<translation id="2713106313042589954">Desactivar cámara</translation>
 <translation id="2717722538473713889">Direcciones de correo electrónico</translation>
 <translation id="2750481671343847896">Los sitios pueden mostrar solicitudes de inicio de sesión de servicios de identidad.</translation>
 <translation id="2785051990912111074">Se borrarán las cookies de <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Preguntar antes de permitir que los sitios utilicen la cámara (recomendado)</translation>
 <translation id="4505788138578415521">URL ampliada</translation>
 <translation id="4534723447064627427">Para que <ph name="APP_NAME" /> pueda acceder al micrófono, actívalo también en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Silenciar micrófono</translation>
 <translation id="4570913071927164677">Detalles</translation>
 <translation id="4645575059429386691">Administrado por uno de tus padres</translation>
 <translation id="4670064810192446073">Realidad virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opción disponible cerca de la parte superior de la pantalla</translation>
 <translation id="5197729504361054390">Los contactos que selecciones se compartirán con <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Última visita: hoy</translation>
-<translation id="5225463052809312700">Activar cámara</translation>
 <translation id="5264323282659631142">Quitar "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Arrastra el dedo desde la parte superior y toca el botón de retroceso para salir de la pantalla completa.</translation>
 <translation id="5300589172476337783">Mostrar</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie en uso}other{# cookies en uso}}</translation>
 <translation id="8487700953926739672">Disponible sin conexión</translation>
 <translation id="848952951823693243">Solicitar siempre la vista para móvil</translation>
-<translation id="8499083585497694743">Activar el micrófono</translation>
 <translation id="851751545965956758">No permitir que los sitios se conecten a dispositivos</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
index 90a8b0c..eb4cfb62 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Selleks et rakendus <ph name="APP_NAME" /> saaks AR-i kasutada, lülitage sisse kaamera ka <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Allikast <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Juurdepääs asukohale on selle seadme puhul välja lülitatud. Lülitage see sisse <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Lõpeta kõne</translation>
 <translation id="1919345977826869612">Reklaamid</translation>
 <translation id="1919950603503897840">Kontaktide valimine</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Lahku</translation>
 <translation id="2687403674020088961">Blokeeri kõik küpsised (ei ole soovitatav)</translation>
 <translation id="2704606927547763573">Kopeeritud</translation>
-<translation id="2713106313042589954">Lülita kaamera välja</translation>
 <translation id="2717722538473713889">E-posti aadressid</translation>
 <translation id="2750481671343847896">Saidid saavad teile kuvada sisselogimisviipasid isikut tuvastavatest teenusest.</translation>
 <translation id="2785051990912111074">Jätkamisel kustutatakse kõik veebisaidi <ph name="WEBSITE" /> küpsised</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Küsi enne saitidele minu kaamera kasutamiseks juurdepääsu lubamist (soovitatav)</translation>
 <translation id="4505788138578415521">Laiendatud URL</translation>
 <translation id="4534723447064627427">Selleks et anda rakendusele <ph name="APP_NAME" /> juurdepääs teie mikrofonile, lülitage mikrofon sisse ka <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Vaigista mikrofon</translation>
 <translation id="4570913071927164677">Üksikasjad</translation>
 <translation id="4645575059429386691">Vanema hallatud</translation>
 <translation id="4670064810192446073">Virtuaalreaalsus</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Valik on saadaval ekraanikuva ülaosas</translation>
 <translation id="5197729504361054390">Teie valitud kontakte jagatakse saidiga <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Viimati külastati täna</translation>
-<translation id="5225463052809312700">Lülita kaamera sisse</translation>
 <translation id="5264323282659631142">Eemalda „<ph name="CHIP_LABEL" />”</translation>
 <translation id="528192093759286357">Täisekraanilt väljumiseks lohistage ülaservast alla ja puudutage tagasinuppu.</translation>
 <translation id="5300589172476337783">Kuva</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 küpsisefail on kasutuses}other{# küpsisefaili on kasutuses}}</translation>
 <translation id="8487700953926739672">Võrguühenduseta saadaval</translation>
 <translation id="848952951823693243">Alati taotletakse mobiilisaiti</translation>
-<translation id="8499083585497694743">Tühista mikrofoni vaigistus</translation>
 <translation id="851751545965956758">Blokeeri saitidel seadmetega ühenduse loomine</translation>
 <translation id="8525306231823319788">Täisekraan</translation>
 <translation id="857943718398505171">Lubatud (soovitatav)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
index 53e5d84..3b4e39a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> aplikazioari errealitate areagotua erabiltzeko baimena emateko, kamera atzitzeko baimena aktibatu behar duzu <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Iturburua: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Kokapenerako sarbidea desaktibatuta dago gailuan. Aktiba ezazu <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Amaitu deia</translation>
 <translation id="1919345977826869612">Iragarkiak</translation>
 <translation id="1919950603503897840">Hautatu kontaktuak</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Irten</translation>
 <translation id="2687403674020088961">Blokeatu cookie guztiak (ez da gomendatzen)</translation>
 <translation id="2704606927547763573">Kopiatuta</translation>
-<translation id="2713106313042589954">Desaktibatu kamera</translation>
 <translation id="2717722538473713889">Helbide elektronikoak</translation>
 <translation id="2750481671343847896">Identitate-zerbitzuek saioa hasteko bidalitako onarpen-mezuak blokea ditzakete webguneek.</translation>
 <translation id="2785051990912111074"><ph name="WEBSITE" /> webgunearen cookieak ezabatuko dira</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Webguneei kamera erabiltzeko baimena eman aurretik, eskatu onespena (gomendatua)</translation>
 <translation id="4505788138578415521">URLa zabalduta dago</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> aplikazioari mikrofonoa atzitzeko baimena emateko, mikrofonoa atzitzeko baimena aktibatu behar duzu <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Desaktibatu mikrofonoa</translation>
 <translation id="4570913071927164677">Xehetasunak</translation>
 <translation id="4645575059429386691">Gurasoek kudeatuta</translation>
 <translation id="4670064810192446073">Errealitate birtuala</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Aukera pantailaren goialdean dago</translation>
 <translation id="5197729504361054390">Hautatzen dituzun kontaktuak <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> webgunearekin partekatuko dira.</translation>
 <translation id="5216942107514965959">Gaur bisitatu duzu azkenengoz</translation>
-<translation id="5225463052809312700">Aktibatu kamera</translation>
 <translation id="5264323282659631142">Kendu "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Pantaila osoko ikuspegitik irteteko, arrastatu goitik eta ukitu Atzera botoia.</translation>
 <translation id="5300589172476337783">Erakutsi</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Ez utzi webguneei errealitate birtualeko gailuak eta datuak erabiltzen</translation>
 <translation id="6447842834002726250">Cookieak</translation>
+<translation id="6467852467360539617">Garbitu datuak eta berrezarri baimenak</translation>
 <translation id="6527303717912515753">Partekatu</translation>
 <translation id="6545864417968258051">Bluetooth bidezko gailuen bilaketa</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" /> blokeatu egin dira}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" /> blokeatu egin dira}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> hautatu dira</translation>
 <translation id="7260727271532453612">Baimena eman zaie hauei: <ph name="PERMISSION_1" /> eta <ph name="PERMISSION_2" /></translation>
 <translation id="7302486331832100261">Jakinarazpenak blokeatu ohi dituzu. Baimena emateko, sakatu "Xehetasunak".</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> domeinuaren ezarpenak</translation>
 <translation id="7423098979219808738">Galdetu lehenbizi</translation>
 <translation id="7423538860840206698">Blokeatuta dago arbeleko edukia irakurtzeko aukera</translation>
 <translation id="7425915948813553151">Webguneetarako gai iluna</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Erabiltzen den 1 cookie}other{Erabiltzen diren # cookie}}</translation>
 <translation id="8487700953926739672">Konexiorik gabe erabilgarri</translation>
 <translation id="848952951823693243">Eskatu beti mugikorretarako webgunea</translation>
-<translation id="8499083585497694743">Aktibatu mikrofonoa</translation>
 <translation id="851751545965956758">Ez utzi webguneei gailuekin konektatzen</translation>
 <translation id="8525306231823319788">Pantaila osoa</translation>
 <translation id="857943718398505171">Baimenduta (gomendatua)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
index 0522d3b..1c2a260 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">‏برای اینکه به <ph name="APP_NAME" /> اجازه دهید از AR استفاده کند، دوربین را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> نیز روشن کنید.</translation>
 <translation id="1864927262126810325">از <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">‏دسترسی به مکان برای این دستگاه خاموش است. آن را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation>
-<translation id="1915307458270490472">قطع تماس</translation>
 <translation id="1919345977826869612">آگهی‌ها</translation>
 <translation id="1919950603503897840">انتخاب مخاطبین</translation>
 <translation id="1923695749281512248">‎<ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" />‎</translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">خروج</translation>
 <translation id="2687403674020088961">مسدود کردن همه کوکی‌ها (توصیه نمی‌شود)</translation>
 <translation id="2704606927547763573">کپی شد</translation>
-<translation id="2713106313042589954">خاموش کردن دوربین</translation>
 <translation id="2717722538473713889">آدرس‌های ایمیل</translation>
 <translation id="2750481671343847896">سایت‌ها می‌توانند پیام‌واره‌های ورود به سیستم سرویس‌های تعیین هویت را نشان دهند.</translation>
 <translation id="2785051990912111074">این گزینه کوکی‌ها را برای <ph name="WEBSITE" /> پاک خواهد کرد</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">قبل از اجازه به سایت‌ها برای استفاده از دوربین، ابتدا سؤال شود (توصیه می‌شود)</translation>
 <translation id="4505788138578415521">نشانی وب گسترده شد</translation>
 <translation id="4534723447064627427">‏برای اینکه به <ph name="APP_NAME" /> اجازه دهید به میکروفون دسترسی پیدا کند، میکروفون را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> نیز روشن کنید.</translation>
-<translation id="4566417217121906555">بی‌صدا کردن میکروفون</translation>
 <translation id="4570913071927164677">جزئیات</translation>
 <translation id="4645575059429386691">مدیریت شده توسط والدین شما</translation>
 <translation id="4670064810192446073">واقعیت مجازی</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">گزینه مربوطه در نزدیکی بالای صفحه دردسترس است</translation>
 <translation id="5197729504361054390">مخاطبین انتخابی شما با <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> هم‌رسانی می‌شود.</translation>
 <translation id="5216942107514965959">آخرین بازدید: امروز</translation>
-<translation id="5225463052809312700">روشن کردن دوربین</translation>
 <translation id="5264323282659631142">برداشتن «<ph name="CHIP_LABEL" />»</translation>
 <translation id="528192093759286357">برای خروج از حالت تمام صفحه، از بالا صفحه را بکشید و دکمه برگشت را لمس کنید.</translation>
 <translation id="5300589172476337783">نمایش</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">دسترسی سایت‌ها به دستگاه و داده‌های واقعیت مجازی مسدود شود</translation>
 <translation id="6447842834002726250">کوکی‌ها</translation>
+<translation id="6467852467360539617">پاک کردن داده‌ها و بازنشانی اجازه‌ها</translation>
 <translation id="6527303717912515753">اشتراک‌گذاری</translation>
 <translation id="6545864417968258051">اسکن کردن بلوتوث</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مسدود هستند}one{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مسدود هستند}other{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مسدود هستند}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> مورد انتخاب شد</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> و <ph name="PERMISSION_2" /> مجاز هستند</translation>
 <translation id="7302486331832100261">معمولاً اعلان‌ها را مسدود می‌کنید. برای مجاز کردن، روی «جزئیات» ضربه بزنید.</translation>
+<translation id="7383715096023715447">تنظیمات <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">ابتدا سؤال شود</translation>
 <translation id="7423538860840206698">خواندن محتوای بریده‌دان مسدود شد</translation>
 <translation id="7425915948813553151">زمینه تیره برای سایت‌ها</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{۱ کوکی درحال استفاده است}one{# کوکی درحال استفاده است}other{# کوکی درحال استفاده است}}</translation>
 <translation id="8487700953926739672">امکان دسترسی به صورت آفلاین</translation>
 <translation id="848952951823693243">همیشه سایت ویژه تلفن همراه درخواست شود</translation>
-<translation id="8499083585497694743">باصدا کردن میکروفون</translation>
 <translation id="851751545965956758">مسدود کردن سایت‌ها برای اتصال به دستگاه‌ها</translation>
 <translation id="8525306231823319788">تمام صفحه</translation>
 <translation id="857943718398505171">مجاز (توصیه می‌شود)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
index 23493ed..cadfd61 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Laita kamera päälle myös <ph name="BEGIN_LINK" />Androidin asetuksista<ph name="END_LINK" />, jotta <ph name="APP_NAME" /> voi käyttää AR:ää.</translation>
 <translation id="1864927262126810325">Lähde: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Sijainti on pois päältä tällä laitteella. Voit laittaa sen päälle <ph name="BEGIN_LINK" />Android-asetuksista<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Katkaise puhelu</translation>
 <translation id="1919345977826869612">Mainokset</translation>
 <translation id="1919950603503897840">Valitse kontaktit</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Poistu</translation>
 <translation id="2687403674020088961">Estä kaikki evästeet (ei suositella)</translation>
 <translation id="2704606927547763573">Kopioitu</translation>
-<translation id="2713106313042589954">Sammuta kamera</translation>
 <translation id="2717722538473713889">Sähköpostiosoitteet</translation>
 <translation id="2750481671343847896">Sivustot voivat näyttää henkilöllisyyspalveluiden sisäänkirjautumiskehotteita.</translation>
 <translation id="2785051990912111074">Valinta tyhjentää evästeet osoitteessa <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pyydä lupaa, kun sivustot yrittävät käyttää kameraasi (suositus).</translation>
 <translation id="4505788138578415521">URL näkyy laajennettuna</translation>
 <translation id="4534723447064627427">Laita mikrofoni päälle myös <ph name="BEGIN_LINK" />Androidin asetuksista<ph name="END_LINK" />, jotta <ph name="APP_NAME" /> saa pääsyn mikrofoniisi.</translation>
-<translation id="4566417217121906555">Mykistä mikrofoni</translation>
 <translation id="4570913071927164677">Tiedot</translation>
 <translation id="4645575059429386691">Vanhempasi hallinnoima</translation>
 <translation id="4670064810192446073">Virtuaalitodellisuus</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Toiminto on käytettävissä näytön yläosassa</translation>
 <translation id="5197729504361054390"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> saa valitsemasi yhteystiedot.</translation>
 <translation id="5216942107514965959">Viimeksi avattu tänään</translation>
-<translation id="5225463052809312700">Käynnistä kamera</translation>
 <translation id="5264323282659631142">Poista <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Poistu koko näytön tilasta vetämällä näytön yläreunasta ja koskettamalla Takaisin-painiketta.</translation>
 <translation id="5300589172476337783">Näytä</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Estä sivustoja käyttämästä virtuaalitodellisuuslaitteitasi ja ‑dataasi</translation>
 <translation id="6447842834002726250">Evästeet</translation>
+<translation id="6467852467360539617">Poista data ja nollaa luvat</translation>
 <translation id="6527303717912515753">Jaa</translation>
 <translation id="6545864417968258051">Bluetooth-haku</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta estetty}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta estetty}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> valittu</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> ja <ph name="PERMISSION_2" /> sallittu</translation>
 <translation id="7302486331832100261">Estät yleensä ilmoitukset. Voit sallia ne valitsemalla Tiedot.</translation>
+<translation id="7383715096023715447">Asetukset: <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Kysy ensin</translation>
 <translation id="7423538860840206698">Leikepöydältä lukeminen estetty</translation>
 <translation id="7425915948813553151">Sivustojen tumma teema</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 eväste käytössä}other{# evästettä käytössä}}</translation>
 <translation id="8487700953926739672">Käytettävissä offline-tilassa</translation>
 <translation id="848952951823693243">Pyydä aina mobiilisivustoa</translation>
-<translation id="8499083585497694743">Poista mikrofonin mykistys</translation>
 <translation id="851751545965956758">Estä sivustoja yhdistämästä laitteisiin</translation>
 <translation id="8525306231823319788">Koko näyttö</translation>
 <translation id="857943718398505171">Sallittu (suositus)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
index 0f01996..cccbab66 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para payagan ang <ph name="APP_NAME" /> na gumamit ng AR, i-on din ang camera sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Mula sa <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Naka-off ang access sa lokasyon para sa device na ito. I-on ito sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Ibaba</translation>
 <translation id="1919345977826869612">Mga Ad</translation>
 <translation id="1919950603503897840">Pumili ng mga contact</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Umalis</translation>
 <translation id="2687403674020088961">I-block ang lahat ng cookies (hindi inirerekomenda)</translation>
 <translation id="2704606927547763573">Kinopya</translation>
-<translation id="2713106313042589954">I-off ang camera</translation>
 <translation id="2717722538473713889">Mga email address</translation>
 <translation id="2750481671343847896">Puwedeng magpakita ang mga site ng mga prompt sa pag-sign in mula sa mga serbisyo ng pagkakakilanlan.</translation>
 <translation id="2785051990912111074">Iki-clear ng opsyong ito ang cookies para sa <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Magtanong muna bago payagan ang mga site na gamitin ang iyong camera (inirerekomenda)</translation>
 <translation id="4505788138578415521">Na-expand ang URL</translation>
 <translation id="4534723447064627427">Para payagan ang <ph name="APP_NAME" /> na i-access ang iyong mikropono, i-on din ang mikropono sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">I-mute ang mikropono</translation>
 <translation id="4570913071927164677">Mga Detalye</translation>
 <translation id="4645575059429386691">Pinamamahalaan ng iyong magulang</translation>
 <translation id="4670064810192446073">Virtual reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Available ang opsyon malapit sa bandang itaas ng screen</translation>
 <translation id="5197729504361054390">Ibabahagi sa <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ang mga contact na pipiliin mo.</translation>
 <translation id="5216942107514965959">Huling binisita ngayong araw</translation>
-<translation id="5225463052809312700">I-on ang camera</translation>
 <translation id="5264323282659631142">Alisin ang '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">I-drag mula sa itaas at pindutin ang button na bumalik upang lumabas sa full screen.</translation>
 <translation id="5300589172476337783">Ipakita</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie ang ginagamit}one{# cookie ang ginagamit}other{# na cookie ang ginagamit}}</translation>
 <translation id="8487700953926739672">Available sa offline</translation>
 <translation id="848952951823693243">Palaging hilingin ang pang-mobile na site</translation>
-<translation id="8499083585497694743">I-unmute ang mikropono</translation>
 <translation id="851751545965956758">I-block ang mga site sa pagkonekta sa mga device</translation>
 <translation id="8525306231823319788">Buong screen</translation>
 <translation id="857943718398505171">Pinapayagan (inirerekomenda)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
index b616978f..270cf6d7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Pour autoriser <ph name="APP_NAME" /> à utiliser la RA, activez aussi l'accès à l'appareil photo dans les <ph name="BEGIN_LINK" />paramètres d'Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">L'accès à la localisation est désactivé pour cet appareil. Activez-le dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Raccrocher</translation>
 <translation id="1919345977826869612">Annonces</translation>
 <translation id="1919950603503897840">Sélectionner des contacts</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Quitter</translation>
 <translation id="2687403674020088961">Bloquer tous les témoins (non recommandé)</translation>
 <translation id="2704606927547763573">Copié</translation>
-<translation id="2713106313042589954">Désactiver la caméra</translation>
 <translation id="2717722538473713889">Adresses de courriel</translation>
 <translation id="2750481671343847896">Les sites peuvent afficher des invites de connexion provenant de services de vérification d'identité.</translation>
 <translation id="2785051990912111074">Ce choix effacera les témoins du site <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Demander avant d'autoriser des sites à utiliser votre caméra (recommandé)</translation>
 <translation id="4505788138578415521">URL développée</translation>
 <translation id="4534723447064627427">Pour autoriser <ph name="APP_NAME" /> à accéder à votre microphone, vous devez aussi activer le microphone dans les <ph name="BEGIN_LINK" />paramètres d'Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Désactiver le microphone</translation>
 <translation id="4570913071927164677">Détails</translation>
 <translation id="4645575059429386691">Géré par l’un de tes parents</translation>
 <translation id="4670064810192446073">Réalité virtuelle</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Option accessible près du haut de l'écran</translation>
 <translation id="5197729504361054390">Les contacts que vous sélectionnez seront partagés avec <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Dernière visite : aujourd'hui</translation>
-<translation id="5225463052809312700">Activer l'appareil photo</translation>
 <translation id="5264323282659631142">Retirer « <ph name="CHIP_LABEL" /> »</translation>
 <translation id="528192093759286357">Faites glisser du haut vers le bas et appuyez sur le bouton de retour pour quitter le mode plein écran.</translation>
 <translation id="5300589172476337783">Afficher</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 témoin en cours d'utilisation}one{# témoin en cours d'utilisation}other{# témoins en cours d'utilisation}}</translation>
 <translation id="8487700953926739672">Offert en ligne</translation>
 <translation id="848952951823693243">Toujours demander le site pour appareils mobiles</translation>
-<translation id="8499083585497694743">Réactiver le microphone</translation>
 <translation id="851751545965956758">Empêcher les sites de se connecter à des appareils</translation>
 <translation id="8525306231823319788">Plein écran</translation>
 <translation id="857943718398505171">Autorisée (recommandé)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
index 9641ed8..01586d2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Pour autoriser <ph name="APP_NAME" /> à utiliser la RA, activez également l'appareil photo dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Source : <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">L'accès à la position est désactivé pour cet appareil. Activez-le dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Raccrocher</translation>
 <translation id="1919345977826869612">Annonces</translation>
 <translation id="1919950603503897840">Sélectionner des contacts</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Quitter</translation>
 <translation id="2687403674020088961">Bloquer tous les cookies (non recommandé)</translation>
 <translation id="2704606927547763573">Copié</translation>
-<translation id="2713106313042589954">Désactiver la caméra</translation>
 <translation id="2717722538473713889">Adresses e-mail</translation>
 <translation id="2750481671343847896">Les sites peuvent afficher les invites de connexion des services d'identité.</translation>
 <translation id="2785051990912111074">Cette action supprimera les cookies de <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Demander avant d'autoriser des sites à utiliser ma caméra (recommandé)</translation>
 <translation id="4505788138578415521">URL étendue</translation>
 <translation id="4534723447064627427">Pour autoriser <ph name="APP_NAME" /> à accéder au micro, activez également celui-ci dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Désactiver le micro</translation>
 <translation id="4570913071927164677">Détails</translation>
 <translation id="4645575059429386691">Géré par ton papa/ta maman</translation>
 <translation id="4670064810192446073">Réalité virtuelle</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Cette option est disponible en haut de l'écran</translation>
 <translation id="5197729504361054390">Les contacts que vous sélectionnez seront partagés avec <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Dernière visite : aujourd'hui</translation>
-<translation id="5225463052809312700">Activer la caméra</translation>
 <translation id="5264323282659631142">Supprimer "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Pour quitter le mode plein écran, faites glisser un doigt du haut vers le bas, puis appuyez sur le bouton Retour.</translation>
 <translation id="5300589172476337783">Afficher</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie est actuellement utilisé}one{# cookie est actuellement utilisé}other{# cookies sont actuellement utilisés}}</translation>
 <translation id="8487700953926739672">Disponible hors connexion</translation>
 <translation id="848952951823693243">Toujours demander la version mobile du site</translation>
-<translation id="8499083585497694743">Réactiver le micro</translation>
 <translation id="851751545965956758">Interdire à tous les sites de se connecter à des appareils</translation>
 <translation id="8525306231823319788">Plein écran</translation>
 <translation id="857943718398505171">Autorisé (recommandé)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
index 9d5ffda0..07790e9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para permitir que <ph name="APP_NAME" /> utilice a realidade aumentada, tamén debes activar a cámara en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">O acceso á localización está desactivado neste dispositivo. Actívao na <ph name="BEGIN_LINK" />configuración de Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Deter</translation>
 <translation id="1919345977826869612">Anuncios</translation>
 <translation id="1919950603503897840">Seleccionar contactos</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Saír</translation>
 <translation id="2687403674020088961">Bloquear todas as cookies (non recomendado)</translation>
 <translation id="2704606927547763573">Copiada</translation>
-<translation id="2713106313042589954">Apagar cámara</translation>
 <translation id="2717722538473713889">Enderezos de correo electrónico</translation>
 <translation id="2750481671343847896">Os sitios poden mostrar solicitudes de inicio de sesión dos servizos de identidade.</translation>
 <translation id="2785051990912111074">Esta opción borrará as cookies de <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pregunta antes de permitir que os sitios utilicen a túa cámara (recomendado)</translation>
 <translation id="4505788138578415521">URL despregado</translation>
 <translation id="4534723447064627427">Para permitir que <ph name="APP_NAME" /> acceda ao micrófono, actívao tamén en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Silenciar micrófono</translation>
 <translation id="4570913071927164677">Detalles</translation>
 <translation id="4645575059429386691">Xestionado por teus pais</translation>
 <translation id="4670064810192446073">Realidade virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opción dispoñible preto da parte superior da pantalla</translation>
 <translation id="5197729504361054390">Os contactos que selecciones compartiranse con <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Visitouse hoxe por última vez</translation>
-<translation id="5225463052809312700">Acender cámara</translation>
 <translation id="5264323282659631142">Quitar <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Arrastra desde a parte superior e toca o botón Volver para saír da pantalla completa.</translation>
 <translation id="5300589172476337783">Mostrar</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie en uso}other{# cookies en uso}}</translation>
 <translation id="8487700953926739672">Dispoñible sen conexión</translation>
 <translation id="848952951823693243">Solicitar sempre o sitio para móbiles</translation>
-<translation id="8499083585497694743">Activar son do micro</translation>
 <translation id="851751545965956758">Non permitir que os sitios se conecten aos dispositivos</translation>
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
index 629074c3..e1f29f7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />ને ARનો વપરાશ કરવા દેવા માટે, <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માંથી પણ કૅમેરા ચાલુ કરો.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> પરથી</translation>
 <translation id="1887786770086287077">આ ઉપકરણ માટે સ્થાન ઍક્સેસ બંધ છે. તેને <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં ચાલુ કરો.</translation>
-<translation id="1915307458270490472">સમાપ્ત કરો</translation>
 <translation id="1919345977826869612">જાહેરાતો</translation>
 <translation id="1919950603503897840">સંપર્કો પસંદ કરો</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">છોડો</translation>
 <translation id="2687403674020088961">બધી કુકીને બ્લૉક કરો (સુઝાવ આપતા નથી)</translation>
 <translation id="2704606927547763573">કૉપિ કર્યું</translation>
-<translation id="2713106313042589954">કૅમેરા બંધ કરો</translation>
 <translation id="2717722538473713889">ઇમેઇલ ઍડ્રેસ</translation>
 <translation id="2750481671343847896">સાઇટ ઓળખ સેવાઓના સાઇન ઇન કરવાના સંકેતો બતાવી શકે છે.</translation>
 <translation id="2785051990912111074">આ પસંદગી <ph name="WEBSITE" /> માટે કુકીને સાફ કરશે</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">સાઇટને તમારા કૅમેરાના ઉપયોગની મંજૂરી આપતાં પહેલાં પૂછો (સુઝાવ આપીએ છીએ)</translation>
 <translation id="4505788138578415521">URL મોટી કરી છે</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> તમારું માઇક્રોફોન ઍક્સેસ કરી શકે તે માટે <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં પણ માઇક્રોફોન ચાલુ કરો.</translation>
-<translation id="4566417217121906555">માઇક્રોફોન મ્યૂટ કરો</translation>
 <translation id="4570913071927164677">વિગતો</translation>
 <translation id="4645575059429386691">તમારા માતાપિતા દ્વારા મેનેજ થયેલ</translation>
 <translation id="4670064810192446073">વર્ચ્યુઅલ રિયાલિટી</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">સ્ક્રીનની ટોચની નજીક વિકલ્પ ઉપલબ્ધ છે</translation>
 <translation id="5197729504361054390">તમે પસંદ કરશો તે સંપર્કોને <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> સાથે શેર કરવામાં આવશે.</translation>
 <translation id="5216942107514965959">છેલ્લે આજે મુલાકાત લીધી</translation>
-<translation id="5225463052809312700">કૅમેરા ચાલુ કરો</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />'ને કાઢી નાખો</translation>
 <translation id="528192093759286357">પૂર્ણસ્ક્રીનથી બહાર નીકળવા માટે ઉપરથી ખેંચો અને પાછળ બટનને ટચ કરો.</translation>
 <translation id="5300589172476337783">બતાવો</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{વપરાશમાંની 1 કુકી}one{વપરાશમાંની # કુકી}other{વપરાશમાંની # કુકી}}</translation>
 <translation id="8487700953926739672">ઑફલાઇન ઉપલબ્ધ</translation>
 <translation id="848952951823693243">હંમેશાં મોબાઇલ સાઇટની વિનંતી કરો</translation>
-<translation id="8499083585497694743">માઇક્રોફોન અનમ્યૂટ કરો</translation>
 <translation id="851751545965956758">સાઇટને ડિવાઇસ સાથે કનેક્ટ થવાથી બ્લૉક કરો</translation>
 <translation id="8525306231823319788">પૂર્ણ સ્ક્રીન</translation>
 <translation id="857943718398505171">મંજૂર (ભલામણ કરેલ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
index ecf89af..36aca21 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> को एआर (ऑगमेंटेड रिएलिटी) का इस्तेमाल करने देने के लिए, <ph name="BEGIN_LINK" />Android की सेटिंग<ph name="END_LINK" /> में जाकर भी कैमरा चालू करें.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> से</translation>
 <translation id="1887786770086287077">इस डिवाइस के लिए जगह की जानकारी का एक्सेस बंद है. उसे <ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में चालू करें.</translation>
-<translation id="1915307458270490472">कॉल खत्म करें</translation>
 <translation id="1919345977826869612">विज्ञापन</translation>
 <translation id="1919950603503897840">संपर्कों को चुनें</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">छोड़ें</translation>
 <translation id="2687403674020088961">सभी कुकी ब्लॉक करें (हम ऐसा करने का सुझाव नहीं देते)</translation>
 <translation id="2704606927547763573">कॉपी किया गया</translation>
-<translation id="2713106313042589954">कैमरा बंद करें</translation>
 <translation id="2717722538473713889">ईमेल पते</translation>
 <translation id="2750481671343847896">साइटें, पहचान करने वाली सेवा से जुड़े, साइन इन करने के अनुरोध दिखा सकती हैं.</translation>
 <translation id="2785051990912111074">यह विकल्प <ph name="WEBSITE" /> के लिए कुकी मिटाएगा</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">साइटों को अपने कैमरे का इस्तेमाल करने देने से पहले अनुमति लेना ज़रूरी बनाएं (सुझाया गया )</translation>
 <translation id="4505788138578415521">यूआरएल बड़ा हो गया</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> को माइक्रोफ़ोन का ऐक्सेस देने के लिए, <ph name="BEGIN_LINK" />Android की सेटिंग<ph name="END_LINK" /> में जाकर भी माइक्रोफ़ोन चालू करें.</translation>
-<translation id="4566417217121906555">माइक्रोफ़ोन को म्यूट करें</translation>
 <translation id="4570913071927164677">विवरण</translation>
 <translation id="4645575059429386691">आपके अभिभावक द्वारा प्रबंधित</translation>
 <translation id="4670064810192446073">वर्चुअल रिएलिटी</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">यह विकल्प, स्क्रीन के सबसे ऊपरी हिस्से में उपलब्ध है</translation>
 <translation id="5197729504361054390">आप जो संपर्क चुनेंगे उन्हें <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> के साथ शेयर किया जाएगा.</translation>
 <translation id="5216942107514965959">साइट पर पिछली बार आज गए</translation>
-<translation id="5225463052809312700">कैमरा चालू करें</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' हटाएं</translation>
 <translation id="528192093759286357">फ़ुल स्क्रीन से बाहर निकलने के लिए ऊपर से खींचें और वापस जाएं स्पर्श करें.</translation>
 <translation id="5300589172476337783">दिखाएं</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 कुकी इस्तेमाल की जा रही है}one{# कुकी इस्तेमाल की जा रही है}other{# कुकी इस्तेमाल की जा रही हैं}}</translation>
 <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation>
 <translation id="848952951823693243">हमेशा साइट के मोबाइल व्यू का अनुरोध करें</translation>
-<translation id="8499083585497694743">माइक्रोफ़ोन को अनम्यूट करें</translation>
 <translation id="851751545965956758">साइटों को डिवाइस से कनेक्ट होने से रोकें</translation>
 <translation id="8525306231823319788">फ़ुल स्‍क्रीन</translation>
 <translation id="857943718398505171">अनुमति दी गई (सुझाया गया)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
index 12a9c03e..a1b795b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Da bi aplikacija <ph name="APP_NAME" /> mogla koristiti proširenu stvarnost, uključite kameru i u <ph name="BEGIN_LINK" />Androidovim postavkama<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Izvor: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Pristup lokaciji isključen je za ovaj uređaj. Uključite ga u <ph name="BEGIN_LINK" />postavkama Androida<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Prekini vezu</translation>
 <translation id="1919345977826869612">Oglasi</translation>
 <translation id="1919950603503897840">Odabir kontakata</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Napusti</translation>
 <translation id="2687403674020088961">Blokiranje svih kolačića (ne preporučuje se)</translation>
 <translation id="2704606927547763573">Kopirano</translation>
-<translation id="2713106313042589954">Isključi kameru</translation>
 <translation id="2717722538473713889">E-adrese</translation>
 <translation id="2750481671343847896">Web-lokacije mogu prikazivati upite za prijavu usluga za identitet.</translation>
 <translation id="2785051990912111074">Izbrisat će se kolačići za web-lokaciju <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Web-lokacije moraju tražiti dopuštenje za pristup kameri (preporučeno)</translation>
 <translation id="4505788138578415521">URL je proširen</translation>
 <translation id="4534723447064627427">Da bi aplikacija <ph name="APP_NAME" /> mogla pristupiti vašem mikrofonu, uključite mikrofon i u <ph name="BEGIN_LINK" />Androidovim postavkama<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Isključi mikrofon</translation>
 <translation id="4570913071927164677">Pojedinosti</translation>
 <translation id="4645575059429386691">Upravlja tvoj roditelj</translation>
 <translation id="4670064810192446073">Virtualna stvarnost</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opcija je dostupna pri vrhu zaslona</translation>
 <translation id="5197729504361054390">Kontakti koje odaberete podijelit će se s web-lokacijom <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Posljednji posjet bio je danas</translation>
-<translation id="5225463052809312700">Uključi fotoaparat</translation>
 <translation id="5264323282659631142">Ukloni '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Povucite od vrha zaslona i dodirnite gumb Natrag da biste zatvorili prikaz na cijelom zaslonu.</translation>
 <translation id="5300589172476337783">Prikaži</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Koristi se jedan kolačić}one{Koristi se # kolačić}few{Koriste se # kolačića}other{Koristi se # kolačića}}</translation>
 <translation id="8487700953926739672">Dostupno izvanmrežno</translation>
 <translation id="848952951823693243">Uvijek zahtijevaj web-lokaciju za mobilne uređaje</translation>
-<translation id="8499083585497694743">Uključi mikrofon</translation>
 <translation id="851751545965956758">Blokiraj povezivanje web-lokacija s uređajima</translation>
 <translation id="8525306231823319788">Cijeli zaslon</translation>
 <translation id="857943718398505171">Dopušteno (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
index 9ac81b3..72a0305 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Ahhoz, hogy a(z) <ph name="APP_NAME" /> használhassa az AR-t, a kamerát az <ph name="BEGIN_LINK" />Android-beállítások<ph name="END_LINK" /> között is be kell kapcsolni.</translation>
 <translation id="1864927262126810325">Forrás: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">A helyhozzáférés ki van kapcsolva ennél az eszköznél. A funkciót az <ph name="BEGIN_LINK" />Android-beállításokban<ph name="END_LINK" /> tudja bekapcsolni.</translation>
-<translation id="1915307458270490472">Hívás befejezése</translation>
 <translation id="1919345977826869612">Hirdetések</translation>
 <translation id="1919950603503897840">Névjegyek kiválasztása</translation>
 <translation id="1923695749281512248"><ph name="FILE_SIZE_WITH_UNITS" /> / <ph name="BYTES_DOWNLOADED_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Lap elhagyása</translation>
 <translation id="2687403674020088961">Az összes cookie letiltása (nem ajánlott)</translation>
 <translation id="2704606927547763573">Másolt</translation>
-<translation id="2713106313042589954">Kamera kikapcsolása</translation>
 <translation id="2717722538473713889">E-mail-címek</translation>
 <translation id="2750481671343847896">A webhelyek megjeleníthetnek identitásszolgáltatásoktól származó bejelentkezési értesítéseket.</translation>
 <translation id="2785051990912111074">Ezzel törli a(z) <ph name="WEBSITE" /> webhelyhez tartozó cookie-kat.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a kamera használatát (ajánlott)</translation>
 <translation id="4505788138578415521">URL kibontva</translation>
 <translation id="4534723447064627427">Ahhoz, hogy a(z) <ph name="APP_NAME" /> hozzáférhessen a mikrofonhoz, a mikrofont az <ph name="BEGIN_LINK" />Android-beállítások<ph name="END_LINK" /> között is be kell kapcsolni.</translation>
-<translation id="4566417217121906555">Mikrofon némítása</translation>
 <translation id="4570913071927164677">Részletek</translation>
 <translation id="4645575059429386691">A szülő kezeli</translation>
 <translation id="4670064810192446073">Virtuális valóság</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">A lehetőség a képernyő tetején található</translation>
 <translation id="5197729504361054390">A kiválasztott névjegyeket megosztjuk a következő webhellyel: <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Utolsó látogatás: ma</translation>
-<translation id="5225463052809312700">Kamera bekapcsolása</translation>
 <translation id="5264323282659631142">„<ph name="CHIP_LABEL" />“ eltávolítása</translation>
 <translation id="528192093759286357">A teljes képernyős megjelenítésből való kilépéshez húzza le felülről, majd koppintson a vissza gombra.</translation>
 <translation id="5300589172476337783">Megjelenítés</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie van használatban}other{# cookie van használatban}}</translation>
 <translation id="8487700953926739672">Offline elérhető</translation>
 <translation id="848952951823693243">Mindig a mobilwebhely kérése</translation>
-<translation id="8499083585497694743">Mikrofon némításának feloldása</translation>
 <translation id="851751545965956758">Az eszközökhöz való csatlakozás megtiltása a webhelyeknek</translation>
 <translation id="8525306231823319788">Teljes képernyő</translation>
 <translation id="857943718398505171">Engedélyezve (ajánlott)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
index d784d95..2e0309e4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />-ին AR ռեժիմն օգտագործելու թույլտվություն տալու համար միացրեք նաև տեսախցիկը <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />։</translation>
 <translation id="1864927262126810325">Աղբյուրը՝ <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Սարքի տեղորոշումն անջատված է: Միացրեք այն <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />:</translation>
-<translation id="1915307458270490472">Փակել</translation>
 <translation id="1919345977826869612">Գովազդ</translation>
 <translation id="1919950603503897840">Ընտրեք կոնտակտներ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Դուրս գալ էջից</translation>
 <translation id="2687403674020088961">Արգելափակել բոլոր քուքիները (խորհուրդ չի տրվում)</translation>
 <translation id="2704606927547763573">Պատճենվեց</translation>
-<translation id="2713106313042589954">Անջատել տեսախցիկը</translation>
 <translation id="2717722538473713889">Էլ․ հասցեներ</translation>
 <translation id="2750481671343847896">Կայքերը կարող են ցույց տալ նույնականացման ծառայությունների մուտքի հարցումներ։</translation>
 <translation id="2785051990912111074">Այս կայքի (<ph name="WEBSITE" />) քուքիները կջնջվեն</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Հարցնել նախքան ձեր տեսախցիկը կայքերին հասանելի դարձնելը (խորհուրդ է տրվում)</translation>
 <translation id="4505788138578415521">URL-ը ծավալվել է</translation>
 <translation id="4534723447064627427">Որպեսզի խոսափողը հասանելի դառնա <ph name="APP_NAME" />-ին, միացրեք այն <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />։</translation>
-<translation id="4566417217121906555">Անջատել խոսափողը</translation>
 <translation id="4570913071927164677">Մանրամասներ</translation>
 <translation id="4645575059429386691">Կառավարվում է ձեր ծնողի կողմից</translation>
 <translation id="4670064810192446073">Վիրտուալ իրականություն</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Գործողությունը հասանելի է էկրանի վերին մասում</translation>
 <translation id="5197729504361054390">Ձեր ընտրած կոնտակտները հասանելի կդառնան <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> կայքին:</translation>
 <translation id="5216942107514965959">Վերջին այցելությունը՝ այսօր</translation>
-<translation id="5225463052809312700">Միացնել տեսախցիկը</translation>
 <translation id="5264323282659631142">Հեռացնել «<ph name="CHIP_LABEL" />» չիպը</translation>
 <translation id="528192093759286357">Լիաէկրան ռեժիմից դուրս գալու համար քաշեք վերևից և հպեք «Հետ» կոճակին:</translation>
 <translation id="5300589172476337783">Ցույց տալ</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 օգտագործվող քուքի}one{# օգտագործվող քուքի}other{# օգտագործվող քուքի}}</translation>
 <translation id="8487700953926739672">Մատչելի է անցանց ռեժիմում</translation>
 <translation id="848952951823693243">Միշտ պահանջել կայքի բջջային տարբերակը</translation>
-<translation id="8499083585497694743">Միացնել խոսափողը</translation>
 <translation id="851751545965956758">Արգելել կայքերին միանալ սարքերին</translation>
 <translation id="8525306231823319788">Լիաէկրան</translation>
 <translation id="857943718398505171">Թույլատրված է (հանձնարարելի)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
index 24cb028..c8936a3b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Untuk mengizinkan <ph name="APP_NAME" /> menggunakan Augmented Reality (AR), aktifkan juga kamera di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Dari <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Akses lokasi dinonaktifkan untuk perangkat ini. Aktifkan di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Akhiri</translation>
 <translation id="1919345977826869612">Iklan</translation>
 <translation id="1919950603503897840">Pilih kontak</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Keluar</translation>
 <translation id="2687403674020088961">Blokir semua cookie (tidak direkomendasikan)</translation>
 <translation id="2704606927547763573">Disalin</translation>
-<translation id="2713106313042589954">Nonaktifkan kamera</translation>
 <translation id="2717722538473713889">Alamat email</translation>
 <translation id="2750481671343847896">Situs dapat menampilkan perintah login dari layanan identitas.</translation>
 <translation id="2785051990912111074">Pilihan ini akan menghapus cookie untuk <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Minta izin terlebih dahulu sebelum memungkinkan situs menggunakan kamera Anda (disarankan)</translation>
 <translation id="4505788138578415521">URL ditampilkan penuh</translation>
 <translation id="4534723447064627427">Untuk mengizinkan <ph name="APP_NAME" /> mengakses mikrofon, aktifkan juga mikrofon di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Nonaktifkan mikrofon</translation>
 <translation id="4570913071927164677">Detail</translation>
 <translation id="4645575059429386691">Dikelola oleh orang tua Anda</translation>
 <translation id="4670064810192446073">Virtual reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opsi tersedia di dekat bagian atas layar</translation>
 <translation id="5197729504361054390">Kontak yang Anda pilih akan dibagikan dengan <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Terakhir dibuka hari ini</translation>
-<translation id="5225463052809312700">Aktifkan kamera</translation>
 <translation id="5264323282659631142">Hapus '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Tarik dari atas dan ketuk tombol kembali untuk keluar dari mode layar penuh.</translation>
 <translation id="5300589172476337783">Tampilkan</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Blokir situs agar tidak menggunakan perangkat dan data virtual reality Anda</translation>
 <translation id="6447842834002726250">Cookie</translation>
+<translation id="6467852467360539617">Hapus data &amp; reset izin</translation>
 <translation id="6527303717912515753">Bagikan</translation>
 <translation id="6545864417968258051">Pemindaian Bluetooth</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya diblokir}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya diblokir}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> dan <ph name="PERMISSION_2" /> diizinkan</translation>
 <translation id="7302486331832100261">Anda biasanya memblokir notifikasi. Untuk mengizinkan, ketuk Detail.</translation>
+<translation id="7383715096023715447">Setelan untuk <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Tanyakan dulu</translation>
 <translation id="7423538860840206698">Diblokir agar tidak membaca papan klip</translation>
 <translation id="7425915948813553151">Tema gelap untuk situs</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie sedang digunakan}other{# cookie sedang digunakan}}</translation>
 <translation id="8487700953926739672">Tersedia secara offline</translation>
 <translation id="848952951823693243">Selalu minta situs seluler</translation>
-<translation id="8499083585497694743">Aktifkan mikrofon</translation>
 <translation id="851751545965956758">Blokir situs agar tidak terhubung ke perangkat</translation>
 <translation id="8525306231823319788">Layar penuh</translation>
 <translation id="857943718398505171">Diizinkan (disarankan)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
index 301ed79..b20c6894 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Til að leyfa <ph name="APP_NAME" /> að nota AR þarftu einnig að kveikja á myndavél í <ph name="BEGIN_LINK" />stillingum Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Frá <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Slökkt er á aðgangi að staðsetningu fyrir þetta tæki. Kveiktu á honum í <ph name="BEGIN_LINK" />stillingum Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Leggja á</translation>
 <translation id="1919345977826869612">Auglýsingar</translation>
 <translation id="1919950603503897840">Velja tengiliði</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Yfirgefa</translation>
 <translation id="2687403674020088961">Loka á öll fótspor (ekki mælt með)</translation>
 <translation id="2704606927547763573">Afritað</translation>
-<translation id="2713106313042589954">Slökkva á myndavél</translation>
 <translation id="2717722538473713889">Netföng</translation>
 <translation id="2750481671343847896">Vefsvæði geta nú birt innskráningartilkynningar frá auðkenningarþjónustum.</translation>
 <translation id="2785051990912111074">Þetta val hreinsar fótspor fyrir <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Spyrja áður en vefsvæðum er veitt heimild til að nota myndavélina þína (ráðlagt)</translation>
 <translation id="4505788138578415521">Öll vefslóðin</translation>
 <translation id="4534723447064627427">Til að veita <ph name="APP_NAME" /> aðgang að hljóðnemanum þarftu einnig að kveikja á honum í <ph name="BEGIN_LINK" />stillingum Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Slökkva á hljóðnema</translation>
 <translation id="4570913071927164677">Nánar</translation>
 <translation id="4645575059429386691">Stjórnað af foreldri þínu</translation>
 <translation id="4670064810192446073">Sýndarveruleiki</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Valkosturinn er við efri brún skjásins</translation>
 <translation id="5197729504361054390">Tengiliðunum sem þú valdir verður deilt með <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Síðast opnað í dag</translation>
-<translation id="5225463052809312700">Kveikja á myndavél</translation>
 <translation id="5264323282659631142">Fjarlægja „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Dragðu ofan frá og snertu bakkhnappinn til að hætta birtingu á öllum skjánum.</translation>
 <translation id="5300589172476337783">Sýna</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Loka á að vefsvæði fái að nota sýndarveruleikatækið og -gögnin þín</translation>
 <translation id="6447842834002726250">Fótspor</translation>
+<translation id="6467852467360539617">Hreinsa gögn og endurstilla heimildir</translation>
 <translation id="6527303717912515753">Deila</translation>
 <translation id="6545864417968258051">Bluetooth-leit</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Lokað er fyrir „<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}one{Lokað er fyrir „<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}other{Lokað er fyrir „<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> valin</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> leyft</translation>
 <translation id="7302486331832100261">Þú lokar yfirleitt á tilkynningar. Ýttu á „Upplýsingar“ til að leyfa þær.</translation>
+<translation id="7383715096023715447">Stillingar fyrir <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Spyrja fyrst</translation>
 <translation id="7423538860840206698">Lokað fyrir lestur klippiborðs</translation>
 <translation id="7425915948813553151">Dökkt þema fyrir vefsvæði</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 fótspor í notkun}one{# fótspor í notkun}other{# fótspor í notkun}}</translation>
 <translation id="8487700953926739672">Í boði án nettengingar</translation>
 <translation id="848952951823693243">Biðja alltaf um símaútgáfu vefsvæða</translation>
-<translation id="8499083585497694743">Kveikja á hljóðnema</translation>
 <translation id="851751545965956758">Ekki leyfa vefsvæðum að tengjast tækjum</translation>
 <translation id="8525306231823319788">Allur skjárinn</translation>
 <translation id="857943718398505171">Leyft (ráðlagt)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
index 4c7ced2..b557ea4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Per consentire all'app <ph name="APP_NAME" /> di utilizzare la realtà aumentata, attiva la fotocamera anche nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Da <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">L'accesso alla posizione è disattivato per questo dispositivo. Attivalo nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Chiudi</translation>
 <translation id="1919345977826869612">Annunci</translation>
 <translation id="1919950603503897840">Seleziona contatti</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> di <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Esci</translation>
 <translation id="2687403674020088961">Blocca tutti i cookie (non consigliato)</translation>
 <translation id="2704606927547763573">Copiata</translation>
-<translation id="2713106313042589954">Disattiva fotocamera</translation>
 <translation id="2717722538473713889">Indirizzi email</translation>
 <translation id="2750481671343847896">I siti possono mostrare richieste di accesso da servizi di identità.</translation>
 <translation id="2785051990912111074">Questa selezione cancellerà i cookie per <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Chiedi conferma prima di consentire ai siti di utilizzare la fotocamera (opzione consigliata)</translation>
 <translation id="4505788138578415521">URL espanso</translation>
 <translation id="4534723447064627427">Per consentire all'app <ph name="APP_NAME" /> di accedere al tuo microfono, devi attivare il microfono anche nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Disattiva microfono</translation>
 <translation id="4570913071927164677">Dettagli</translation>
 <translation id="4645575059429386691">Gestito da un genitore</translation>
 <translation id="4670064810192446073">Realtà virtuale</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opzione disponibile nella parte superiore dello schermo</translation>
 <translation id="5197729504361054390">I contatti che selezioni verranno condivisi con <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Ultima visita: oggi</translation>
-<translation id="5225463052809312700">Attiva fotocamera</translation>
 <translation id="5264323282659631142">Rimuovi "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Trascina dall'alto e tocca il pulsante Indietro per uscire dalla modalità a schermo intero.</translation>
 <translation id="5300589172476337783">Mostra</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Impedisci ai siti di usare i dati e dispositivi della realtà virtuale</translation>
 <translation id="6447842834002726250">Cookie</translation>
+<translation id="6467852467360539617">Cancella i dati e reimposta le autorizzazioni</translation>
 <translation id="6527303717912515753">Condividi</translation>
 <translation id="6545864417968258051">Scansione Bluetooth</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Bloccate: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> altra}other{Bloccate: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e altre <ph name="NUM_MORE" />}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elementi selezionati</translation>
 <translation id="7260727271532453612">Autorizzazioni <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /> consentite</translation>
 <translation id="7302486331832100261">Di solito blocchi le notifiche. Per consentirle, tocca Dettagli.</translation>
+<translation id="7383715096023715447">Impostazioni di <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Chiedi prima</translation>
 <translation id="7423538860840206698">Lettura degli appunti non consentita</translation>
 <translation id="7425915948813553151">Tema scuro per i siti</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie in uso}other{# cookie in uso}}</translation>
 <translation id="8487700953926739672">Disponibile offline</translation>
 <translation id="848952951823693243">Richiedi sempre sito per dispositivi mobili</translation>
-<translation id="8499083585497694743">Riattiva microfono</translation>
 <translation id="851751545965956758">Impedisci ai siti di connettersi ai dispositivi</translation>
 <translation id="8525306231823319788">Schermo intero</translation>
 <translation id="857943718398505171">Consentita (opzione consigliata)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
index e2dcade..2ec0ff8 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">‏כדי לאפשר ל-<ph name="APP_NAME" /> להשתמש ב-AR, צריך להפעיל את המצלמה גם ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">מקור: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">‏הגישה למיקום כבויה בשביל המכשיר הזה. יש להפעיל אותה ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">ניתוק</translation>
 <translation id="1919345977826869612">מודעות</translation>
 <translation id="1919950603503897840">בחירת אנשי קשר</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">יציאה</translation>
 <translation id="2687403674020088961">‏חסימה של כל קובצי ה-cookie (לא מומלץ)</translation>
 <translation id="2704606927547763573">הועתק</translation>
-<translation id="2713106313042589954">השבתת המצלמה</translation>
 <translation id="2717722538473713889">כתובות אימייל</translation>
 <translation id="2750481671343847896">אתרים יכולים להציג בקשות כניסה משירותי זיהוי</translation>
 <translation id="2785051990912111074">‏הבחירה הזו תגרום לניקוי קובצי ה-cookie של <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">יש לשאול לפני שמאפשרים לאתרים להשתמש במצלמה שלך (מומלץ)</translation>
 <translation id="4505788138578415521">‏כתובת ה-URL הורחבה</translation>
 <translation id="4534723447064627427">‏כדי לאפשר ל-<ph name="APP_NAME" /> לגשת אל המיקרופון, צריך להפעיל את המיקרופון גם ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">השתקת המיקרופון</translation>
 <translation id="4570913071927164677">פרטים</translation>
 <translation id="4645575059429386691">מנוהל על-ידי ההורה שלך</translation>
 <translation id="4670064810192446073">מציאות מדומה</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">האפשרות זמינה בחלק העליון של המסך</translation>
 <translation id="5197729504361054390">אנשי הקשר שייבחרו ישותפו עם <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">הכניסה האחרונה בוצעה היום</translation>
-<translation id="5225463052809312700">הפעלת המצלמה</translation>
 <translation id="5264323282659631142">הסרת '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">כדי לצאת ממסך מלא, יש לגרור מלמעלה ולגעת בלחצן 'הקודם'.</translation>
 <translation id="5300589172476337783">הצגה</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{‏קובץ cookie אחד נמצא בשימוש}two{‏# קובצי cookie נמצאים בשימוש}many{‏# קובצי cookie נמצאים בשימוש}other{‏# קובצי cookie נמצאים בשימוש}}</translation>
 <translation id="8487700953926739672">זמין אופליין</translation>
 <translation id="848952951823693243">תמיד תוצג בקשה לגרסת האתר לנייד</translation>
-<translation id="8499083585497694743">ביטול של השתקת המיקרופון</translation>
 <translation id="851751545965956758">חסימת התחברות של אתרים אל התקנים</translation>
 <translation id="8525306231823319788">מסך מלא</translation>
 <translation id="857943718398505171">מותרת (מומלץ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
index b2c2718..39d583c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> に AR の使用を許可するには、<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />でもカメラをオンにしてください。</translation>
 <translation id="1864927262126810325">ソース: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">位置情報へのアクセスがデバイスでオフになっています。<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />でオンにしてください。</translation>
-<translation id="1915307458270490472">通話を終了</translation>
 <translation id="1919345977826869612">広告</translation>
 <translation id="1919950603503897840">連絡先を選択</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">このページを離れる</translation>
 <translation id="2687403674020088961">すべての Cookie をブロックする(推奨されません)</translation>
 <translation id="2704606927547763573">コピーしました</translation>
-<translation id="2713106313042589954">カメラをオフにする</translation>
 <translation id="2717722538473713889">メールアドレス</translation>
 <translation id="2750481671343847896">サイトで ID サービスからのログイン メッセージを表示できるようにします。</translation>
 <translation id="2785051990912111074">これを選択すると、<ph name="WEBSITE" /> の Cookie が消去されます</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">サイトにカメラの使用を許可する前に確認する(推奨)</translation>
 <translation id="4505788138578415521">URL のフルバージョンです</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> にマイクへのアクセスを許可するには、<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />でもマイクをオンにしてください。</translation>
-<translation id="4566417217121906555">マイクをミュート</translation>
 <translation id="4570913071927164677">詳細</translation>
 <translation id="4645575059429386691">保護者により管理されています</translation>
 <translation id="4670064810192446073">バーチャル リアリティ(VR)</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">設定は画面上部にあります</translation>
 <translation id="5197729504361054390">選択した連絡先が <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> と共有されます。</translation>
 <translation id="5216942107514965959">最終アクセス日: 今日</translation>
-<translation id="5225463052809312700">カメラをオンにする</translation>
 <translation id="5264323282659631142"><ph name="CHIP_LABEL" /> を削除</translation>
 <translation id="528192093759286357">全画面表示を終了するには、上からドラッグして、戻るボタンをタップします。</translation>
 <translation id="5300589172476337783">表示</translation>
@@ -342,7 +338,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 個の Cookie が使用中です}other{# 個の Cookie が使用中です}}</translation>
 <translation id="8487700953926739672">オフラインでの利用</translation>
 <translation id="848952951823693243">常にモバイル版サイトを表示する</translation>
-<translation id="8499083585497694743">マイクのミュートを解除</translation>
 <translation id="851751545965956758">サイトからデバイスへの接続をブロックする</translation>
 <translation id="8525306231823319788">全画面表示</translation>
 <translation id="857943718398505171">許可(推奨)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
index 94f1373..d2794c0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />-მა AR რომ გამოიყენოს, გაააქტიურეთ კამერაზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">წყარო: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">მდებარეობაზე წვდომა გამორთულია ამ მოწყობილობისთვის. ჩართეთ ის <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">გათიშვა</translation>
 <translation id="1919345977826869612">რეკლამა</translation>
 <translation id="1919950603503897840">კონტაქტების არჩევა</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" />დან</translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">დატოვება</translation>
 <translation id="2687403674020088961">ყველა ქუქი-ჩანაწერის დაბლოკვა (არარეკომენდებული)</translation>
 <translation id="2704606927547763573">დაკოპირდა</translation>
-<translation id="2713106313042589954">კამერის გამორთვა</translation>
 <translation id="2717722538473713889">ელფოსტის მისამართები</translation>
 <translation id="2750481671343847896">საიტებს შეუძლია სისტემაში შესვლის მოთხოვნების ჩვენება პირადობის მონაცემების სერვისებიდან.</translation>
 <translation id="2785051990912111074">ეს არჩევანი გაასუფთავებს ქუქი-ჩანაწერებს <ph name="WEBSITE" />-ისთვის</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">შეკითხვა საიტებისთვის თქვენი კამერის გამოყენების დაშვებამდე (რეკომენდებული)</translation>
 <translation id="4505788138578415521">URL გაშლილია</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" />-მა მიკროფონით რომ ისარგებლოს, გაააქტიურეთ მიკროფონზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">მიკროფონის დადუმება</translation>
 <translation id="4570913071927164677">დეტალები</translation>
 <translation id="4645575059429386691">იმართება თქვენი მშობლის მიერ</translation>
 <translation id="4670064810192446073">ვირტუალური რეალობა</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ვარიანტი ხელმისაწვდომია ეკრანის ზედა ნაწილთან</translation>
 <translation id="5197729504361054390">თქვენ მიერ არჩეული კონტაქტები გაზიარდება <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />-თან.</translation>
 <translation id="5216942107514965959">ბოლო ვიზიტი იყო დღეს</translation>
-<translation id="5225463052809312700">კამერის ჩართვა</translation>
 <translation id="5264323282659631142">„<ph name="CHIP_LABEL" />“-ის ამოშლა</translation>
 <translation id="528192093759286357">სრულეკრანიანი რეჟიმიდან გამოსასვლელად, გაუსვით ეკრანს თითი ზემოდან ქვემოთ და შეეხეთ ღილაკს „უკან“.</translation>
 <translation id="5300589172476337783">ჩვენება</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{გამოიყენება 1 ქუქი-ჩანაწერი}other{გამოიყენება # ქუქი-ჩანაწერი}}</translation>
 <translation id="8487700953926739672">ოფლაინში ხელმისაწვდომი</translation>
 <translation id="848952951823693243">საიტის მობილურის ვერსიის ყოველთვის მოთხოვნა</translation>
-<translation id="8499083585497694743">მიკროფონის დადუმების მოხსნა</translation>
 <translation id="851751545965956758">საიტებისთვის მოწყობილობებთან დაკავშირების აკრძალვა</translation>
 <translation id="8525306231823319788">მთელ ეკრანზე</translation>
 <translation id="857943718398505171">დაშვებული (რეკომენდებულია)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
index ab315cd6..2484907 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> браузеріне AR режимін пайдалануға рұқсат ету үшін <ph name="BEGIN_LINK" />Android параметрлерінде<ph name="END_LINK" /> камераны да қосыңыз.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> дереккөзінен</translation>
 <translation id="1887786770086287077">Бұл құрылғыда орынды анықтау қызметі өшірулі. Оны <ph name="BEGIN_LINK" />Android параметрлері<ph name="END_LINK" /> арқылы қосыңыз.</translation>
-<translation id="1915307458270490472">Жабу</translation>
 <translation id="1919345977826869612">Жарнамалар</translation>
 <translation id="1919950603503897840">Контактілерді таңдау</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Шығу</translation>
 <translation id="2687403674020088961">Барлық cookie файлын бөгеу (ұсынылмайды)</translation>
 <translation id="2704606927547763573">Көшірілген</translation>
-<translation id="2713106313042589954">Камераны өшіру</translation>
 <translation id="2717722538473713889">электрондық пошта мекенжайлары</translation>
 <translation id="2750481671343847896">Сайттар идентификация қызметтері жіберген аккаунтқа кіру хабарларын көрсетуі мүмкін.</translation>
 <translation id="2785051990912111074"><ph name="WEBSITE" /> веб-сайтының cookie файлдары жойылады.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Сайттар камераңызды пайдалану үшін рұқсат сұрайды (ұсынылады)</translation>
 <translation id="4505788138578415521">URL жайылды</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> браузері микрофонды пайдалануы үшін, <ph name="BEGIN_LINK" />Android параметрлерінде<ph name="END_LINK" /> оны да қосыңыз.</translation>
-<translation id="4566417217121906555">Микрофон дыбысын өшіру</translation>
 <translation id="4570913071927164677">Мәліметтер</translation>
 <translation id="4645575059429386691">Ата-ана басқарады</translation>
 <translation id="4670064810192446073">Виртуалдық шындық</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Опциялар экранның жоғарғы жағында тұрады</translation>
 <translation id="5197729504361054390">Сіз таңдаған контактілер <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> сайтымен бөлісіледі.</translation>
 <translation id="5216942107514965959">Соңғы кіру: бүгін</translation>
-<translation id="5225463052809312700">Камераны қосу</translation>
 <translation id="5264323282659631142">"<ph name="CHIP_LABEL" />" өшіру</translation>
 <translation id="528192093759286357">Толық экраннан шығу үшін үстіңгі жақтан сүйреп, "Артқа" түймесін түртіңіз.</translation>
 <translation id="5300589172476337783">Көрсету</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Сайттардың виртуалдық шындық құрылғыңызды және деректеріңізді пайдалануына тыйым салу</translation>
 <translation id="6447842834002726250">Cookie файлдары</translation>
+<translation id="6467852467360539617">Деректерді өшіру және рұқсаттарды бастапқы күйіне қайтару</translation>
 <translation id="6527303717912515753">Бөлісу</translation>
 <translation id="6545864417968258051">Bluetooth құрылғыларын іздеу</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" /> қызметті пайдалануға тыйым салынған.}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" /> қызметті пайдалануға тыйым салынған.}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> таңдалды</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> және <ph name="PERMISSION_2" /> үшін рұқсат етілген.</translation>
 <translation id="7302486331832100261">Әдетте хабарландыруларға тыйым саласыз. Рұқсат беру үшін "Мәліметтер" түймесін түртіңіз.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> параметрлері</translation>
 <translation id="7423098979219808738">Алдымен сұрау</translation>
 <translation id="7423538860840206698">Буфердегі мазмұнды оқуға тыйым салынған</translation>
 <translation id="7425915948813553151">Сайттар үшін қараңғы режим</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie файлы қолданылып жатыр}other{# cookie файлы қолданылып жатыр}}</translation>
 <translation id="8487700953926739672">Желіден тыс істейді</translation>
 <translation id="848952951823693243">Әрдайым сайттың мобильдік нұсқасын сұрау</translation>
-<translation id="8499083585497694743">Микрофон дыбысын қосу</translation>
 <translation id="851751545965956758">Сайттардың құрылғыға жалғануына тыйым салу</translation>
 <translation id="8525306231823319788">Толық экран</translation>
 <translation id="857943718398505171">Рұқсат етілген (ең дұрысы)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
index 23b03a7..b1b05a4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">ដើម្បី​អនុញ្ញាតឱ្យ <ph name="APP_NAME" /> ប្រើ AR អ្នកក៏ត្រូវបើក​កាមេរ៉ា​នៅក្នុង​<ph name="BEGIN_LINK" />ការកំណត់ Android<ph name="END_LINK" /> ផងដែរ។</translation>
 <translation id="1864927262126810325">ពី <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">ការចូល​ប្រើ​ទីតាំងត្រូវបាន​បិទ​សម្រាប់​ឧបករណ៍​នេះ។ សូម​បើក​វា​នៅក្នុង<ph name="BEGIN_LINK" />ការ​កំណត់ Android<ph name="END_LINK" /> ។</translation>
-<translation id="1915307458270490472">បញ្ចប់​ការ​សន្ទនា</translation>
 <translation id="1919345977826869612">ពាណិជ្ជកម្ម</translation>
 <translation id="1919950603503897840">ជ្រើសរើស​ទំនាក់ទំនង</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ចាកចេញ</translation>
 <translation id="2687403674020088961">ទប់ស្កាត់ខូគីទាំងអស់ (មិនណែនាំ)</translation>
 <translation id="2704606927547763573">បានថតចម្លង</translation>
-<translation id="2713106313042589954">បិទកាមេរ៉ា</translation>
 <translation id="2717722538473713889">អាសយដ្ឋានអ៊ីមែល</translation>
 <translation id="2750481671343847896">គេហទំព័រអាចបង្ហាញសារចូលគណនីពីសេវាកម្មដែលសួររកអត្តសញ្ញាណ។</translation>
 <translation id="2785051990912111074">ជម្រើសនេះនឹងសម្អាតខូគីសម្រាប់ <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">សួរជាមុនសិន មុនពេលអនុញ្ញាតឲ្យគេហទំព័រប្រើកាមេរ៉ារបស់អ្នក (បានណែនាំ)</translation>
 <translation id="4505788138578415521">បានពង្រីក URL</translation>
 <translation id="4534723447064627427">ដើម្បីអនុញ្ញាតឱ្យ <ph name="APP_NAME" /> ចូលប្រើមីក្រូហ្វូន​របស់អ្នក អ្នកក៏ត្រូវបើក​មីក្រូហ្វូន​នៅក្នុង​<ph name="BEGIN_LINK" />ការកំណត់ Android<ph name="END_LINK" /> ផងដែរ។</translation>
-<translation id="4566417217121906555">បិទ​សំឡេង​មីក្រូហ្វូន</translation>
 <translation id="4570913071927164677">ព័ត៌មាន​លម្អិត</translation>
 <translation id="4645575059429386691">គ្រប់គ្រងដោយឪពុកម្តាយរបស់អ្នក</translation>
 <translation id="4670064810192446073">VR</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ជម្រើសមាន​នៅជិតផ្នែក​ខាងលើ​នៃអេក្រង់</translation>
 <translation id="5197729504361054390">ទំនាក់ទំនងដែលអ្នកជ្រើសរើស​នឹងចែករំលែកជាមួយ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ។</translation>
 <translation id="5216942107514965959">បានចូលមើល​លើកចុងក្រោយ​នៅថ្ងៃនេះ</translation>
-<translation id="5225463052809312700">បើកកាមេរ៉ា</translation>
 <translation id="5264323282659631142">លុប '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">អូសពីលើ ហើយប៉ះប៊ូតុងថយក្រោយដើម្បីចេញពីរបៀបពេញអេក្រង់។</translation>
 <translation id="5300589172476337783">បង្ហាញ</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{កំពុងប្រើខូគី 1}other{កំពុងប្រើខូគី #}}</translation>
 <translation id="8487700953926739672">មាននៅក្រៅបណ្តាញ</translation>
 <translation id="848952951823693243">ស្នើគេហទំព័រសម្រាប់ឧបករណ៍ចល័តជានិច្ច</translation>
-<translation id="8499083585497694743">បើក​សំឡេង​មីក្រូហ្វូន</translation>
 <translation id="851751545965956758">ទប់​ស្កាត់​ទំព័រ​មិន​ឱ្យ​ភ្ជាប់​ជាមួយ​ឧបករណ៍</translation>
 <translation id="8525306231823319788">ពេញអេក្រង់</translation>
 <translation id="857943718398505171">បានអនុញ្ញាត (បានណែនាំ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
index a70b141e..f13c785 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">AR ಬಳಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿ ನೀಡುವುದಕ್ಕಾಗಿ, <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಕ್ಯಾಮರಾವನ್ನು ಸಹ ಆನ್ ಮಾಡಿ.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> ನಿಂದ</translation>
 <translation id="1887786770086287077">ಈ ಸಾಧನದ ಸ್ಥಳ ಪ್ರವೇಶ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation>
-<translation id="1915307458270490472">ಹ್ಯಾಂಗ್ ಅಪ್ ಮಾಡಿ</translation>
 <translation id="1919345977826869612">ಜಾಹೀರಾತುಗಳು</translation>
 <translation id="1919950603503897840">ಸಂಪರ್ಕಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="1923695749281512248"><ph name="FILE_SIZE_WITH_UNITS" /> ರಲ್ಲಿ <ph name="BYTES_DOWNLOADED_WITH_UNITS" /> ಡೌನ್‌ಲೋಡ್ ಆಗಿದೆ</translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ತೊರೆಯಿರಿ</translation>
 <translation id="2687403674020088961">ಎಲ್ಲಾ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ (ಇದನ್ನು ನಾವು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ)</translation>
 <translation id="2704606927547763573">ನಕಲಿಸಲಾಗಿದೆ</translation>
-<translation id="2713106313042589954">ಕ್ಯಾಮರಾ ಆಫ್ ಮಾಡಿ</translation>
 <translation id="2717722538473713889">ಇಮೇಲ್ ವಿಳಾಸಗಳು</translation>
 <translation id="2750481671343847896">ಸೈಟ್‌ಗಳು ಗುರುತಿನ ಸೇವೆಗಳ ಸೈನ್ ಇನ್ ಪ್ರಾಂಪ್ಟ್‌ಗಳನ್ನು ತೋರಿಸಬಲ್ಲವು.</translation>
 <translation id="2785051990912111074">ಈ ಆಯ್ಕೆಯು <ph name="WEBSITE" /> ನ ಕುಕೀಗಳನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="4505788138578415521">URL ಅನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್‌ಗೆ ಪ್ರವೇಶಿಸುವುದಕ್ಕೆ ಅನುಮತಿಸಲು, <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಸಹ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation>
-<translation id="4566417217121906555">ಮೈಕ್ರೋಫೋನ್‌ ಮ್ಯೂಟ್ ಮಾಡಿ</translation>
 <translation id="4570913071927164677">ವಿವರಗಳು</translation>
 <translation id="4645575059429386691">ನಿಮ್ಮ ಪೋಷಕರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ</translation>
 <translation id="4670064810192446073">ವರ್ಚುವಲ್ ರಿಯಾಲಿಟಿ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ಸ್ಕ್ರೀನ್‌ನ ಮೇಲ್ಬಾಗದ ಹತ್ತಿರದಲ್ಲಿ ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳು</translation>
 <translation id="5197729504361054390">ನೀವು ಆಯ್ಕೆ ಮಾಡುವ ಸಂಪರ್ಕಗಳನ್ನು <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation>
 <translation id="5216942107514965959">ಇಂದು ಕೊನೆಯಾದಾಗಿ ಭೇಟಿ ನೀಡಲಾಗಿದೆ</translation>
-<translation id="5225463052809312700">ಕ್ಯಾಮರಾ ಆನ್ ಮಾಡಿ</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="528192093759286357">ಪೂರ್ಣಪರದೆಯನ್ನು ನಿರ್ಗಮಿಸಲು ಮೇಲಿನಿಂದ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ ಹಾಗೂ ಹಿಂದೆ ಬಟನ್ ಸ್ಪರ್ಶಿಸಿ.</translation>
 <translation id="5300589172476337783">ತೋರಿಸಿ</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 ಕುಕಿ ಬಳಕೆಯಲ್ಲಿದೆ}one{# ಕುಕೀಗಳು ಬಳಕೆಯಲ್ಲಿವೆ}other{# ಕುಕೀಗಳು ಬಳಕೆಯಲ್ಲಿವೆ}}</translation>
 <translation id="8487700953926739672">ಆಫ್‌ಲೈನ್ ಲಭ್ಯವಿದೆ</translation>
 <translation id="848952951823693243">ಮೊಬೈಲ್ ಸೈಟ್ ಅನ್ನು ಯಾವಾಗಲೂ ವಿನಂತಿಸಿ</translation>
-<translation id="8499083585497694743">ಮೈಕ್ರೋಫೋನ್‌ ಅನ್‍ಮ್ಯೂಟ್ ಮಾಡಿ</translation>
 <translation id="851751545965956758">ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸದಂತೆ, ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
 <translation id="8525306231823319788">ಪೂರ್ಣ ಪರದೆ</translation>
 <translation id="857943718398505171">ಅನುಮತಿಸಲಾಗಿದೆ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
index 3a259de0..219f0d6 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />에서 AR을 사용하려면 <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서도 카메라를 사용 설정하세요.</translation>
 <translation id="1864927262126810325">출처: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">이 기기의 위치 액세스가 사용 중지되었습니다. <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 사용 설정하세요.</translation>
-<translation id="1915307458270490472">종료</translation>
 <translation id="1919345977826869612">광고</translation>
 <translation id="1919950603503897840">연락처 선택</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">나가기</translation>
 <translation id="2687403674020088961">모든 쿠키 차단(권장되지 않음)</translation>
 <translation id="2704606927547763573">복사됨</translation>
-<translation id="2713106313042589954">카메라 끄기</translation>
 <translation id="2717722538473713889">이메일 주소</translation>
 <translation id="2750481671343847896">사이트에서 ID 서비스의 로그인 메시지를 표시할 수 있습니다.</translation>
 <translation id="2785051990912111074"><ph name="WEBSITE" />의 쿠키가 삭제됩니다.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">사이트에서 카메라를 사용하도록 허용하기 전에 확인(권장)</translation>
 <translation id="4505788138578415521">URL 펼쳐짐</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" />에서 마이크에 액세스하도록 허용하려면 <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서도 마이크를 사용 설정하세요.</translation>
-<translation id="4566417217121906555">마이크 음소거</translation>
 <translation id="4570913071927164677">세부정보</translation>
 <translation id="4645575059429386691">부모님이 관리합니다.</translation>
 <translation id="4670064810192446073">가상 현실</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">화면 상단에서 옵션을 선택할 수 있습니다</translation>
 <translation id="5197729504361054390">선택한 연락처가 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />과(와) 공유됩니다.</translation>
 <translation id="5216942107514965959">최근 방문: 오늘</translation>
-<translation id="5225463052809312700">카메라 켜기</translation>
 <translation id="5264323282659631142">‘<ph name="CHIP_LABEL" />’ 삭제</translation>
 <translation id="528192093759286357">전체화면을 종료하려면 상단에서 드래그하여 뒤로 버튼을 터치하세요.</translation>
 <translation id="5300589172476337783">표시</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">사이트에서 내 가상 현실 기기 및 데이터를 사용하지 못하도록 차단</translation>
 <translation id="6447842834002726250">쿠키</translation>
+<translation id="6467852467360539617">데이터 삭제 및 권한 재설정</translation>
 <translation id="6527303717912515753">공유</translation>
 <translation id="6545864417968258051">블루투스 검색</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개 차단됨}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개 차단됨}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" />개 선택됨</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> 및 <ph name="PERMISSION_2" /> 허용됨</translation>
 <translation id="7302486331832100261">기본적으로 알림을 차단하는 중입니다. 허용하려면 '세부정보'를 탭하세요.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> 설정</translation>
 <translation id="7423098979219808738">우선 확인</translation>
 <translation id="7423538860840206698">클립보드 액세스가 차단됨</translation>
 <translation id="7425915948813553151">사이트에 어두운 테마 적용</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{쿠키 1개 사용 중}other{쿠키 #개 사용 중}}</translation>
 <translation id="8487700953926739672">오프라인으로 사용 가능</translation>
 <translation id="848952951823693243">항상 모바일 사이트 요청</translation>
-<translation id="8499083585497694743">마이크 음소거 해제</translation>
 <translation id="851751545965956758">사이트에서 기기에 연결하지 못하도록 차단</translation>
 <translation id="8525306231823319788">전체화면</translation>
 <translation id="857943718398505171">허용(권장)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
index 7a5e8af2..1e90da7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> колдонмосуна AR'ди колдоонуусуна уруксат берүү үчүн камераны <ph name="BEGIN_LINK" />Android жөндөөлөрүнөн<ph name="END_LINK" /> күйгүзүңүз.</translation>
 <translation id="1864927262126810325">Төмөнкүдөн: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Жайгашкан жерди аныктоо жөндөөсү бул түзмөктө өчүрүлгөн. Аны <ph name="BEGIN_LINK" />Android жөндөөлөрүнө<ph name="END_LINK" /> өтүп, күйгүзүңүз.</translation>
-<translation id="1915307458270490472">Жогоруда кадоо</translation>
 <translation id="1919345977826869612">Жарнамалар</translation>
 <translation id="1919950603503897840">Байланыштарды тандоо</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Чыгуу</translation>
 <translation id="2687403674020088961">Бардык cookie файлдарды бөгөттөө (сунушталбайт)</translation>
 <translation id="2704606927547763573">Көчүрүлдү</translation>
-<translation id="2713106313042589954">Камераны өчүрүү</translation>
 <translation id="2717722538473713889">Электрондук почта даректери</translation>
 <translation id="2750481671343847896">Сайттар идентификациялык кызматтарда кирүү сурамдарын көрсөтүшү мүмкүн.</translation>
 <translation id="2785051990912111074">Ушуну менен <ph name="WEBSITE" /> сайтынын cookie файлдары тазаланат</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Сайттар камераңызды колдоноордон мурун уруксат суралсын (сунушталат)</translation>
 <translation id="4505788138578415521">URL жайылып көрсөтүлдү</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> колдонмосуна микрофонго кирүүгө уруксат берүү үчүн, <ph name="BEGIN_LINK" />Android Жөндөөлөрүнөн<ph name="END_LINK" /> микрофонду күйгүзүңүз.</translation>
-<translation id="4566417217121906555">Микрофондун үнүн өчүрүү</translation>
 <translation id="4570913071927164677">Чоо-жайы</translation>
 <translation id="4645575059429386691">Ата-энеңиз башкарат</translation>
 <translation id="4670064810192446073">Виртуалдык дүйнө</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Параметр экрандын жогору жагында берилген</translation>
 <translation id="5197729504361054390">Сиз тандаган байланыштар <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> менен бөлүшүлөт.</translation>
 <translation id="5216942107514965959">Бүгүн акыркы жолу кирген</translation>
-<translation id="5225463052809312700">Камераны күйгүзүү</translation>
 <translation id="5264323282659631142">"<ph name="CHIP_LABEL" />" өчүрүү</translation>
 <translation id="528192093759286357">Толук экрандан чыгуу үчүн жогорудан ылдый сүйрөп келип, "Артка" деген баскычка тийип коюңуз.</translation>
 <translation id="5300589172476337783">Көрсөтүү</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Сайттарга виртуалдык чындык түзмөктөрүңүздү жана маалыматты колдонууга тыюу салуу</translation>
 <translation id="6447842834002726250">Кукилер</translation>
+<translation id="6467852467360539617">Маалыматты тазалоо жана уруксаттарды баштапкы абалга келтирүү</translation>
 <translation id="6527303717912515753">Бөлүшүү</translation>
 <translation id="6545864417968258051">Bluetooth түзмөктөрүн издөө</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" /> бөгөттөлдү}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" /> бөгөттөлдү}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> нерсе тандалды</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> жана <ph name="PERMISSION_2" /> дайындарын колдонууга уруксат берилди</translation>
 <translation id="7302486331832100261">Адатта билдирмелерди өчүрөсүз. Уруксат берүү үчүн "Чоо-жайын" таптап коюңуз.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> параметрлери</translation>
 <translation id="7423098979219808738">Адегенде сура</translation>
 <translation id="7423538860840206698">Алмашуу буферин окуу бөгөттөлгөн</translation>
 <translation id="7425915948813553151">Сайттар үчүн караңгы тема</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie файлы колдонулууда}other{# cookie файлы колдонулууда}}</translation>
 <translation id="8487700953926739672">Оффлайнда жеткиликтүү</translation>
 <translation id="848952951823693243">Мобилдик сайт ар дайым суралсын</translation>
-<translation id="8499083585497694743">Микрофондун үнүн чыгаруу</translation>
 <translation id="851751545965956758">Сайттардын түзмөктөргө туташуусун бөгөттөө</translation>
 <translation id="8525306231823319788">Толук экран</translation>
 <translation id="857943718398505171">Уруксат берилген (сунушталат)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
index b924f9d..79cdf87 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">ເພື່ອອະນຸຍາດໃຫ້ <ph name="APP_NAME" /> ໃຊ້ AR, ກະລຸນາເປີດກ້ອງໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" /> ນຳ.</translation>
 <translation id="1864927262126810325">ຈາກ <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">ການເຂົ້າເຖິງສະຖານທີ່ປິດຢູ່ສຳລັບອຸປະກອນນີ້. ກະລຸນາເປີດມັນໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">ວາງສາຍ</translation>
 <translation id="1919345977826869612">ໂຄສະນາ</translation>
 <translation id="1919950603503897840">ເລືອກລາຍຊື່ຜູ້ຕິດຕໍ່</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ອອກ​ໄປ</translation>
 <translation id="2687403674020088961">ບລັອກຄຸກກີ້ທັງໝົດ (ບໍ່ແນະນຳ)</translation>
 <translation id="2704606927547763573">ອັດ​ສຳ​ເນົາ​ແລ້ວ</translation>
-<translation id="2713106313042589954">ປິດກ້ອງຖ່າຍຮູບ</translation>
 <translation id="2717722538473713889">ທີ່ຢູ່ອີເມວ</translation>
 <translation id="2750481671343847896">ເວັບໄຊສາມາດສະແດງຂໍ້ຄວາມການເຂົ້າສູ່ລະບົບຈາກບໍລິການຕົວຕົນຕ່າງໆໄດ້.</translation>
 <translation id="2785051990912111074">ຕົວເລືອກນີ້ຈະລຶບລ້າງຄຸກກີ້ສຳລັບ <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ຖາມກ່ອນທີ່ຈະອະນຸຍາດໃຫ້ເວັບໄຊໃຊ້ກ້ອງຖ່າຍຮູບຂອງທ່ານ (ແນະນຳ)</translation>
 <translation id="4505788138578415521">ຂະຫຍາຍ URL ແລ້ວ</translation>
 <translation id="4534723447064627427">ເພື່ອອະນຸຍາດໃຫ້ <ph name="APP_NAME" /> ເຂົ້າເຖິງໄມໂຄຣໂຟນ, ກະລຸນາເປີດໄມໂຄຣໂຟນໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" /> ນຳ.</translation>
-<translation id="4566417217121906555">ປິດສຽງໄມໂຄຣໂຟນ</translation>
 <translation id="4570913071927164677">ລາຍລະອຽດ</translation>
 <translation id="4645575059429386691">ຈັດ​ການ​ໂດຍ​ຜູ້​ປົກ​ຄອງ​ຂອງ​ທ່ານ</translation>
 <translation id="4670064810192446073">ເວີຊົວ ຣິອາຣິທີ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ຕົວເລືອກມີໃຫ້ນຳໃຊ້ຢູ່ໃກ້ສ່ວນເທິງສຸດຂອງໜ້າຈໍ</translation>
 <translation id="5197729504361054390">ລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ທ່ານເລືອກຈະຖືກແບ່ງປັນກັບ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">ເຂົ້າເບິ່ງມື້ນີ້</translation>
-<translation id="5225463052809312700">ເປີດກ້ອງຖ່າຍຮູບ</translation>
 <translation id="5264323282659631142">ລຶບ '<ph name="CHIP_LABEL" />' ອອກ</translation>
 <translation id="528192093759286357">ລາກຈາກດ້ານເທິງ ແລ້ວແຕະປຸ່ມກັບຄືນ ເພື່ອອອກຈາກເຕັມຈໍ.</translation>
 <translation id="5300589172476337783">ສະ​ແດງ​</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{ມີການນຳໃຊ້ຄຸກກີ້ 1 ລາຍການ}other{ມີການນຳໃຊ້ຄຸກກີ້ # ລາຍການ}}</translation>
 <translation id="8487700953926739672">ມີອອຟລາຍນ໌ຢູ່</translation>
 <translation id="848952951823693243">ຮ້ອງຂໍເວັບໄຊມືຖືທຸກເທື່ອ</translation>
-<translation id="8499083585497694743">ເຊົາປິດສຽງໄມໂຄຣໂຟນ</translation>
 <translation id="851751545965956758">ບລັອກບໍ່ໃຫ້ເວັບໄຊເຊື່ອມຕໍ່ກັບອຸປະກອນ</translation>
 <translation id="8525306231823319788">ເຕັມຫນ້າ​ຈໍ​</translation>
 <translation id="857943718398505171">ອະ​ນຸ​ຍາດ​ແລ້ວ (ແນະ​ນຳ​ໃຫ້)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
index 1ae6584..d75bc05 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Norėdami leisti „<ph name="APP_NAME" />“ naudoti AR, taip pat įjunkite fotoaparatą <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Iš „<ph name="SOURCE_NAME" />“</translation>
 <translation id="1887786770086287077">Vietos prieiga išjungta šiame įrenginyje. Įjunkite ją skiltyje <ph name="BEGIN_LINK" />„Android“ nustatymai“<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Baigti</translation>
 <translation id="1919345977826869612">Skelbimai</translation>
 <translation id="1919950603503897840">Kontaktų pasirinkimas</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> iš <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Išeiti</translation>
 <translation id="2687403674020088961">Blokuoti visus slapukus (nerekomenduojama)</translation>
 <translation id="2704606927547763573">Nukopij.</translation>
-<translation id="2713106313042589954">Išjungti fotoaparatą</translation>
 <translation id="2717722538473713889">El. pašto adresai</translation>
 <translation id="2750481671343847896">Svetainėse gali būti rodomi raginimai prisijungti iš tapatybės nustatymo paslaugų.</translation>
 <translation id="2785051990912111074">Bus išvalyti svetainės <ph name="WEBSITE" /> slapukai</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pirmiausia klausti prieš leidžiant svetainėms naudoti kamerą (rekomenduojama)</translation>
 <translation id="4505788138578415521">URL išskleistas</translation>
 <translation id="4534723447064627427">Norėdami leisti „<ph name="APP_NAME" />“ pasiekti jūsų mikrofoną, taip pat įjunkite jį <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Nutildyti mikrofoną</translation>
 <translation id="4570913071927164677">Išsami informacija</translation>
 <translation id="4645575059429386691">Tvarko vienas iš jūsų tėvų</translation>
 <translation id="4670064810192446073">Virtualioji realybė</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Parinktis pasiekiama netoli ekrano viršaus</translation>
 <translation id="5197729504361054390">Pasirinkti kontaktai bus bendrinami su <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Paskutinį kartą lankytasi šiandien</translation>
-<translation id="5225463052809312700">Įjungti fotoaparatą</translation>
 <translation id="5264323282659631142">Pašalinti „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Vilkite žymeklį nuo viršaus ir palieskite mygtuką „Atgal“, kad išeitumėte iš viso ekrano režimo.</translation>
 <translation id="5300589172476337783">Rodyti</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Naudojamas 1 slapukas}one{Naudojamas # slapukas}few{Naudojami # slapukai}many{Naudojama # slapuko}other{Naudojama # slapukų}}</translation>
 <translation id="8487700953926739672">Pasiekiama neprisijungus</translation>
 <translation id="848952951823693243">Visada galite pateikti užklausą dėl svetainės mobiliesiems</translation>
-<translation id="8499083585497694743">Įjungti mikrofono garsą</translation>
 <translation id="851751545965956758">Blokuoti svetaines, kad nebūtų galima prisijungti prie įrenginių</translation>
 <translation id="8525306231823319788">Viso ekrano režimas</translation>
 <translation id="857943718398505171">Leidžiama (rekomenduojama)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
index ec91e6b..b4f2ca1 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Lai atļautu lietotnei <ph name="APP_NAME" /> izmantot papildināto realitāti, ieslēdziet arī kameru <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">No: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Piekļuve šīs ierīces atrašanās vietai ir izslēgta. Ieslēdziet to <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Pārtraukt</translation>
 <translation id="1919345977826869612">Reklāmas</translation>
 <translation id="1919950603503897840">Kontaktpersonu atlase</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> no <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Iziet</translation>
 <translation id="2687403674020088961">Bloķēt visus sīkfailus (nav ieteicams)</translation>
 <translation id="2704606927547763573">Nokopēts</translation>
-<translation id="2713106313042589954">Izslēgt kameru</translation>
 <translation id="2717722538473713889">E-pasta adreses</translation>
 <translation id="2750481671343847896">Vietnēs drīkst rādīt pierakstīšanās uzvednes, ko nodrošina identitātes pakalpojumi.</translation>
 <translation id="2785051990912111074">Veicot šo darbību, tiks notīrīti vietnes <ph name="WEBSITE" /> sīkfaili.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Jautāt, pirms atļaut vietnēm izmantot jūsu kameru (ieteicams)</translation>
 <translation id="4505788138578415521">URL ir izvērsts</translation>
 <translation id="4534723447064627427">Lai atļautu lietotnei <ph name="APP_NAME" /> piekļūt jūsu mikrofonam, ieslēdziet mikrofonu arī <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Izslēgt mikrofonu</translation>
 <translation id="4570913071927164677">Detalizēta informācija</translation>
 <translation id="4645575059429386691">Pārvalda viens no jūsu vecākiem</translation>
 <translation id="4670064810192446073">Virtuālā realitāte</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opcija pieejama ekrāna augšdaļā</translation>
 <translation id="5197729504361054390">Atlasīto kontaktpersonu dati tiks kopīgoti ar vietni <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Pēdējoreiz apmeklēta šodien</translation>
-<translation id="5225463052809312700">Ieslēgt kameru</translation>
 <translation id="5264323282659631142">Noņemt žetonu <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Lai izietu no pilnekrāna režīma, velciet no augšas un pieskarieties pogai Atpakaļ.</translation>
 <translation id="5300589172476337783">Rādīt</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Tiek izmantots viens sīkfails}zero{Tiek izmantoti # sīkfaili}one{Tiek izmantots # sīkfails}other{Tiek izmantoti # sīkfaili}}</translation>
 <translation id="8487700953926739672">Pieejams bezsaistē</translation>
 <translation id="848952951823693243">Vienmēr pieprasīt vietni mobilajām ierīcēm</translation>
-<translation id="8499083585497694743">Ieslēgt mikrofonu</translation>
 <translation id="851751545965956758">Neļaut vietnēm izveidot savienojumu ar ierīci</translation>
 <translation id="8525306231823319788">Pilnekrāna režīms</translation>
 <translation id="857943718398505171">Atļauta (ieteicams)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
index 485e4d9..8a8cf4b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">За да овозможите <ph name="APP_NAME" /> да користи AR, вклучете ја дозволата за камерата и во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Од <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Пристапот до локацијата е исклучен за уредов. Вклучете го во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Спушти</translation>
 <translation id="1919345977826869612">Реклами</translation>
 <translation id="1919950603503897840">Изберете контакти</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Напушти</translation>
 <translation id="2687403674020088961">Блокирај ги сите колачиња (не се препорачува)</translation>
 <translation id="2704606927547763573">Копирано</translation>
-<translation id="2713106313042589954">Исклучи ја камерата</translation>
 <translation id="2717722538473713889">Адреси за е-пошта</translation>
 <translation id="2750481671343847896">Сајтовите може да прикажуваат prompt за најавување од услуги за идентификација.</translation>
 <translation id="2785051990912111074">Изборов ќе ги избрише колачињата за <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Прво прашај пред да дозволиш сајтовите да ја користат камерата (се препорачува)</translation>
 <translation id="4505788138578415521">URL-адресата е проширена</translation>
 <translation id="4534723447064627427">За да овозможите <ph name="APP_NAME" /> да пристапува до вашиот микрофон, вклучете ја дозволата за микрофонот и во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Исклучете звук на микрофонот</translation>
 <translation id="4570913071927164677">Детали</translation>
 <translation id="4645575059429386691">Управувано од вашиот родител</translation>
 <translation id="4670064810192446073">Виртуелна реалност</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Опцијата е достапна речиси најгоре на екранот</translation>
 <translation id="5197729504361054390">Контактите што ќе ги изберете ќе се споделат со <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Последно посетено денес</translation>
-<translation id="5225463052809312700">Вклучи ја камерата</translation>
 <translation id="5264323282659631142">Отстранете го „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Повлечете од врвот и допрете го копчето Назад за да излезете од цел екран.</translation>
 <translation id="5300589172476337783">Прикажи</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Се користи 1 колаче}one{Се користи # колаче}other{Се користат # колачиња}}</translation>
 <translation id="8487700953926739672">Достапно е исклучено од линија</translation>
 <translation id="848952951823693243">Секогаш барај сајт за мобилен</translation>
-<translation id="8499083585497694743">Вклучи го звукот на микрофонот</translation>
 <translation id="851751545965956758">Блокирај ги сајтовите од поврзување со уреди</translation>
 <translation id="8525306231823319788">Цел екран</translation>
 <translation id="857943718398505171">Дозволено (препорачано)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
index 42c07a3..0090ef71 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> ആപ്പിനെ AR ഉപയോഗിക്കാൻ അനുവദിക്കുന്നതിന് <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിലും<ph name="END_LINK" /> ക്യാമറ ഓണാക്കുക.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> എന്നതിൽ നിന്ന്</translation>
 <translation id="1887786770086287077">ഈ ഉപകരണത്തിന്‍റെ ലൊക്കേഷൻ ആക്‌സസ് ഓഫാണ്; <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> അത് ഓണാക്കുക.</translation>
-<translation id="1915307458270490472">ഹാംഗ് അപ്പ് ചെയ്യുക</translation>
 <translation id="1919345977826869612">പരസ്യങ്ങള്‍</translation>
 <translation id="1919950603503897840">കോൺടാക്റ്റുകൾ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ഉപേക്ഷിക്കുക</translation>
 <translation id="2687403674020088961">എല്ലാ കുക്കികളും ബ്ലോക്ക് ചെയ്യുക (ശുപാർശ ചെയ്യുന്നില്ല)</translation>
 <translation id="2704606927547763573">പകർത്തി</translation>
-<translation id="2713106313042589954">ക്യാമറ ഓഫാക്കുക</translation>
 <translation id="2717722538473713889">ഇമെയിൽ വിലാസങ്ങൾ</translation>
 <translation id="2750481671343847896">ഐഡന്റിറ്റി സേവനങ്ങളിൽ നിന്നുള്ള സൈൻ ഇൻ നിർദ്ദേശങ്ങൾ കാണിക്കാൻ സൈറ്റുകൾക്ക് കഴിയും.</translation>
 <translation id="2785051990912111074">ഇത് തിരഞ്ഞെടുക്കുന്നതിലൂടെ <ph name="WEBSITE" /> എന്നതിനുള്ള കുക്കികൾ മായ്ക്കും</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കുന്നതിന് മുമ്പ് ആദ്യം ചോദിക്കുക (ശുപാർശചെയ്‌തിരിക്കുന്നു)</translation>
 <translation id="4505788138578415521">URL വികസിപ്പിച്ചു</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> ആപ്പിനെ നിങ്ങളുടെ മൈക്രോഫോൺ ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കുന്നതിന്, <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിലും<ph name="END_LINK" /> മൈക്രോഫോൺ ഓണാക്കുക.</translation>
-<translation id="4566417217121906555">മൈക്രോഫോൺ മ്യൂട്ട് ചെയ്യുക</translation>
 <translation id="4570913071927164677">വിശദാംശങ്ങൾ</translation>
 <translation id="4645575059429386691">നിങ്ങളുടെ രക്ഷിതാവ് നിയന്ത്രിക്കുന്നു</translation>
 <translation id="4670064810192446073">വെർച്വൽ റിയാലിറ്റി</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">സ്‌ക്രീനിന്റെ മുകളിൽ ഓപ്‌ഷൻ ലഭ്യമാണ്</translation>
 <translation id="5197729504361054390">നിങ്ങൾ തിരഞ്ഞെടുക്കുന്ന കോൺടാക്‌റ്റുകൾ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> എന്ന സൈറ്റുമായി പങ്കിടും.</translation>
 <translation id="5216942107514965959">അവസാനം സന്ദർശിച്ചത് ഇന്നാണ്</translation>
-<translation id="5225463052809312700">ക്യാമറ ഓണാക്കുക</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' നീക്കംചെയ്യുക</translation>
 <translation id="528192093759286357">പൂർണ്ണ സ്‌ക്രീനിൽ നിന്ന് പുറത്തുകടക്കാൻ, മുകളിൽ നിന്ന് വലിച്ചിട്ട് ബാക്ക് ബട്ടണിൽ സ്‌പർശിക്കുക.</translation>
 <translation id="5300589172476337783">കാണിക്കുക</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{ഒരു കുക്കി ഉപയോഗത്തിലാണ്}other{# കുക്കികൾ ഉപയോഗത്തിലാണ്}}</translation>
 <translation id="8487700953926739672">ഓഫ്‌ലൈനില്‍ ലഭ്യമാണ്</translation>
 <translation id="848952951823693243">എല്ലായ്‌പ്പോഴും മൊബൈൽ സൈറ്റ് അഭ്യർത്ഥിക്കുക</translation>
-<translation id="8499083585497694743">മൈക്രോഫോൺ അൺമ്യൂട്ട് ചെയ്യുക</translation>
 <translation id="851751545965956758">ഉപകരണങ്ങളിലേക്ക് കണക്‌റ്റ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="8525306231823319788">പൂര്‍ണ്ണ സ്ക്രീന്‍</translation>
 <translation id="857943718398505171">അനുവദിച്ചിരിക്കുന്നു (ശുപാർശചെയ്‌തത്)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
index 9d9c14b1..622428a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />-д AR-г ашиглахыг зөвшөөрөхийн тулд камерыг мөн <ph name="BEGIN_LINK" />Андройдын Тохиргоо<ph name="END_LINK" />-нд асаана уу.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" />-с</translation>
 <translation id="1887786770086287077">Байршлын хандалт энэ төхөөрөмжид унтраалттай байна. Үүнийг <ph name="BEGIN_LINK" />Андройдын тохиргоо<ph name="END_LINK" /> хэсэгт асаана уу.</translation>
-<translation id="1915307458270490472">Таслах</translation>
 <translation id="1919345977826869612">Зар</translation>
 <translation id="1919950603503897840">Харилцагчдыг сонгох</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Үлдээх</translation>
 <translation id="2687403674020088961">Бүх күүкиг блоклох (зөвлөдөггүй)</translation>
 <translation id="2704606927547763573">Хуулсан</translation>
-<translation id="2713106313042589954">Камерыг унтраах</translation>
 <translation id="2717722538473713889">Имэйл хаяг</translation>
 <translation id="2750481671343847896">Сайтууд таниулбарын үйлчилгээнүүдийн нэвтрэх сануулгыг харуулах боломжтой.</translation>
 <translation id="2785051990912111074">Энэ сонголт <ph name="WEBSITE" />-н күүкиг арилгана</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Сайтууд камер ашиглах зөвшөөрөл авах (санал болгосон)</translation>
 <translation id="4505788138578415521">URL-г өргөтгөсөн</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" />-д таны микрофонд хандахыг зөвшөөрөхийн тулд микрофоныг мөн <ph name="BEGIN_LINK" />Андройдын тохиргоо<ph name="END_LINK" />-нд асаана уу.</translation>
-<translation id="4566417217121906555">Микрофоны дууг хаах</translation>
 <translation id="4570913071927164677">Дэлгэрэнгүй</translation>
 <translation id="4645575059429386691">Эцэг, эх нь хариуцаж байна</translation>
 <translation id="4670064810192446073">Виртуал бодит байдал</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Сонголт дэлгэцийн дээд хэсэгт байна</translation>
 <translation id="5197729504361054390">Таны сонгох харилцагчдыг <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />-тай хуваалцана.</translation>
 <translation id="5216942107514965959">Хамгийн сүүлд өнөөдөр зочилсон</translation>
-<translation id="5225463052809312700">Камерыг асаах</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />'-г хасах</translation>
 <translation id="528192093759286357">Бүтэн дэлгэцийн горимоос гарахын тулд дээрээс зөөгөөд, буцах товчлуурыг дарна уу.</translation>
 <translation id="5300589172476337783">Харуулах</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 күүки ашиглаж байна}other{# 1 күүки ашиглаж байна}}</translation>
 <translation id="8487700953926739672">Сүлжээнд холбогдоогүй байна</translation>
 <translation id="848952951823693243">Үргэлж мобайл сайтын хүсэлт тавих</translation>
-<translation id="8499083585497694743">Микрофоны дууг нээх</translation>
 <translation id="851751545965956758">Сайтуудыг төхөөрөмжүүдэд холбогдохыг нь блоклох</translation>
 <translation id="8525306231823319788">Бүтэн дэлгэц</translation>
 <translation id="857943718398505171">Зөвшөөрөгдсөн (санал болгосон)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
index 0cb168e..f43d17b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> ला AR वापरू देण्यासाठी, <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" />मध्ये कॅमेरादेखील सुरू करा.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> मधून</translation>
 <translation id="1887786770086287077">या डिव्हाइसाठी स्थान अ‍ॅक्सेस बंद आहे, <ph name="BEGIN_LINK" />Android सेटिंग्‍ज<ph name="END_LINK" /> मध्‍ये हे सुरू करा.</translation>
-<translation id="1915307458270490472">बंद करा</translation>
 <translation id="1919345977826869612">जाहिराती</translation>
 <translation id="1919950603503897840">संपर्क निवडा</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">सोडा</translation>
 <translation id="2687403674020088961">सर्व कुकी ब्लॉक करा (शिफारस केली जात नाही)</translation>
 <translation id="2704606927547763573">कॉपी केले</translation>
-<translation id="2713106313042589954">कॅमेरा बंद करा</translation>
 <translation id="2717722538473713889">ईमेल ॲड्रेस</translation>
 <translation id="2750481671343847896">साइट ओळखीच्या सेवांकडून मिळणाऱ्या साइन इन सूचना दाखवू शकतात.</translation>
 <translation id="2785051990912111074">या निवडीमुळे <ph name="WEBSITE" /> च्या कुकी साफ होतील</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">साइटना तुमचा कॅमेरा वापरण्याची अनुमती देण्यापूर्वी प्रथम विचारा (शिफारस केलेले)</translation>
 <translation id="4505788138578415521">URL चा विस्तार केला गेला</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> ला तुमचा मायक्रोफोन ॲक्सेस करू देण्यासाठी, <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्येदेखील मायक्रोफोन सुरू करा.</translation>
-<translation id="4566417217121906555">मायक्रोफोन म्यूट करा</translation>
 <translation id="4570913071927164677">तपशील</translation>
 <translation id="4645575059429386691">आपल्या पालकांद्वारे व्यवस्थापित करण्यात आले</translation>
 <translation id="4670064810192446073">आभासी वास्तविकता</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">स्क्रीनच्या सर्वात वरती पर्याय उपलब्ध आहे</translation>
 <translation id="5197729504361054390">तुम्ही निवडलेले संपर्क <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />सोबत शेअर केले जातील.</translation>
 <translation id="5216942107514965959">आज शेवटची भेट दिली</translation>
-<translation id="5225463052809312700">कॅमेरा सुरू करा</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' काढून टाका</translation>
 <translation id="528192093759286357">शीर्ष पासून ड्रॅग करा आणि फुलस्क्रीन मधून बाहेर पडण्यासाठी परत बटणास स्पर्श करा.</translation>
 <translation id="5300589172476337783">दर्शवा</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{एक कुकी वापरात आहे}other{# कुकी वापरात आहेत}}</translation>
 <translation id="8487700953926739672">ऑफलाइन उपलब्ध</translation>
 <translation id="848952951823693243">नेहमी मोबाइल साइटची विनंती करा</translation>
-<translation id="8499083585497694743">मायक्रोफोन अनम्यूट करा</translation>
 <translation id="851751545965956758">डिव्हाइसेसशी कनेक्ट करण्यापासून साइटना ब्लॉक करा</translation>
 <translation id="8525306231823319788">फुल स्क्रीन</translation>
 <translation id="857943718398505171">अनुमती दिली (शिफारस केलेले)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
index ddbdbef..dc19a6f6 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Untuk membolehkan <ph name="APP_NAME" /> menggunakan AR, hidupkan juga kamera dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Daripada <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Akses lokasi dimatikan untuk peranti ini. Hidupkannya dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Tamatkan panggilan</translation>
 <translation id="1919345977826869612">Iklan</translation>
 <translation id="1919950603503897840">Pilih kenalan</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Tinggalkan</translation>
 <translation id="2687403674020088961">Sekat semua kuki (tidak disyorkan)</translation>
 <translation id="2704606927547763573">Disalin</translation>
-<translation id="2713106313042589954">Matikan kamera</translation>
 <translation id="2717722538473713889">Alamat e-mel</translation>
 <translation id="2750481671343847896">Laman boleh menunjukkan gesaan log masuk daripada perkhidmatan identiti.</translation>
 <translation id="2785051990912111074">Pilihan ini akan mengosongkan kuki untuk <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Tanya dahulu sebelum membenarkan tapak menggunakan kamera anda (disyorkan)</translation>
 <translation id="4505788138578415521">URL dikembangkan</translation>
 <translation id="4534723447064627427">Untuk membolehkan <ph name="APP_NAME" /> mengakses mikrofon anda, hidupkan juga mikrofon dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Redamkan mikrofon</translation>
 <translation id="4570913071927164677">Butiran</translation>
 <translation id="4645575059429386691">Diurus oleh ibu bapa anda</translation>
 <translation id="4670064810192446073">Realiti maya</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Pilihan tersedia berhampiran bahagian atas skrin</translation>
 <translation id="5197729504361054390">Kenalan yang anda pilih akan dikongsi dengan <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Terakhir dilawati hari ini</translation>
-<translation id="5225463052809312700">Hidupkan kamera</translation>
 <translation id="5264323282659631142">Alih keluar '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Seret dari atas dan sentuh butang kembali untuk keluar daripada skrin penuh.</translation>
 <translation id="5300589172476337783">Paparkan</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 kuki sedang digunakan}other{# kuki sedang digunakan}}</translation>
 <translation id="8487700953926739672">Tersedia di luar talian</translation>
 <translation id="848952951823693243">Sentiasa minta laman mudah alih</translation>
-<translation id="8499083585497694743">Nyahredamkan mikrofon</translation>
 <translation id="851751545965956758">Sekat tapak daripada menyambung ke peranti</translation>
 <translation id="8525306231823319788">Skrin penuh</translation>
 <translation id="857943718398505171">Dibenarkan (disyorkan)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
index 51e3f63a..695476f7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> က AR အသုံးပြုနိုင်ရန် <ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင်လည်း ကင်မရာကို ဖွင့်ပါ။</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> မှ</translation>
 <translation id="1887786770086287077">ဤစက်ပစ္စည်းအတွက် တည်နေရာ အသုံးပြုခွင့်ကို ပိတ်ထားသည်။ <ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင် ၎င်းကို ဖွင့်ပါ။</translation>
-<translation id="1915307458270490472">ဖုန်းချရန်</translation>
 <translation id="1919345977826869612">ကြော်ငြာများ</translation>
 <translation id="1919950603503897840">အဆက်အသွယ်များ ရွေးရန်</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ထွက်ခွာရန်</translation>
 <translation id="2687403674020088961">ကွတ်ကီးများအားလုံးကို ပိတ်ရန် (အကြံမပြုပါ)</translation>
 <translation id="2704606927547763573">ကူးယူပြီးပါပြီ</translation>
-<translation id="2713106313042589954">ကင်မရာပိတ်ရန်</translation>
 <translation id="2717722538473713889">အီးမေးလ်လိပ်စာများ</translation>
 <translation id="2750481671343847896">ဝဘ်ဆိုက်များက အထောက်အထားဆိုင်ရာ ဝန်ဆောင်မှုများမှ လက်မှတ်ထိုးဝင်မှုဆိုင်ရာ အတည်ပြုစနစ်ကို ပြနိုင်သည်။</translation>
 <translation id="2785051990912111074">ဤရွေးချယ်မှုက <ph name="WEBSITE" /> ၏ ကွတ်ကီးများကို ဖျက်လိုက်ပါလိမ့်မည်</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">သင့်ကမရာကို ဆိုက်များအား အသုံးပြုခွင့်မပေးမီ ဦးစွာမေးမြန်းပါ (အကြံပြုထားသည်)</translation>
 <translation id="4505788138578415521">URL ကို ချဲ့လိုက်သည်</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> က သင့်မိုက်ခရိုဖုန်းကို သုံးနိုင်ရန် <ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင်လည်း မိုက်ခရိုဖုန်း ဖွင့်ပါ။</translation>
-<translation id="4566417217121906555">မိုက်ခရိုဖုန်းကို အသံပိတ်ရန်</translation>
 <translation id="4570913071927164677">အသေးစိတ်</translation>
 <translation id="4645575059429386691">သင့်မိဘမှ စီမံသည်</translation>
 <translation id="4670064810192446073">ပကတိအသွင်</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ဖန်သားပြင်၏ထိပ်နားတွင် ရွေးချယ်နိုင်သည်</translation>
 <translation id="5197729504361054390">သင်ရွေးချယ်သော အဆက်အသွယ်များကို <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> နှင့် မျှဝေပါမည်။</translation>
 <translation id="5216942107514965959">ယနေ့ နောက်ဆုံး ဝင်ကြည့်ထားသည်</translation>
-<translation id="5225463052809312700">ကင်မရာဖွင့်ရန်</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' ဖယ်ရှားရန်</translation>
 <translation id="528192093759286357">မျက်နှာပြင်အပြည့်ဖွင့်ခြင်းမှ ထွက်ရန် ထိပ်ဆုံးမှဆွဲချကာ နောက်ဆုတ်ရန်ခလုတ်ကို နှိပ်ပါ။</translation>
 <translation id="5300589172476337783">ပြရန်</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{ကွတ်ကီးတစ်ခုကို သုံးနေသည်}other{အသုံးပြုနေသော ကွတ်ကီး # ခု}}</translation>
 <translation id="8487700953926739672">Offline ရနိုင်</translation>
 <translation id="848952951823693243">မိုဘိုင်းဝဘ်ဆိုက် အမြဲတောင်းဆိုပါ</translation>
-<translation id="8499083585497694743">မိုက်ခရိုဖုန်း ပြန်ဖွင့်ရန်</translation>
 <translation id="851751545965956758">စက်သို့ ဝဘ်ဆိုက်များ ချိတ်ဆက်ခြင်းကို ပိတ်ထားသည်</translation>
 <translation id="8525306231823319788">မျက်နှာပြင် အပြည့်</translation>
 <translation id="857943718398505171">ခွင့်ပြု၏ (အကြံပြုထား)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
index cdfeda3d..7352551 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> लाई AR प्रयोग गर्न दिन <ph name="BEGIN_LINK" />Android का सेटिङ<ph name="END_LINK" />मा गई क्यामेरा पनि अन गर्नुहोस्।</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> बाट प्राप्त जानकारी</translation>
 <translation id="1887786770086287077">यो डिभाइसको स्थानमाथिको पहुँच निष्क्रिय छ। <ph name="BEGIN_LINK" />Android का सेटिङहरू<ph name="END_LINK" /> मा गई यसलाई अन गर्नुहोस्।</translation>
-<translation id="1915307458270490472">ह्याङ्ग अप</translation>
 <translation id="1919345977826869612">विज्ञापनहरू</translation>
 <translation id="1919950603503897840">सम्पर्कहरू चयन गर्नुहोस्</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">छोड्नुहोस्</translation>
 <translation id="2687403674020088961">सबै कुकीहरूमाथि रोक लगाउनुहोस् (सिफारिस गरिँदैन)</translation>
 <translation id="2704606927547763573">प्रतिलिपि गरियो</translation>
-<translation id="2713106313042589954">क्यामेरा अफ गर्नुहोस्</translation>
 <translation id="2717722538473713889">इमेल ठेगानाहरू</translation>
 <translation id="2750481671343847896">साइटहरूले पहिचान सेवा प्रदायकहरूबाट प्राप्त साइन इन गर्ने प्रम्प्टहरू देखाउन सक्छन्।</translation>
 <translation id="2785051990912111074">तपाईंले यो विकल्प रोज्नुभयो भने <ph name="WEBSITE" /> का कुकीहरू मेटाइने छन्</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">साइटहरूलाई तपाईँको क्यामेरा प्रयोग गर्न अनुमति दिनुभन्दा पहिले तपाईँलाई सोध्ने (सिफारिस गरिएको)</translation>
 <translation id="4505788138578415521">URL विस्तृत गरियो</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> लाई आफ्नो माइक्रोफोन प्रयोग गर्न दिन <ph name="BEGIN_LINK" />Android का सेटिङ<ph name="END_LINK" />मा गई माइक्रोफोन पनि अन गर्नुहोस्।</translation>
-<translation id="4566417217121906555">माइक्रोफोन म्युट गर्नुहोस्</translation>
 <translation id="4570913071927164677">विवरणहरू</translation>
 <translation id="4645575059429386691">तपाईँको अविभावक द्वारा प्रबन्ध गरिएको</translation>
 <translation id="4670064810192446073">भर्चुअल रियालिटी</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">यो विकल्प स्क्रिनको सिरान छेउमा उपलब्ध छ</translation>
 <translation id="5197729504361054390">तपाईंले चयन गर्ने सम्पर्कहरू <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> सँग आदान प्रदान गरिने छन्।</translation>
 <translation id="5216942107514965959">पछिल्लो पटक आज खोलिएको</translation>
-<translation id="5225463052809312700">क्यामेरा अन गर्नुहोस्</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' हटाउनुहोस्</translation>
 <translation id="528192093759286357">पूर्ण स्क्रिनबाट बाहिर निस्कनका लागि शीर्षबाट तानेर पछाडि बटनलाई छुनुहोस्।</translation>
 <translation id="5300589172476337783">देखाउनुहोस्</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{एउटा कुकी प्रयोग भइरहेको छ}other{# वटा कुकी प्रयोग भइरहेका छन्}}</translation>
 <translation id="8487700953926739672">अफलाईन उपलब्ध</translation>
 <translation id="848952951823693243">सधैँ साइटको मोबाइल भ्यू देखाइयोस्</translation>
-<translation id="8499083585497694743">माइक्रोफोन अनम्युट गर्नुहोस्</translation>
 <translation id="851751545965956758">साइटहरूलाई यन्त्रमा जडान गर्नबाट रोक लगाउनुहोस्</translation>
 <translation id="8525306231823319788">पूर्ण स्क्रीन</translation>
 <translation id="857943718398505171">(सिफारिस गरिएको) अनुमति दिएको</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
index 0111b6b3..b806f234 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Als je <ph name="APP_NAME" /> AR wilt laten gebruiken, moet je ook de camera aanzetten via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Van <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Locatietoegang staat uit voor dit apparaat. Zet deze aan via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Ophangen</translation>
 <translation id="1919345977826869612">Advertenties</translation>
 <translation id="1919950603503897840">Contacten selecteren</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> van <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Verlaten</translation>
 <translation id="2687403674020088961">Alle cookies blokkeren (niet aanbevolen)</translation>
 <translation id="2704606927547763573">Gekopieerd</translation>
-<translation id="2713106313042589954">Camera uitzetten</translation>
 <translation id="2717722538473713889">E-mailadressen</translation>
 <translation id="2750481671343847896">Sites kunnen inlogprompts van identiteitsservices tonen.</translation>
 <translation id="2785051990912111074">Met deze keuze wis je de cookies voor <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Eerst vragen voordat sites je camera mogen gebruiken (aanbevolen)</translation>
 <translation id="4505788138578415521">URL uitgevouwen</translation>
 <translation id="4534723447064627427">Als je <ph name="APP_NAME" /> toegang wilt geven tot je microfoon, moet je de microfoon ook aanzetten via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Microfoon uitzetten</translation>
 <translation id="4570913071927164677">Details</translation>
 <translation id="4645575059429386691">Beheerd door je ouder</translation>
 <translation id="4670064810192446073">Virtual reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Optie beschikbaar boven aan het scherm</translation>
 <translation id="5197729504361054390">De contacten die je selecteert, worden gedeeld met <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Laatst bezocht: vandaag</translation>
-<translation id="5225463052809312700">Camera aanzetten</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' verwijderen</translation>
 <translation id="528192093759286357">Sleep vanaf de bovenkant en tik op de knop Terug om het volledige scherm te sluiten.</translation>
 <translation id="5300589172476337783">Tonen</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie in gebruik}other{# cookies in gebruik}}</translation>
 <translation id="8487700953926739672">Offline beschikbaar</translation>
 <translation id="848952951823693243">Altijd mobiele site aanvragen</translation>
-<translation id="8499083585497694743">Microfoon aanzetten</translation>
 <translation id="851751545965956758">Voorkomen dat sites verbinding maken met apparaten</translation>
 <translation id="8525306231823319788">Volledig scherm</translation>
 <translation id="857943718398505171">Toegestaan (aanbevolen)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
index f143db3..a3c48af 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">For å la <ph name="APP_NAME" /> bruke AR, slå på kameraet i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" /> også.</translation>
 <translation id="1864927262126810325">Fra <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Posisjonstilgang er slått av for denne enheten. Slå den på i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Legg på</translation>
 <translation id="1919345977826869612">Annonser</translation>
 <translation id="1919950603503897840">Velg kontakter</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Gå ut</translation>
 <translation id="2687403674020088961">Blokkér alle informasjonskapsler (anbefales ikke)</translation>
 <translation id="2704606927547763573">Kopiert</translation>
-<translation id="2713106313042589954">Slå av kameraet</translation>
 <translation id="2717722538473713889">E-postadresser</translation>
 <translation id="2750481671343847896">Nettsteder kan vise påloggingsforespørsler fra identitetstjenester.</translation>
 <translation id="2785051990912111074">Dette valget sletter informasjonskapsler for <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Spør før nettsteder får bruke kameraet (anbefales)</translation>
 <translation id="4505788138578415521">Nettadressen er utvidet</translation>
 <translation id="4534723447064627427">For å gi <ph name="APP_NAME" /> tilgang til mikrofonen må du også slå på mikrofonen i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Slå av mikrofonen</translation>
 <translation id="4570913071927164677">Detaljer</translation>
 <translation id="4645575059429386691">Administreres av foreldrene dine</translation>
 <translation id="4670064810192446073">Virtuell virkelighet</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Alternativet finner du nesten øverst på skjermen</translation>
 <translation id="5197729504361054390">Kontaktene du velger, deles med <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Sist besøkt i dag</translation>
-<translation id="5225463052809312700">Slå på kameraet</translation>
 <translation id="5264323282659631142">Fjern «<ph name="CHIP_LABEL" />»</translation>
 <translation id="528192093759286357">Dra ned fra toppen og trykk på tilbakeknappen for å avslutte fullskjerm.</translation>
 <translation id="5300589172476337783">Vis</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 informasjonskapsel er i bruk}other{# informasjonskapsler er i bruk}}</translation>
 <translation id="8487700953926739672">Tilgjengelig utenfor nettet</translation>
 <translation id="848952951823693243">Be alltid om mobilnettstedet</translation>
-<translation id="8499083585497694743">Slå på mikrofonen</translation>
 <translation id="851751545965956758">Blokkér at nettsteder kobler til enheter</translation>
 <translation id="8525306231823319788">Full skjerm</translation>
 <translation id="857943718398505171">Tillatt (anbefales)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
index e40c5440..7cddb61 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" />କୁ AR ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦେବା ପାଇଁ, <ph name="BEGIN_LINK" />Android ସେଟିଂସ<ph name="END_LINK" />ରେ କ୍ୟାମେରା ମଧ୍ୟ ଚାଲୁ କରନ୍ତୁ।</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" />ରୁ</translation>
 <translation id="1887786770086287077">ଏହି ଡିଭାଇସ୍ ପାଇଁ ଲୋକେସନ୍ ଆକ୍ସେସ୍ ବନ୍ଦ ଅଛି। <ph name="BEGIN_LINK" />Android ସେଟିଂସ୍‍<ph name="END_LINK" />ରେ ଏହାକୁ ଚାଲୁ କରନ୍ତୁ।</translation>
-<translation id="1915307458270490472">ସମାପ୍ତ କରନ୍ତୁ</translation>
 <translation id="1919345977826869612">ବିଜ୍ଞାପନ</translation>
 <translation id="1919950603503897840">ଯୋଗାଯୋଗଗୁଡ଼ିକ ଚୟନ କରନ୍ତୁ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ଛାଡ଼ନ୍ତୁ</translation>
 <translation id="2687403674020088961">ସମସ୍ତ କୁକୀ ବ୍ଲକ୍ କରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇ ନାହିଁ)</translation>
 <translation id="2704606927547763573">କପି କରାଯାଇଛି</translation>
-<translation id="2713106313042589954">କ୍ୟାମେରା ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="2717722538473713889">ଇମେଲ୍ ଠିକଣାଗୁଡ଼ିକ</translation>
 <translation id="2750481671343847896">ପରିଚୟ ପ୍ରଦାନ କରୁଥିବା ସେବାଗୁଡ଼ିକରୁ ସାଇନ-ଇନ ପ୍ରମ୍ପ୍ଟଗୁଡ଼ିକୁ ସାଇଟଗୁଡ଼ିକ ଦେଖାଇପାରନ୍ତି।</translation>
 <translation id="2785051990912111074">ଏହି ବିକଳ୍ପକୁ ପସନ୍ଦ କଲେ ଏହା<ph name="WEBSITE" /> ପାଇଁ କୁକୀଗୁଡ଼ିକୁ ଖାଲି କରିଦେବ</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ଆପଣଙ୍କର କ୍ୟାମେରା ବ୍ୟବହାର କରିବାକୁ ସାଇଟ୍‌ଗୁଡ଼ିକୁ ଅନୁମତି ଦେବା ପୂର୍ବରୁ, ପ୍ରଥମେ ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
 <translation id="4505788138578415521">URLକୁ ବିସ୍ତାର କରାଯାଇଛି</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" />କୁ ଆପଣଙ୍କ ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍ ଦେବା ପାଇଁ, <ph name="BEGIN_LINK" />Android ସେଟିଂସ<ph name="END_LINK" />ରେ ମାଇକ୍ରୋଫୋନ୍ ମଧ୍ୟ ଚାଲୁ କରନ୍ତୁ।</translation>
-<translation id="4566417217121906555">ମାଇକ୍ରୋଫୋନକୁ ମ୍ୟୁଟ୍ କରନ୍ତୁ</translation>
 <translation id="4570913071927164677">ବିବରଣୀ</translation>
 <translation id="4645575059429386691">ଆପଣଙ୍କର ଅଭିବାବକଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ</translation>
 <translation id="4670064810192446073">ଭର୍ଚୁଆଲ୍ ରିଆଲିଟୀ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ସ୍କ୍ରିନର ଶୀର୍ଷଭାଗର ନିକଟରେ ବିକଳ୍ପ ଉପଲବ୍ଧ ଅଛି</translation>
 <translation id="5197729504361054390">ଆପଣ ଚୟନ କରିଥିବା ଯୋଗାଯୋଗଗୁଡ଼ିକ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ସହିତ ସେୟାର୍ କରାଯିବ।</translation>
 <translation id="5216942107514965959">ଆଜି ଶେଷ ଥର ଭିଜିଟ୍ କରାଯାଇଛି</translation>
-<translation id="5225463052809312700">କ୍ୟାମେରା ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />'କୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation>
 <translation id="528192093759286357">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍‌ରୁ ପ୍ରସ୍ଥାନ କରିବାକୁ ଶୀର୍ଷରୁ ଟାଣନ୍ତୁ ଏବଂ ପଛପଟ ବଟନ୍‌କୁ ସ୍ପର୍ଶ କରନ୍ତୁ</translation>
 <translation id="5300589172476337783">ପ୍ରଦର୍ଶନ କରନ୍ତୁ</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1ଟି କୁକୀ ବ୍ୟବହାର କରାଯାଉଛି}other{#ଟି କୁକୀ ବ୍ୟବହାର କରାଯାଉଛି}}</translation>
 <translation id="8487700953926739672">ଅଫ୍‍ଲାଇନ୍‌ରେ ଉପଲବ୍ଧ</translation>
 <translation id="848952951823693243">ସର୍ବଦା ମୋବାଇଲ ସାଇଟର ଅନୁରୋଧ କରନ୍ତୁ</translation>
-<translation id="8499083585497694743">ମାଇକ୍ରୋଫୋନକୁ ଅନମ୍ୟୁଟ୍ କରନ୍ତୁ</translation>
 <translation id="851751545965956758">ସାଇଟ୍‌ଗୁଡ଼ିକୁ ଡିଭାଇସ୍‌ଗୁଡ଼ିକ ସହିତ ସଂଯୋଗ ହେବାରୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="8525306231823319788">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍‌</translation>
 <translation id="857943718398505171">ଅନୁମୋଦିତ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
index 512b7416f..c4666b7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> ਨੂੰ AR ਵਰਤਣ ਦੇਣ ਲਈ <ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਕੈਮਰਾ ਵੀ ਚਾਲੂ ਕਰੋ।</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> ਤੋਂ</translation>
 <translation id="1887786770086287077">ਇਸ ਡੀਵਾਈਸ ਲਈ ਟਿਕਾਣਾ ਪਹੁੰਚ ਬੰਦ ਹੈ। ਇਸਨੂੰ <ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਚਾਲੂ ਕਰੋ।</translation>
-<translation id="1915307458270490472">ਸਮਾਪਤ ਕਰੋ</translation>
 <translation id="1919345977826869612">ਵਿਗਿਆਪਨ</translation>
 <translation id="1919950603503897840">ਸੰਪਰਕ ਚੁਣੋ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ਛੱਡੋ</translation>
 <translation id="2687403674020088961">ਸਾਰੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰੋ (ਇਸਦੀ ਸਿਫ਼ਾਰਸ਼ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ)</translation>
 <translation id="2704606927547763573">ਕਾਪੀ ਕੀਤਾ</translation>
-<translation id="2713106313042589954">ਕੈਮਰਾ ਬੰਦ ਕਰੋ</translation>
 <translation id="2717722538473713889">ਈਮੇਲ ਪਤੇ</translation>
 <translation id="2750481671343847896">ਸਾਈਟਾਂ ਪਛਾਣ ਸੰਬੰਧੀ ਸੇਵਾਵਾਂ ਵੱਲੋਂ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੇ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਦਿਖਾ ਸਕਦੀਆਂ ਹਨ।</translation>
 <translation id="2785051990912111074">ਇਹ ਚੋਣ <ph name="WEBSITE" /> ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰ ਦੇਵੇਗੀ</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਲੈਣ ਨੂੰ ਜ਼ਰੂਰੀ ਬਣਾਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation>
 <translation id="4505788138578415521">URL ਦਾ ਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> ਨੂੰ ਆਪਣੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣ ਲਈ, <ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵੀ ਚਾਲੂ ਕਰੋ।</translation>
-<translation id="4566417217121906555">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਮਿਊਟ ਕਰੋ</translation>
 <translation id="4570913071927164677">ਵੇਰਵੇ</translation>
 <translation id="4645575059429386691">ਤੁਹਾਡੇ ਮਾਤਾ ਜਾਂ ਪਿਤਾ ਵੱਲੋਂ ਵਿਵਸਥਿਤ</translation>
 <translation id="4670064810192446073">ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ ਨੇੜੇ ਵਿਕਲਪ ਉਪਲਬਧ ਹਨ</translation>
 <translation id="5197729504361054390">ਤੁਹਾਡੇ ਵੱਲੋਂ ਚੁਣੇ ਸੰਪਰਕ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ਨਾਲ ਸਾਂਝੇ ਕੀਤੇ ਜਾਣਗੇ।</translation>
 <translation id="5216942107514965959">ਪਿਛਲੀ ਵਾਰ ਅੱਜ ਦੇਖੀ ਗਈ</translation>
-<translation id="5225463052809312700">ਕੈਮਰਾ ਚਾਲੂ ਕਰੋ</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' ਨੂੰ ਹਟਾਓ</translation>
 <translation id="528192093759286357">ਉੱਪਰ ਤੋਂ ਘਸੀਟੋ ਅਤੇ ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੋਂ ਬਾਹਰ ਜਾਣ ਲਈ ਪਿੱਛੇ ਜਾਓ ਬਟਨ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ।</translation>
 <translation id="5300589172476337783">ਦਿਖਾਓ</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 ਕੁਕੀ ਵਰਤੋਂ ਵਿੱਚ ਹੈ}one{# ਕੁਕੀ ਵਰਤੋਂ ਵਿੱਚ ਹੈ}other{# ਕੁਕੀਜ਼ ਵਰਤੋਂ ਵਿੱਚ ਹਨ}}</translation>
 <translation id="8487700953926739672">ਆਫ਼ਲਾਈਨ ਉਪਲਬਧ</translation>
 <translation id="848952951823693243">ਹਮੇਸ਼ਾਂ ਮੋਬਾਈਲ ਸਾਈਟ ਦੀ ਬੇਨਤੀ ਕਰੋ</translation>
-<translation id="8499083585497694743">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਅਣਮਿਊਟ ਕਰੋ</translation>
 <translation id="851751545965956758">ਸਾਈਟਾਂ ਨੂੰ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation>
 <translation id="8525306231823319788">ਪੂਰੀ ਸਕ੍ਰੀਨ</translation>
 <translation id="857943718398505171">ਇਜਾਜ਼ਤ ਹੈ ( ਸਿਫ਼ਾਰਸ਼  ਕੀਤੇ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
index 32bdfa69..2ab5d7c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Aby w aplikacji <ph name="APP_NAME" /> można było korzystać z rzeczywistości rozszerzonej, włącz też aparat w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Źródło: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Dostęp do lokalizacji jest wyłączony na tym urządzeniu. Włącz go w <ph name="BEGIN_LINK" />Ustawieniach Androida<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Rozłącz</translation>
 <translation id="1919345977826869612">Reklamy</translation>
 <translation id="1919950603503897840">Wybierz kontakty</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Wyjdź</translation>
 <translation id="2687403674020088961">Blokuj wszystkie pliki cookie (niezalecane)</translation>
 <translation id="2704606927547763573">Skopiowane</translation>
-<translation id="2713106313042589954">Wyłącz kamerę</translation>
 <translation id="2717722538473713889">Adresy e-mail</translation>
 <translation id="2750481671343847896">Witryny mogą wyświetlać prośby o zalogowanie się pochodzące od usług tożsamości.</translation>
 <translation id="2785051990912111074">Spowoduje to usunięcie plików cookie witryny <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pytaj, zanim zezwolisz stronom na korzystanie z aparatu (zalecane)</translation>
 <translation id="4505788138578415521">URL pokazany w całości</translation>
 <translation id="4534723447064627427">Aby zezwolić aplikacji <ph name="APP_NAME" /> na dostęp do mikrofonu, musisz go też włączyć w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Wycisz mikrofon</translation>
 <translation id="4570913071927164677">Szczegóły</translation>
 <translation id="4645575059429386691">Zarządzany przez Twojego rodzica</translation>
 <translation id="4670064810192446073">Rzeczywistość wirtualna</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opcja dostępna u góry ekranu</translation>
 <translation id="5197729504361054390">Wybrane kontakty zostaną udostępnione witrynie <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Ostatnio używana dzisiaj</translation>
-<translation id="5225463052809312700">Włącz kamerę</translation>
 <translation id="5264323282659631142">Usuń: „<ph name="CHIP_LABEL" />”</translation>
 <translation id="528192093759286357">Przeciągnij od góry i kliknij przycisk Wstecz, by wyjść z trybu pełnoekranowego.</translation>
 <translation id="5300589172476337783">Pokaż</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 plik cookie w użyciu}few{# pliki cookie w użyciu}many{# plików cookie w użyciu}other{# pliku cookie w użyciu}}</translation>
 <translation id="8487700953926739672">Dostępny offline</translation>
 <translation id="848952951823693243">Zawsze żądaj strony mobilnej</translation>
-<translation id="8499083585497694743">Włącz mikrofon</translation>
 <translation id="851751545965956758">Nie zezwalaj stronom na łączenie się z urządzeniami</translation>
 <translation id="8525306231823319788">Pełny ekran</translation>
 <translation id="857943718398505171">Dozwolone (zalecane)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
index d3d8338..75021fd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para permitir que o app <ph name="APP_NAME" /> use RA, também é necessário ativar a câmera nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">O acesso ao local está desativado neste dispositivo. Ative nas <ph name="BEGIN_LINK" />Configurações do Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Desligar</translation>
 <translation id="1919345977826869612">Anúncios</translation>
 <translation id="1919950603503897840">Selecionar contatos</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Sair</translation>
 <translation id="2687403674020088961">Bloquear todos os cookies (não recomendado)</translation>
 <translation id="2704606927547763573">Copiado</translation>
-<translation id="2713106313042589954">Desativar câmera</translation>
 <translation id="2717722538473713889">Endereços de e-mail</translation>
 <translation id="2750481671343847896">Sites podem exibir solicitações de login de serviços de identificação.</translation>
 <translation id="2785051990912111074">Essa ação vai apagar os cookies de <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Perguntar antes de permitir que sites usem sua câmera (recomendado)</translation>
 <translation id="4505788138578415521">URL expandido</translation>
 <translation id="4534723447064627427">Para permitir que o app <ph name="APP_NAME" /> acesse seu microfone, também é preciso ativá-lo nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Desativar microfone</translation>
 <translation id="4570913071927164677">Detalhes</translation>
 <translation id="4645575059429386691">Gerenciado pelos seus pais</translation>
 <translation id="4670064810192446073">Realidade virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opção disponível perto da parte superior da tela</translation>
 <translation id="5197729504361054390">Os contatos selecionados serão compartilhados com <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Última visita: hoje</translation>
-<translation id="5225463052809312700">Ativar câmera</translation>
 <translation id="5264323282659631142">Remover "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Arraste a partir da parte superior e toque no botão "Voltar" para sair da tela cheia.</translation>
 <translation id="5300589172476337783">Mostrar</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie em uso}one{# cookie em uso}other{# cookies em uso}}</translation>
 <translation id="8487700953926739672">Disponível off-line</translation>
 <translation id="848952951823693243">Sempre ver a versão para dispositivos móveis</translation>
-<translation id="8499083585497694743">Ativar microfone</translation>
 <translation id="851751545965956758">Impedir que sites se conectem a dispositivos</translation>
 <translation id="8525306231823319788">Tela cheia</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
index c6e403a6..014f8e08 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Para permitir que a app <ph name="APP_NAME" /> utilize a realidade aumentada, ative também a câmara nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">O acesso à localização está desativado para este dispositivo. Ative-o nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Desligar</translation>
 <translation id="1919345977826869612">Anúncios</translation>
 <translation id="1919950603503897840">Selecionar contactos</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Sair</translation>
 <translation id="2687403674020088961">Bloquear todos os cookies (não recomendado).</translation>
 <translation id="2704606927547763573">Copiado</translation>
-<translation id="2713106313042589954">Desativar câmara</translation>
 <translation id="2717722538473713889">Endereços de email</translation>
 <translation id="2750481671343847896">Os sites podem mostrar pedidos de início de sessão de serviços de identidade.</translation>
 <translation id="2785051990912111074">Esta opção limpa os cookies de <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Perguntar antes de permitir que os sites utilizem a câmara (recomendado)</translation>
 <translation id="4505788138578415521">URL expandido</translation>
 <translation id="4534723447064627427">Para permitir que a app <ph name="APP_NAME" /> aceda ao microfone, ative também o microfone nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Desativar microfone</translation>
 <translation id="4570913071927164677">Detalhes</translation>
 <translation id="4645575059429386691">Gerido pelos teus pais</translation>
 <translation id="4670064810192446073">Realidade virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opção disponível junto à parte superior do ecrã</translation>
 <translation id="5197729504361054390">Os contactos que selecionar serão partilhados com <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Última visita hoje</translation>
-<translation id="5225463052809312700">Ativar câmara</translation>
 <translation id="5264323282659631142">Remover "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Arraste a partir da parte superior e toque no botão de retrocesso para sair do ecrã inteiro.</translation>
 <translation id="5300589172476337783">Mostrar</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie em utilização}other{# cookies em utilização}}</translation>
 <translation id="8487700953926739672">Disponível offline</translation>
 <translation id="848952951823693243">Peça sempre o site para dispositivos móveis</translation>
-<translation id="8499083585497694743">Reativar microfone</translation>
 <translation id="851751545965956758">Impedir a ligação de sites a dispositivos</translation>
 <translation id="8525306231823319788">Ecrã inteiro</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
index 0437596..46ccc0f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Pentru a permite aplicației <ph name="APP_NAME" /> să folosească RA, activează camera foto și în <ph name="BEGIN_LINK" />Setările Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">De la <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Accesul la locație este dezactivat pentru acest dispozitiv. Activează-l în <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Încheie apelul</translation>
 <translation id="1919345977826869612">Anunțuri</translation>
 <translation id="1919950603503897840">Selectează persoane de contact</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Ieși</translation>
 <translation id="2687403674020088961">Blochează toate cookie-urile (nu este recomandat)</translation>
 <translation id="2704606927547763573">Copiat</translation>
-<translation id="2713106313042589954">Dezactivează camera foto</translation>
 <translation id="2717722538473713889">Adrese de e-mail</translation>
 <translation id="2750481671343847896">Site-urile pot afișa solicitări de conectare de la servicii de identitate.</translation>
 <translation id="2785051990912111074">Astfel, se vor șterge cookie-urile pentru <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Întreabă înainte de a permite site-urilor să folosească camera foto (recomandat)</translation>
 <translation id="4505788138578415521">Adresă URL extinsă</translation>
 <translation id="4534723447064627427">Pentru a permite aplicației <ph name="APP_NAME" /> să acceseze microfonul, activează microfonul și în <ph name="BEGIN_LINK" />Setările Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Dezactivează sunetul microfonului</translation>
 <translation id="4570913071927164677">Detalii</translation>
 <translation id="4645575059429386691">Gestionat de părintele tău</translation>
 <translation id="4670064810192446073">Realitate virtuală</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opțiunea este disponibilă în partea de sus a ecranului</translation>
 <translation id="5197729504361054390">Persoanele de contact pe care le selectezi vor fi trimise site-ului <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Accesat ultima dată azi</translation>
-<translation id="5225463052809312700">Activează camera foto</translation>
 <translation id="5264323282659631142">Elimină „<ph name="CHIP_LABEL" />”</translation>
 <translation id="528192093759286357">Trage din partea de sus și atinge butonul Înapoi pentru a ieși din ecranul complet.</translation>
 <translation id="5300589172476337783">Afișează</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Un cookie folosit}few{# cookie-uri folosite}other{# de cookie-uri folosite}}</translation>
 <translation id="8487700953926739672">Disponibil offline</translation>
 <translation id="848952951823693243">Solicită întotdeauna site-ul mobil</translation>
-<translation id="8499083585497694743">Activează sunetul microfonului</translation>
 <translation id="851751545965956758">Blochează conectarea site-urilor la dispozitive</translation>
 <translation id="8525306231823319788">Ecran complet</translation>
 <translation id="857943718398505171">Acordată (recomandat)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
index 8604feb..0858c39 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Чтобы браузер "<ph name="APP_NAME" />" мог использовать дополненную реальность, также предоставьте ему доступ к камере в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Источник: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Для устройства отключено определение местоположения. Включите эту функцию в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Закрыть</translation>
 <translation id="1919345977826869612">Реклама</translation>
 <translation id="1919950603503897840">Выбрать контакты</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> из <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Закрыть</translation>
 <translation id="2687403674020088961">Заблокировать все файлы cookie (не рекомендуется)</translation>
 <translation id="2704606927547763573">Скопировано</translation>
-<translation id="2713106313042589954">Выключить камеру</translation>
 <translation id="2717722538473713889">Адреса электронной почты</translation>
 <translation id="2750481671343847896">Сайты могут показывать предложения войти в аккаунт от сервисов подтверждения личности.</translation>
 <translation id="2785051990912111074">Будут удалены файлы cookie для <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Запрашивать разрешение на доступ к камере (рекомендуется)</translation>
 <translation id="4505788138578415521">URL развернут</translation>
 <translation id="4534723447064627427">Чтобы у приложения "<ph name="APP_NAME" />" был доступ к микрофону, предоставьте разрешение в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Отключить микрофон</translation>
 <translation id="4570913071927164677">Подробнее…</translation>
 <translation id="4645575059429386691">Управляется вашими родителями</translation>
 <translation id="4670064810192446073">Виртуальная реальность</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Действие доступно вверху экрана</translation>
 <translation id="5197729504361054390">Сайт <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> получит доступ к выбранным контактам.</translation>
 <translation id="5216942107514965959">Последнее посещение: сегодня</translation>
-<translation id="5225463052809312700">Включить камеру</translation>
 <translation id="5264323282659631142">Удалить элемент "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Чтобы выйти из полноэкранного режима, проведите по экрану сверху вниз и нажмите кнопку "Назад".</translation>
 <translation id="5300589172476337783">Показать</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Используется 1 файл cookie}one{Используется # файл cookie}few{Используются # файла cookie}many{Используются # файлов cookie}other{Используется # файла cookie}}</translation>
 <translation id="8487700953926739672">Доступно в автономном режиме</translation>
 <translation id="848952951823693243">Всегда запрашивать мобильный сайт</translation>
-<translation id="8499083585497694743">Включить микрофон</translation>
 <translation id="851751545965956758">Не разрешать сайтам подключаться к устройствам</translation>
 <translation id="8525306231823319788">Полноэкранный режим</translation>
 <translation id="857943718398505171">Разрешено (рекомендуется)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
index c239b14..16efb1f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> හට AR භාවිත කිරීමට ඉඩ දීමට, <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ කැමරාවද ක්‍රියාත්මක කරන්න.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> සිට</translation>
 <translation id="1887786770086287077">මෙම උපාංගය සඳහා ස්ථාන ප්‍රවේශය ක්‍රියා විරහිතයි. <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ එය ක්‍රියාත්මක කරන්න.</translation>
-<translation id="1915307458270490472">විසන්ධි කරන්න</translation>
 <translation id="1919345977826869612">වෙළඳ දැන්වීම්</translation>
 <translation id="1919950603503897840">සම්බන්ධතා තෝරන්න</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">හැර යන්න</translation>
 <translation id="2687403674020088961">සියලුම කුකී අවහිර කරන්න (නිර්දේශ නොකෙරේ)</translation>
 <translation id="2704606927547763573">පිටපත් කරන ලදි</translation>
-<translation id="2713106313042589954">කැමරාව ක්‍රියාවිරහිත කරන්න</translation>
 <translation id="2717722538473713889">ඉ-තැපැල් ලිපින</translation>
 <translation id="2750481671343847896">අඩවිවලට අනන්‍යතා සේවාවලින් පිරීමේ ප්‍රේරක පෙන්විය හැකිය.</translation>
 <translation id="2785051990912111074">මෙම තේරීම <ph name="WEBSITE" /> සඳහා කුකි හිස් කරනු ඇත</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">අඩවි වලට ඔබගේ කැමරාව භාවිතා කිරීමට ඉඩ දීමට පෙර පළමුව විමසන්න (නිර්දේශිතයි)</translation>
 <translation id="4505788138578415521">URL දිග හරින ලදි</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> හට ඔබේ මයික්‍රෆෝනයට ප්‍රවේශ වීමට ඉඩ දීමට, <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ මයික්‍රෆෝනයද ක්‍රියාත්මක කරන්න.</translation>
-<translation id="4566417217121906555">මයික්‍රෆෝනය නිහඬ කරන්න</translation>
 <translation id="4570913071927164677">විස්තර</translation>
 <translation id="4645575059429386691">ඔබේ දෙමව්පියන් පාලනය කරයි</translation>
 <translation id="4670064810192446073">අතත්‍ය යථාර්ථය</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">තිරයේ ඉහළට ආසන්නව විකල්පය තිබේ</translation>
 <translation id="5197729504361054390">ඔබ තේරූ සම්බන්ධතා <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> සමඟ බෙදා ගනු ලැබේ.</translation>
 <translation id="5216942107514965959">අද අවසන් වරට පිවිසි</translation>
-<translation id="5225463052809312700">කැමරාව ක්‍රියාත්මක කරන්න</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' ඉවත් කරන්න</translation>
 <translation id="528192093759286357">ඉහළින් ඇද, පූර්ණ තිරයෙන් ඉවත් වීමට පිටුපස බොත්තම ස්පර්ශ කරන්න.</translation>
 <translation id="5300589172476337783">පෙන්වන්න</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{කුකි 1ක් භාවිතයේ ඇත}one{කුකි #ක් භාවිතයේ ඇත}other{කුකි #ක් භාවිතයේ ඇත}}</translation>
 <translation id="8487700953926739672">නොබැඳිව ලද  හැක</translation>
 <translation id="848952951823693243">සැම විට ජංගම අඩවිය ඉල්ලන්න</translation>
-<translation id="8499083585497694743">මයික්‍රෆෝනය නිහඬ කිරීම ඉවත් කරන්න</translation>
 <translation id="851751545965956758">අඩවි උපාංගවලට සම්බන්ධ වීම අවහිර කරන්න</translation>
 <translation id="8525306231823319788">සම්පුර්ණ තිරය</translation>
 <translation id="857943718398505171">ඉඩ දේ (නිර්දේශිතයි)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
index 2f6a5e7c..8ce0b29 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Fotoaparát zapnite aj v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />, aby mohla aplikácia <ph name="APP_NAME" /> používať RR.</translation>
 <translation id="1864927262126810325">Zdroj: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Prístup k polohe je v tomto zariadení vypnutý. Zapnite ho v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Zložiť</translation>
 <translation id="1919345977826869612">Reklamy</translation>
 <translation id="1919950603503897840">Výber kontaktov</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Odísť</translation>
 <translation id="2687403674020088961">Blokovať všetky súbory cookie (neodporúča sa)</translation>
 <translation id="2704606927547763573">Skopírované</translation>
-<translation id="2713106313042589954">Vypnúť kameru</translation>
 <translation id="2717722538473713889">E‑mailové adresy</translation>
 <translation id="2750481671343847896">Weby môžu zobrazovať výzvy na prihlásenie od služieb identity.</translation>
 <translation id="2785051990912111074">Týmto výberom vymažete súbory cookie webu <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pýtať sa, či chcete povoliť webu používať kameru (odporúčané)</translation>
 <translation id="4505788138578415521">Webová adresa bola rozbalená</translation>
 <translation id="4534723447064627427">Ak chcete povoliť aplikácii <ph name="APP_NAME" /> používať mikrofón, zapnite ho aj v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Vypnúť mikrofón</translation>
 <translation id="4570913071927164677">Podrobnosti</translation>
 <translation id="4645575059429386691">Spravované vaším rodičom</translation>
 <translation id="4670064810192446073">Virtuálna realita</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Možnosť je k dispozícii v hornej časti obrazovky</translation>
 <translation id="5197729504361054390">Vybrané kontakty budú zdieľané s webom <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Naposledy navštívený dnes</translation>
-<translation id="5225463052809312700">Zapnúť kameru</translation>
 <translation id="5264323282659631142">Odstrániť <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Režim celej obrazovky ukončíte potiahnutím z hornej časti a klepnutím na tlačidlo Späť.</translation>
 <translation id="5300589172476337783">Zobraziť</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Používa sa 1 súbor cookie}few{Používajú sa # súbory cookie}many{# cookies in use}other{Používa sa # súborov cookie}}</translation>
 <translation id="8487700953926739672">K dispozícii offline</translation>
 <translation id="848952951823693243">Vždy požadovať mobilný web</translation>
-<translation id="8499083585497694743">Zapnúť mikrofón</translation>
 <translation id="851751545965956758">Brániť webom pripájať sa k zariadeniam</translation>
 <translation id="8525306231823319788">Celá obrazovka</translation>
 <translation id="857943718398505171">Povolené (odporúčané)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
index 6812322..bd2ce14 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Če želite aplikaciji <ph name="APP_NAME" /> dovoliti uporabo razširjene resničnosti, prav tako vklopite fotoaparat v <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Iz: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Dostop do lokacije je izklopljen za to napravo. Vklopite ga lahko v <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Prekini</translation>
 <translation id="1919345977826869612">Oglasi</translation>
 <translation id="1919950603503897840">Izbira stikov</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Zapusti</translation>
 <translation id="2687403674020088961">Blokiranje vseh piškotkov (ni priporočljivo)</translation>
 <translation id="2704606927547763573">Kopirano</translation>
-<translation id="2713106313042589954">Izklopi kamero</translation>
 <translation id="2717722538473713889">E-poštni naslovi</translation>
 <translation id="2750481671343847896">Spletna mesta lahko prikazujejo pozive za prijavo zunanjih ponudnikov.</translation>
 <translation id="2785051990912111074">S to izbiro bodo izbrisani piškotki za spletno mesto <ph name="WEBSITE" />.</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Prikaži poziv, preden se spletnim mestom dovoli uporaba kamere (priporočeno)</translation>
 <translation id="4505788138578415521">URL je razširjen</translation>
 <translation id="4534723447064627427">Če želite aplikaciji <ph name="APP_NAME" /> omogočiti dostop do mikrofona, mikrofon vklopite tudi v <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Izklopi mikrofon</translation>
 <translation id="4570913071927164677">Podrobnosti</translation>
 <translation id="4645575059429386691">Upravlja starš</translation>
 <translation id="4670064810192446073">Navidezna resničnost</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Možnosti so na voljo blizu vrha zaslona</translation>
 <translation id="5197729504361054390">Izbrani stiki bodo v skupni rabi s spletnim mestom <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Nazadnje obiskano danes</translation>
-<translation id="5225463052809312700">Vklopi kamero</translation>
 <translation id="5264323282659631142">Odstranitev vnosa »<ph name="CHIP_LABEL" />«</translation>
 <translation id="528192093759286357">Povlecite z vrha in se dotaknite gumba za nazaj, če želite zapreti celozaslonski način.</translation>
 <translation id="5300589172476337783">Pokaži</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 piškotek v uporabi}one{# piškotek v uporabi}two{# piškotka v uporabi}few{# piškotki v uporabi}other{# piškotkov v uporabi}}</translation>
 <translation id="8487700953926739672">Na voljo brez povezave</translation>
 <translation id="848952951823693243">Vedno zahtevaj spletno mesto za mobilne naprave</translation>
-<translation id="8499083585497694743">Vklopi mikrofon</translation>
 <translation id="851751545965956758">Spletnim mestom prepreči povezovanje z napravami</translation>
 <translation id="8525306231823319788">Celozaslonsko</translation>
 <translation id="857943718398505171">Dovoljeno (priporočeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
index 1b0ab81..df00d8e5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Për të lejuar që <ph name="APP_NAME" /> të përdorë AR, aktivizo gjithashtu kamerën në <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Nga <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Qasja te vendndodhja është joaktive për këtë pajisje. Aktivizoje te <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Mbyll</translation>
 <translation id="1919345977826869612">Reklamat</translation>
 <translation id="1919950603503897840">Zgjidh kontaktet</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Largohu</translation>
 <translation id="2687403674020088961">Blloko të gjitha kukit (nuk rekomandohet)</translation>
 <translation id="2704606927547763573">Kopjuar</translation>
-<translation id="2713106313042589954">Çaktivizo kamerën</translation>
 <translation id="2717722538473713889">Adresat e email-it</translation>
 <translation id="2750481671343847896">Sajtet mund të shfaqin kërkesat për identifikim nga shërbimet e identitetit.</translation>
 <translation id="2785051990912111074">Kjo zgjedhje do të pastrojë kukit për <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pyet përpara se të lejohen sajtet të përdorin kamerën (rekomandohet)</translation>
 <translation id="4505788138578415521">URL e zgjeruar</translation>
 <translation id="4534723447064627427">Për të lejuar që <ph name="APP_NAME" /> të ketë qasje te mikrofoni yt, aktivizo gjithashtu mikrofonin në <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Çaktivizo mikrofonin</translation>
 <translation id="4570913071927164677">Detajet</translation>
 <translation id="4645575059429386691">Menaxhohet nga prindi yt</translation>
 <translation id="4670064810192446073">Realiteti virtual</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opsionet ofrohen pranë kreut të ekranit</translation>
 <translation id="5197729504361054390">Kontaktet që zgjedh do të ndahen me <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Vizituar për herë të fundit sot</translation>
-<translation id="5225463052809312700">Aktivizo kamerën</translation>
 <translation id="5264323282659631142">Hiqe "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Zvarrit nga lart dhe prek butonin e kthimit për të dalë nga ekrani i plotë.</translation>
 <translation id="5300589172476337783">Shfaq</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 kuki në përdorim}other{# kuki në përdorim}}</translation>
 <translation id="8487700953926739672">Mundësohet jashtë linje</translation>
 <translation id="848952951823693243">Kërko gjithmonë sajtin për celular</translation>
-<translation id="8499083585497694743">Aktivizo mikrofonin</translation>
 <translation id="851751545965956758">Blloko lidhjen e sajteve me pajisjet</translation>
 <translation id="8525306231823319788">Ekrani i plotë</translation>
 <translation id="857943718398505171">Lejuar (rekomandohet)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
index a19d33db..a928334 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Da biste dozvolili da <ph name="APP_NAME" /> koristi PR, uključite i kameru u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Izvor: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Pristup lokaciji je isključen za ovaj uređaj. Uključite ga u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Prekini vezu</translation>
 <translation id="1919345977826869612">Oglasi</translation>
 <translation id="1919950603503897840">Izaberite kontakte</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Zatvori</translation>
 <translation id="2687403674020088961">Blokiraj sve kolačiće (ne preporučuje se)</translation>
 <translation id="2704606927547763573">Kopirano</translation>
-<translation id="2713106313042589954">Isključi kameru</translation>
 <translation id="2717722538473713889">Imejl adrese</translation>
 <translation id="2750481671343847896">Sajtovi mogu da prikazuju upite za prijavljivanje iz usluga za identitet.</translation>
 <translation id="2785051990912111074">Ovaj izbor će obrisati kolačiće za <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Pitaj pre nego što dozvoliš sajtovima da koriste kameru (preporučeno)</translation>
 <translation id="4505788138578415521">URL je proširen</translation>
 <translation id="4534723447064627427">Da biste dozvolili da <ph name="APP_NAME" /> pristupa mikrofonu, uključite mikrofon i u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Isključi zvuk mikrofona</translation>
 <translation id="4570913071927164677">Detalji</translation>
 <translation id="4645575059429386691">Ovim upravlja tvoj roditelj</translation>
 <translation id="4670064810192446073">Virtuelna realnost</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Opcija je dostupna u vrhu ekrana</translation>
 <translation id="5197729504361054390">Kontakti koje izaberete će se deliti sa <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Poslednji posećen danas</translation>
-<translation id="5225463052809312700">Uključi kameru</translation>
 <translation id="5264323282659631142">Uklonite „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Prevucite od vrha ekrana i dodirnite dugme Nazad da biste izašli iz režima celog ekrana.</translation>
 <translation id="5300589172476337783">Prikaži</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Koristi se 1 kolačić}one{Koristi se # kolačić}few{Koriste se # kolačića}other{Koristi se # kolačića}}</translation>
 <translation id="8487700953926739672">Dostupno van mreže</translation>
 <translation id="848952951823693243">Uvek se zahteva mobilni sajt</translation>
-<translation id="8499083585497694743">Uključi zvuk mikrofona</translation>
 <translation id="851751545965956758">Onemogući sajtovima da se povezuju sa uređajima</translation>
 <translation id="8525306231823319788">Ceo ekran</translation>
 <translation id="857943718398505171">Dozvoljeno (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
index ecc7f27f..ccc21a2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Да бисте дозволили да <ph name="APP_NAME" /> користи ПР, укључите и камеру у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Извор: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Приступ локацији је искључен за овај уређај. Укључите га у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Прекини везу</translation>
 <translation id="1919345977826869612">Огласи</translation>
 <translation id="1919950603503897840">Изаберите контакте</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Затвори</translation>
 <translation id="2687403674020088961">Блокирај све колачиће (не препоручује се)</translation>
 <translation id="2704606927547763573">Копирано</translation>
-<translation id="2713106313042589954">Искључи камеру</translation>
 <translation id="2717722538473713889">Имејл адресе</translation>
 <translation id="2750481671343847896">Сајтови могу да приказују упите за пријављивање из услуга за идентитет.</translation>
 <translation id="2785051990912111074">Овај избор ће обрисати колачиће за <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Питај пре него што дозволиш сајтовима да користе камеру (препоручено)</translation>
 <translation id="4505788138578415521">URL је проширен</translation>
 <translation id="4534723447064627427">Да бисте дозволили да <ph name="APP_NAME" /> приступа микрофону, укључите микрофон и у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Искључи звук микрофона</translation>
 <translation id="4570913071927164677">Детаљи</translation>
 <translation id="4645575059429386691">Овим управља твој родитељ</translation>
 <translation id="4670064810192446073">Виртуелна реалност</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Опција је доступна у врху екрана</translation>
 <translation id="5197729504361054390">Контакти које изаберете ће се делити са <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Последњи посећен данас</translation>
-<translation id="5225463052809312700">Укључи камеру</translation>
 <translation id="5264323282659631142">Уклоните „<ph name="CHIP_LABEL" />“</translation>
 <translation id="528192093759286357">Превуците од врха екрана и додирните дугме Назад да бисте изашли из режима целог екрана.</translation>
 <translation id="5300589172476337783">Прикажи</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Користи се 1 колачић}one{Користи се # колачић}few{Користе се # колачића}other{Користи се # колачића}}</translation>
 <translation id="8487700953926739672">Доступно ван мреже</translation>
 <translation id="848952951823693243">Увек се захтева мобилни сајт</translation>
-<translation id="8499083585497694743">Укључи звук микрофона</translation>
 <translation id="851751545965956758">Онемогући сајтовима да се повезују са уређајима</translation>
 <translation id="8525306231823319788">Цео екран</translation>
 <translation id="857943718398505171">Дозвољено (препоручено)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
index 99ccdc9..5134159f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Om du vill att <ph name="APP_NAME" /> ska använda AR måste du även aktivera kameran i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Från <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Platsåtkomst har inaktiverats på enheten. Aktivera det i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Lägg på</translation>
 <translation id="1919345977826869612">Annonser</translation>
 <translation id="1919950603503897840">Välj kontakter</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Lämna</translation>
 <translation id="2687403674020088961">Blockera alla cookies (rekommenderas inte)</translation>
 <translation id="2704606927547763573">Kopierat</translation>
-<translation id="2713106313042589954">Stäng av kameran</translation>
 <translation id="2717722538473713889">E-postadresser</translation>
 <translation id="2750481671343847896">Webbplatser får visa inloggningsmeddelanden från identitetstjänster.</translation>
 <translation id="2785051990912111074">Detta rensar cookies för <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Fråga innan webbplatser tillåts att använda kameran (rekommenderas)</translation>
 <translation id="4505788138578415521">Webbadressen har utökats</translation>
 <translation id="4534723447064627427">Om du vill ge <ph name="APP_NAME" /> åtkomst till mikrofonen måste du även aktivera mikrofonen i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Stäng av mikrofonen</translation>
 <translation id="4570913071927164677">Information</translation>
 <translation id="4645575059429386691">Hanteras av din förälder</translation>
 <translation id="4670064810192446073">Virtuell verklighet</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Alternativet visas högt upp på skärmen</translation>
 <translation id="5197729504361054390">Kontakterna du väljer delas med <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Besöktes senast i dag</translation>
-<translation id="5225463052809312700">Slå på kameran</translation>
 <translation id="5264323282659631142">Ta bort <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">Dra uppifrån och tryck på bakåtknappen för att lämna helskärmsläget.</translation>
 <translation id="5300589172476337783">Visa</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie används}other{# cookies används}}</translation>
 <translation id="8487700953926739672">Tillgänglig offline</translation>
 <translation id="848952951823693243">Begär alltid mobilversionen</translation>
-<translation id="8499083585497694743">Slå på mikrofonen</translation>
 <translation id="851751545965956758">Förhindra att webbplatser ansluter till enheter</translation>
 <translation id="8525306231823319788">Helskärm</translation>
 <translation id="857943718398505171">Tillåten (rekommenderas)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
index 07c4679..b4a5c5b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Ili uruhusu <ph name="APP_NAME" /> itumie Uhalisia Ulioboreshwa, washa pia kamera katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Kutoka <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Kipengele cha mahali kimezimwa kwenye kifaa hiki. Kiwashe katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Kata simu</translation>
 <translation id="1919345977826869612">Matangazo</translation>
 <translation id="1919950603503897840">Chagua anwani</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Ondoka</translation>
 <translation id="2687403674020088961">Zuia vidakuzi vyote (haipendekezwi)</translation>
 <translation id="2704606927547763573">Imenakiliwa</translation>
-<translation id="2713106313042589954">Zima kamera</translation>
 <translation id="2717722538473713889">Anwani za barua pepe</translation>
 <translation id="2750481671343847896">Tovuti inaweza kuonyesha vidokezo vya kuingia katika akaunti kutoka kwa huduma za utambulisho.</translation>
 <translation id="2785051990912111074">Chaguo hili litafuta vidakuzi vya <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Uliza kwanza kabla ya kuruhusu tovuti zitumie kamera yako (inapendekezwa)</translation>
 <translation id="4505788138578415521">URL imepanuliwa</translation>
 <translation id="4534723447064627427">Ili uruhusu <ph name="APP_NAME" /> ifikie maikrofoni yako, washa pia maikrofoni katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Zima maikrofoni</translation>
 <translation id="4570913071927164677">Maelezo</translation>
 <translation id="4645575059429386691">Inadhibitiwa na wazazi wako</translation>
 <translation id="4670064810192446073">Uhalisia pepe</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Chaguo linapatikana karibu na sehemu ya juu ya skrini</translation>
 <translation id="5197729504361054390">Anwani unazochagua zitashirikiwa na <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Ilitembelewa mara ya mwisho leo</translation>
-<translation id="5225463052809312700">Washa kamera</translation>
 <translation id="5264323282659631142">Ondoa '<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Buruta kutoka juu na uguse kitufe cha kurudi nyuma ili uondoke kwenye skrini nzima.</translation>
 <translation id="5300589172476337783">Onyesha</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Zuia tovuti zisitumie data na vifaa vyako vya uhalisia pepe</translation>
 <translation id="6447842834002726250">Vidakuzi</translation>
+<translation id="6467852467360539617">Futa data na uweke upya ruhusa</translation>
 <translation id="6527303717912515753">Shiriki</translation>
 <translation id="6545864417968258051">Kutafuta Bluetooth</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Umezuia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine <ph name="NUM_MORE" />}other{Umezuia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine <ph name="NUM_MORE" />}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378">Umechagua <ph name="ITEM_COUNT" /></translation>
 <translation id="7260727271532453612">Umeruhusu <ph name="PERMISSION_1" /> na <ph name="PERMISSION_2" /></translation>
 <translation id="7302486331832100261">Huwa unazuia arifa. Ili uziruhusu, gusa Maelezo.</translation>
+<translation id="7383715096023715447">Mipangilio ya <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Uliza kwanza</translation>
 <translation id="7423538860840206698">Imezuiwa kusoma ubao wa kunakili</translation>
 <translation id="7425915948813553151">Mandhari meusi ya tovuti</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Kidakuzi kimoja kinatumika}other{Vidakuzi # vinatumika}}</translation>
 <translation id="8487700953926739672">Kinapatikana nje ya mtandao</translation>
 <translation id="848952951823693243">Omba tovuti katika mwonekano wa kifaa cha mkononi kila wakati</translation>
-<translation id="8499083585497694743">Washa maikrofoni</translation>
 <translation id="851751545965956758">Zuia tovuti zisiunganishe kwenye vifaa</translation>
 <translation id="8525306231823319788">Skrini nzima</translation>
 <translation id="857943718398505171">Imeruhusiwa (inapendekezwa)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
index bb37fa4..cf3a5b7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">ARரைப் பயன்படுத்த <ph name="APP_NAME" /> ஆப்ஸை அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> கேமராவிற்கான அனுமதியை இயக்கவும்.</translation>
 <translation id="1864927262126810325">மூலம்: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">இந்தச் சாதனத்திற்கான இருப்பிட அணுகல் முடக்கப்பட்டுள்ளது. அதை <ph name="BEGIN_LINK" />Android அமைப்புகளில்<ph name="END_LINK" /> இயக்கவும்.</translation>
-<translation id="1915307458270490472">மூடுக</translation>
 <translation id="1919345977826869612">விளம்பரங்கள்</translation>
 <translation id="1919950603503897840">தொடர்புகளைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">வெளியேறு</translation>
 <translation id="2687403674020088961">அனைத்துக் குக்கீகளையும் தடுக்கும் (பரிந்துரைக்கப்படவில்லை)</translation>
 <translation id="2704606927547763573">நகலெடுக்கப்பட்டது</translation>
-<translation id="2713106313042589954">கேமராவை முடக்கு</translation>
 <translation id="2717722538473713889">மின்னஞ்சல் முகவரிகள்</translation>
 <translation id="2750481671343847896">அடையாளச் சேவைகளில் இருந்து வரும் உள்நுழைவு அறிவிப்புகளைத் தளங்கள் காட்டும்.</translation>
 <translation id="2785051990912111074">இதைச் செய்தால் <ph name="WEBSITE" /> தளத்திற்கான குக்கீகள் அழிக்கப்படும்</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">எனது கேமராவைப் பயன்படுத்தத் தளங்களை அனுமதிக்கும் முன் கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="4505788138578415521">URL விரிவாக்கப்பட்டது</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> ஆப்ஸ் உங்கள் மைக்ரோஃபோனை அணுக அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> மைக்ரோஃபோனுக்கான அனுமதியை இயக்கவும்.</translation>
-<translation id="4566417217121906555">மைக்ரோஃபோனை ஒலியடக்கு</translation>
 <translation id="4570913071927164677">விவரங்கள்</translation>
 <translation id="4645575059429386691">உங்கள் பெற்றோரால் நிர்வகிக்கப்படுகிறது</translation>
 <translation id="4670064810192446073">விர்ச்சுவல் ரியாலிட்டி</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">அதற்கான விருப்பம் திரையின் மேற்பகுதியில் உள்ளது</translation>
 <translation id="5197729504361054390">நீங்கள் தேர்ந்தெடுக்கும் தொடர்புகள் <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> உடன் பகிரப்படும்.</translation>
 <translation id="5216942107514965959">கடைசியாகப் பார்த்தது: இன்று</translation>
-<translation id="5225463052809312700">கேமராவை இயக்கு</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />' ஐ அகற்றும்</translation>
 <translation id="528192093759286357">முழுத்திரையிலிருந்து வெளியேற, மேலிருந்து இழுத்து "முந்தையது" பட்டனைத் தொடவும்.</translation>
 <translation id="5300589172476337783">காண்பி</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 குக்கீ உபயோகத்தில் உள்ளது}other{# குக்கீகள் உபயோகத்தில் உள்ளன}}</translation>
 <translation id="8487700953926739672">ஆஃப்லைனில் இருக்கிறது</translation>
 <translation id="848952951823693243">எப்போதும் மொபைல் காட்சியில் காட்டப்படுபவை</translation>
-<translation id="8499083585497694743">மைக்ரோஃபோனின் ஒலியை இயக்கு</translation>
 <translation id="851751545965956758">சாதனங்களை இணைப்பதிலிருந்து தளங்களைத் தடுக்கும்</translation>
 <translation id="8525306231823319788">முழுத்திரை</translation>
 <translation id="857943718398505171">அனுமதிக்கப்பட்டது (பரிந்துரைத்தது)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
index 08b821fd..35b37f4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">ARని వినియోగించడానికి <ph name="APP_NAME" />ని అనుమతించేందుకు, <ph name="BEGIN_LINK" />Android సెట్టింగ్‌ల<ph name="END_LINK" />లో కూడా కెమెరాను ఆన్ చేయండి.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> నుండి</translation>
 <translation id="1887786770086287077">ఈ పరికరానికి స్థానం యాక్సెస్ ఆఫ్ చేయబడింది. దీనిని <ph name="BEGIN_LINK" />Android సెట్టింగ్‌లు<ph name="END_LINK" />లో తిరిగి ఆన్ చేయండి.</translation>
-<translation id="1915307458270490472">కాల్‌ను ముగించు</translation>
 <translation id="1919345977826869612">యాడ్స్</translation>
 <translation id="1919950603503897840">కాంటాక్ట్‌లను ఎంచుకోండి</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">నిష్క్రమించండి</translation>
 <translation id="2687403674020088961">అన్ని కుక్కీలను బ్లాక్ చేయండి (సిఫార్సు చేయడం లేదు)</translation>
 <translation id="2704606927547763573">కాపీ చేయబడింది</translation>
-<translation id="2713106313042589954">కెమెరాను ఆఫ్ చేయి</translation>
 <translation id="2717722538473713889">ఈమెయిల్‌ అడ్రస్‌లు</translation>
 <translation id="2750481671343847896">గుర్తింపు సర్వీస్‌ల నుండి సైన్-ఇన్ ప్రాంప్ట్‌లను సైట్‌లు చూపగలవు.</translation>
 <translation id="2785051990912111074">దీనిని ఎంచుకోవడం ద్వారా <ph name="WEBSITE" />కు సంబంధించిన కుక్కీలు క్లియర్ చేయబడతాయి</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">మీ కెమెరాను ఏవైనా సైట్‌లు ఉపయోగించగలిగేలా వాటిని అనుమతించే ముందు, మిమ్మల్ని అడుగుతుంది (సిఫార్సు చేయబడింది)</translation>
 <translation id="4505788138578415521">URL విస్తరించబడింది</translation>
 <translation id="4534723447064627427">మీ మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి <ph name="APP_NAME" />ని అనుమతించేందుకు, <ph name="BEGIN_LINK" />Android సెట్టింగ్‌ల<ph name="END_LINK" />లో కూడా మైక్రోఫోన్‌ను ఆన్ చేయండి.</translation>
-<translation id="4566417217121906555">మైక్రోఫోన్‌ను మ్యూట్ చేయి</translation>
 <translation id="4570913071927164677">వివరాలు</translation>
 <translation id="4645575059429386691">మీ తల్లి/తండ్రి ద్వారా నిర్వహించబడుతోంది</translation>
 <translation id="4670064810192446073">వర్చువల్ రియాలిటీ</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ఆప్షన్ స్క్రీన్ పైభాగానికి సమీపంలో అందుబాటులో ఉంటుంది</translation>
 <translation id="5197729504361054390">మీరు ఎంచుకున్న కాంటాక్ట్‌లు <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />తో షేర్ చేయబడతాయి.</translation>
 <translation id="5216942107514965959">చివరిగా ఈరోజు సందర్శించారు</translation>
-<translation id="5225463052809312700">కెమెరాను ఆన్ చేయి</translation>
 <translation id="5264323282659631142">'<ph name="CHIP_LABEL" />'ను తీసివేయండి</translation>
 <translation id="528192093759286357">ఫుల్-స్క్రీన్‌ నుండి నిష్క్రమించడానికి పైనుండి లాగి, వెనుకకు బటన్‌ను తాకండి.</translation>
 <translation id="5300589172476337783">చూపించు</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">మీ వర్చువల్ రియాలిటీ పరికరాన్ని, డేటాను ఉపయోగించనివ్వకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
 <translation id="6447842834002726250">కుక్కీలు</translation>
+<translation id="6467852467360539617">డేటాను క్లియర్ చేయండి &amp; అనుమతులను రీసెట్ చేయండి</translation>
 <translation id="6527303717912515753">షేర్ చేయండి</translation>
 <translation id="6545864417968258051">బ్లూటూత్ స్కానింగ్</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" /> బ్లాక్ చేయబడ్డాయి}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" /> బ్లాక్ చేయబడ్డాయి}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ఎంచుకోబడ్డాయి</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> అనుమతించబడ్డాయి</translation>
 <translation id="7302486331832100261">మీరు సాధారణంగా నోటిఫికేషన్‌లను బ్లాక్ చేస్తుంటారు. అనుమతించడానికి, 'వివరాలు'ను నొక్కండి.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> కోసం సెట్టింగ్‌లు</translation>
 <translation id="7423098979219808738">ముందుగా అడుగుతుంది</translation>
 <translation id="7423538860840206698">క్లిప్‌బోర్డ్‌ని చదవకుండా బ్లాక్ చేశారు</translation>
 <translation id="7425915948813553151">సైట్‌ల కోసం ముదురు రంగు రూపం</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 కుక్కీ ఉపయోగంలో ఉంది}other{# కుక్కీలు ఉపయోగంలో ఉన్నాయి}}</translation>
 <translation id="8487700953926739672">ఆఫ్‌లైన్‌లో అందుబాటు</translation>
 <translation id="848952951823693243">ఎల్లప్పుడూ మొబైల్ సైట్ కోసం రిక్వెస్ట్ చేయండి</translation>
-<translation id="8499083585497694743">మైక్రోఫోన్‌ను అన్‌మ్యూట్ చేయి</translation>
 <translation id="851751545965956758">పరికరాలకు కనెక్ట్ కాకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
 <translation id="8525306231823319788">ఫుల్-స్క్రీన్‌</translation>
 <translation id="857943718398505171">అనుమతించబడింది (సిఫార్సు చేయబడింది)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
index 57807df..3f6209b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">หากต้องการอนุญาตให้ <ph name="APP_NAME" /> ใช้ AR ให้เปิดใช้กล้องใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /> ด้วย</translation>
 <translation id="1864927262126810325">จาก <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">ตอนนี้ตำแหน่งสำหรับอุปกรณ์เครื่องนี้ปิดอยู่ เปิดตำแหน่งได้ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
-<translation id="1915307458270490472">วางซ้อนไว้ด้านบน</translation>
 <translation id="1919345977826869612">โฆษณา</translation>
 <translation id="1919950603503897840">เลือกรายชื่อติดต่อ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">ออก</translation>
 <translation id="2687403674020088961">บล็อกคุกกี้ทั้งหมด (ไม่แนะนำ)</translation>
 <translation id="2704606927547763573">คัดลอกแล้ว</translation>
-<translation id="2713106313042589954">ปิดกล้อง</translation>
 <translation id="2717722538473713889">อีเมล</translation>
 <translation id="2750481671343847896">เว็บไซต์สามารถแสดงข้อความแจ้งให้ลงชื่อเข้าใช้จากบริการระบุตัวตนได้</translation>
 <translation id="2785051990912111074">ตัวเลือกนี้จะล้างคุกกี้ของ <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ใช้กล้องถ่ายรูปของคุณ (แนะนำ)</translation>
 <translation id="4505788138578415521">ขยาย URL แล้ว</translation>
 <translation id="4534723447064627427">หากต้องการอนุญาตให้ <ph name="APP_NAME" /> เข้าถึงไมโครโฟน ให้เปิดใช้ไมโครโฟนใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /> ด้วย</translation>
-<translation id="4566417217121906555">ปิดเสียงไมโครโฟน</translation>
 <translation id="4570913071927164677">รายละเอียด</translation>
 <translation id="4645575059429386691">มีการจัดการโดยผู้ปกครอง</translation>
 <translation id="4670064810192446073">Virtual Reality</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">ตัวเลือกอยู่ตรงบริเวณด้านบนของหน้าจอ</translation>
 <translation id="5197729504361054390">ระบบจะแชร์รายชื่อติดต่อที่คุณเลือกกับ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /></translation>
 <translation id="5216942107514965959">เข้าชมล่าสุดวันนี้</translation>
-<translation id="5225463052809312700">เปิดกล้อง</translation>
 <translation id="5264323282659631142">นำ "<ph name="CHIP_LABEL" />" ออก</translation>
 <translation id="528192093759286357">ลากจากด้านบน แล้วแตะปุ่มกลับเพื่อออกจากโหมดเต็มหน้าจอ</translation>
 <translation id="5300589172476337783">แสดง</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{ใช้คุกกี้อยู่ 1 รายการ}other{ใช้คุกกี้อยู่ # รายการ}}</translation>
 <translation id="8487700953926739672">ใช้งานแบบออฟไลน์ได้</translation>
 <translation id="848952951823693243">ขอเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่เสมอ</translation>
-<translation id="8499083585497694743">เปิดเสียงไมโครโฟน</translation>
 <translation id="851751545965956758">บล็อกเว็บไซต์ไม่ให้เชื่อมต่อกับอุปกรณ์</translation>
 <translation id="8525306231823319788">เต็มหน้าจอ</translation>
 <translation id="857943718398505171">อนุญาตแล้ว (แนะนำ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
index 38dd07f49..225c0ec 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> uygulamasının artırılmış gerçekliği (AR) kullanması için <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> kamerayı da açın.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> kaynağından</translation>
 <translation id="1887786770086287077">Konum erişimi bu cihaz için kapalı. Konum erişimini <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'ndan açın.</translation>
-<translation id="1915307458270490472">Kapat</translation>
 <translation id="1919345977826869612">Reklamlar</translation>
 <translation id="1919950603503897840">Kişi seçin</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Çık</translation>
 <translation id="2687403674020088961">Tüm çerezleri engelle (önerilmez)</translation>
 <translation id="2704606927547763573">Kopyalandı</translation>
-<translation id="2713106313042589954">Kamerayı kapat</translation>
 <translation id="2717722538473713889">E-posta adresleri</translation>
 <translation id="2750481671343847896">Siteler, kimlik hizmetlerinden gelen oturum açma istemlerini gösterebilir.</translation>
 <translation id="2785051990912111074">Bu tercih, <ph name="WEBSITE" /> çerezlerini temizler</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Sitelerin, kameranızı kullanmasına izin verilmeden önce size sorulsun (önerilir)</translation>
 <translation id="4505788138578415521">URL genişletildi</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> uygulamasının mikrofonunuza erişebilmesi için <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda da mikrofonu açın.</translation>
-<translation id="4566417217121906555">Mikrofonun sesini kapat</translation>
 <translation id="4570913071927164677">Ayrıntılar</translation>
 <translation id="4645575059429386691">Ebeveyniniz tarafından yönetiliyor</translation>
 <translation id="4670064810192446073">Sanal gerçeklik</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Seçenek, ekranın üst kısmına yakın bir yerdedir</translation>
 <translation id="5197729504361054390">Seçtiğiniz kişiler <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ile paylaşılacak.</translation>
 <translation id="5216942107514965959">En son bugün ziyaret edildi</translation>
-<translation id="5225463052809312700">Kamerayı aç</translation>
 <translation id="5264323282659631142">"<ph name="CHIP_LABEL" />" çipini kaldır</translation>
 <translation id="528192093759286357">Tam ekrandan çıkmak için yukarıdan sürükleyin ve geri düğmesine dokunun.</translation>
 <translation id="5300589172476337783">Göster</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Sitelerin sanal gerçeklik cihazımı ve verilerimi kullanmasını engelle</translation>
 <translation id="6447842834002726250">Çerezler</translation>
+<translation id="6467852467360539617">Verileri temizle ve izinleri sıfırla</translation>
 <translation id="6527303717912515753">Paylaş</translation>
 <translation id="6545864417968258051">Bluetooth taraması</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> izin daha engellendi}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> izin daha engellendi}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> öğe seçildi</translation>
 <translation id="7260727271532453612"><ph name="PERMISSION_1" /> ve <ph name="PERMISSION_2" /> için izin verildi</translation>
 <translation id="7302486331832100261">Genelde bildirimleri engelliyorsunuz. İzin vermek için Ayrıntılar'a dokunun.</translation>
+<translation id="7383715096023715447"><ph name="DOMAIN" /> ayarları</translation>
 <translation id="7423098979219808738">Önce sor</translation>
 <translation id="7423538860840206698">Pano okuma engellendi</translation>
 <translation id="7425915948813553151">Siteler için koyu tema</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 çerez kullanımda}other{# çerez kullanımda}}</translation>
 <translation id="8487700953926739672">Çevrimdışı kullanılabilir</translation>
 <translation id="848952951823693243">Her zaman mobil siteyi iste</translation>
-<translation id="8499083585497694743">Mikrofonun sesini aç</translation>
 <translation id="851751545965956758">Sitelerin cihazlara bağlanmasını engelle</translation>
 <translation id="8525306231823319788">Tam ekran</translation>
 <translation id="857943718398505171">İzin verildi (önerilir)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
index 7dee1a4..1bf941ad 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Щоб дозволити додатку <ph name="APP_NAME" /> використовувати доповнену реальність, увімкніть камеру в <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Джерело: <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">На цьому пристрої вимкнено доступ до геоданих. Увімкніть його в <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Закрити</translation>
 <translation id="1919345977826869612">Оголошення</translation>
 <translation id="1919950603503897840">Виберіть контакти</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Вийти</translation>
 <translation id="2687403674020088961">Блокувати всі файли cookie (не рекомендовано)</translation>
 <translation id="2704606927547763573">Скопійов.</translation>
-<translation id="2713106313042589954">Вимкнути камеру</translation>
 <translation id="2717722538473713889">Електронні адреси</translation>
 <translation id="2750481671343847896">Сайти можуть показувати підказки щодо входу від сервісів ідентифікації</translation>
 <translation id="2785051990912111074">Буде видалено файли cookie для веб-сайту <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Запитувати, перш ніж дозволити сайтам використовувати камеру (рекомендується)</translation>
 <translation id="4505788138578415521">URL-адресу розгорнуто</translation>
 <translation id="4534723447064627427">Щоб надати додатку <ph name="APP_NAME" /> доступ до мікрофона, також увімкніть його в <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Вимкнути мікрофон</translation>
 <translation id="4570913071927164677">Деталі</translation>
 <translation id="4645575059429386691">Керується одним із батьків</translation>
 <translation id="4670064810192446073">Віртуальна реальність</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Для цього натисніть відповідну кнопку вгорі екрана</translation>
 <translation id="5197729504361054390">Веб-сайт <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> отримає доступ до вибраних контактів.</translation>
 <translation id="5216942107514965959">Останнє відвідування: сьогодні</translation>
-<translation id="5225463052809312700">Увімкнути камеру</translation>
 <translation id="5264323282659631142">Видалити запит "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Щоб вийти з повноекранного режиму, проведіть пальцем по екрану згори вниз і торкніться кнопки "Назад".</translation>
 <translation id="5300589172476337783">Показати</translation>
@@ -243,6 +239,7 @@
 <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
 <translation id="6439114592976064011">Заборонити сайтам доступ до даних і пристрою віртуальної реальності</translation>
 <translation id="6447842834002726250">Файли cookie</translation>
+<translation id="6467852467360539617">Очистити дані та скинути дозволи</translation>
 <translation id="6527303717912515753">Надіслати</translation>
 <translation id="6545864417968258051">Пошук пристроїв Bluetooth</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Заблоковано: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}one{Заблоковано: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}few{Заблоковано: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}many{Заблоковано: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}other{Заблоковано: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}}</translation>
@@ -282,6 +279,7 @@
 <translation id="7250468141469952378">Вибрано <ph name="ITEM_COUNT" /></translation>
 <translation id="7260727271532453612">Дозволено: "<ph name="PERMISSION_1" />" і "<ph name="PERMISSION_2" />"</translation>
 <translation id="7302486331832100261">Зазвичай ви блокуєте сповіщення. Щоб дозволити, натисніть "Деталі".</translation>
+<translation id="7383715096023715447">Налаштування для домену <ph name="DOMAIN" /></translation>
 <translation id="7423098979219808738">Спершу запитувати</translation>
 <translation id="7423538860840206698">Заборонено переглядати буфер обміну</translation>
 <translation id="7425915948813553151">Темна тема для сайтів</translation>
@@ -341,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Використовується 1 файл cookie}one{Використовується # файл cookie}few{Використовуються # файли cookie}many{Використовуються # файлів cookie}other{Використовуються # файлу cookie}}</translation>
 <translation id="8487700953926739672">Доступ у режимі офлайн</translation>
 <translation id="848952951823693243">Завжди запитувати мобільний сайт</translation>
-<translation id="8499083585497694743">Увімкнути мікрофон</translation>
 <translation id="851751545965956758">Заборонити сайтам підключатися до пристроїв</translation>
 <translation id="8525306231823319788">На весь екран</translation>
 <translation id="857943718398505171">Дозволено (рекомендується)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
index e8a011b..174837e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">‏<ph name="APP_NAME" /> کو AR کا استعمال کرنے دینے کے لیے، <ph name="BEGIN_LINK" />Android ترتیبات<ph name="END_LINK" /> میں بھی کیمرا آن کریں۔</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> سے</translation>
 <translation id="1887786770086287077">‏مقام کی رسائی اس آلہ کے لیے آف ہے۔ <ph name="BEGIN_LINK" />Android کی ترتیبات<ph name="END_LINK" />.میں اسے آن کریں۔</translation>
-<translation id="1915307458270490472">کال منقطع کریں</translation>
 <translation id="1919345977826869612">اشتہارات</translation>
 <translation id="1919950603503897840">رابطے منتخب کریں</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">چھوڑیں</translation>
 <translation id="2687403674020088961">سبھی کوکیز مسدود کریں (تجویز نہیں کی جاتی ہے)</translation>
 <translation id="2704606927547763573">کاپی کیا</translation>
-<translation id="2713106313042589954">کیمرا آف کریں</translation>
 <translation id="2717722538473713889">ای میل پتے</translation>
 <translation id="2750481671343847896">سائٹس شناختی سروسز سے سائن ان پرامپٹس دکھا سکتی ہیں۔</translation>
 <translation id="2785051990912111074">یہ انتخاب <ph name="WEBSITE" /> کے لیے کوکیز کو صاف کرے گا</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">سائٹس کو آپ کا کیمرا استعمال کرنے کی اجازت دینے سے پہلے پوچھیں (تجویز کردہ)</translation>
 <translation id="4505788138578415521">‏URL کو پھیلا دیا گیا</translation>
 <translation id="4534723447064627427">‏<ph name="APP_NAME" /> کو اپنے مائیکروفون تک رسائی دینے کے لیے، <ph name="BEGIN_LINK" />Android کی ترتیبات<ph name="END_LINK" /> میں بھی مائیکروفون آن کریں۔</translation>
-<translation id="4566417217121906555">مائیکروفون کو خاموش کریں</translation>
 <translation id="4570913071927164677">تفاصیل</translation>
 <translation id="4645575059429386691">آپ کے والدین کے زیر انتظام</translation>
 <translation id="4670064810192446073">ورچوئل رئیلٹی</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">اسکرین کے اوپری حصہ کے قریب اختیار دستیاب ہے</translation>
 <translation id="5197729504361054390">آپ کے منتخب کردہ رابطوں کا <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> کے ساتھ اشتراک کیا جائے گا۔</translation>
 <translation id="5216942107514965959">آخری بار آج ملاحظہ کیا گیا</translation>
-<translation id="5225463052809312700">کیمرا آن کریں</translation>
 <translation id="5264323282659631142">’<ph name="CHIP_LABEL" />‘ ہٹائیں</translation>
 <translation id="528192093759286357">پوری اسکرین سے باہر نکلنے کیلئے اوپر سے گھسیٹیں اور پیچھے جائیں بٹن کو ٹچ کریں۔</translation>
 <translation id="5300589172476337783">دکھائیں</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 زیر استعمال کوکی}other{# زیر استعمال کوکیز}}</translation>
 <translation id="8487700953926739672">آف لائن دستیاب ہے</translation>
 <translation id="848952951823693243">ہمیشہ موبائل سائٹ کی درخواست کریں</translation>
-<translation id="8499083585497694743">مائیکروفون کی آواز چالو کریں</translation>
 <translation id="851751545965956758">سائٹس کو آلات سے منسلک ہونے سے مسدود کریں</translation>
 <translation id="8525306231823319788">پوری اسکرین</translation>
 <translation id="857943718398505171">اجازت یافتہ (تجویز کردہ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
index 578407f..bc2c1f1 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587"><ph name="APP_NAME" /> AR ishlatishi uchun <ph name="BEGIN_LINK" />Android sozlamalari<ph name="END_LINK" /> orqali kamerani yoqing.</translation>
 <translation id="1864927262126810325"><ph name="SOURCE_NAME" />dan</translation>
 <translation id="1887786770086287077">Bu qurilmada Joylashuvni aniqlash xizmati yoqilmagan, uni <ph name="BEGIN_LINK" />Android sozlamalari<ph name="END_LINK" /> orqali yoqing.</translation>
-<translation id="1915307458270490472">Tugatish</translation>
 <translation id="1919345977826869612">Reklamalar</translation>
 <translation id="1919950603503897840">Kontaktlarni tanlash</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Tark etish</translation>
 <translation id="2687403674020088961">Barcha cookie fayllarini taqiqlash (tavsiya etilmaydi)</translation>
 <translation id="2704606927547763573">Nusxa olindi</translation>
-<translation id="2713106313042589954">Kamerani faolsizlantirish</translation>
 <translation id="2717722538473713889">Email manzillar</translation>
 <translation id="2750481671343847896">Saytlar shaxsni tasdiqlash xizmatlariga kirish oynalarini chiqarishi mumkin</translation>
 <translation id="2785051990912111074">Bunda <ph name="WEBSITE" /> cookie fayllari tozalanadi</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Kameradan foydalanishga ruxsat so‘ralsin (tavsiya etiladi)</translation>
 <translation id="4505788138578415521">URL manzil yoyildi</translation>
 <translation id="4534723447064627427"><ph name="APP_NAME" /> mikrofondan foydalanishiga ruxsat berish uchun <ph name="BEGIN_LINK" />Android sozlamalari<ph name="END_LINK" /> orqali mikrofonni yoqing.</translation>
-<translation id="4566417217121906555">Mikrofonni ovozsiz qilish</translation>
 <translation id="4570913071927164677">Tafsilotlar</translation>
 <translation id="4645575059429386691">Ota-onangiz tomonidan boshqariladi</translation>
 <translation id="4670064810192446073">Virtual reallik</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Parametr ekranning yuqoriroq qismida joylashgan</translation>
 <translation id="5197729504361054390">Tanlangan kontaktlar <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> saytiga ulashiladi.</translation>
 <translation id="5216942107514965959">Oxirgi tashrif: bugun</translation>
-<translation id="5225463052809312700">Kamerani yoqish</translation>
 <translation id="5264323282659631142">Olib tashlash: <ph name="CHIP_LABEL" /></translation>
 <translation id="528192093759286357">To‘liq ekran rejimidan chiqish uchun ekranni tepadan pastga torting va “Orqaga” tugmasini bosing.</translation>
 <translation id="5300589172476337783">Ko‘rsatish</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 ta cookie fayl ishlatilmoqda}other{# ta cookie fayl ishlatilmoqda}}</translation>
 <translation id="8487700953926739672">Internetsiz foydalanish mumkin</translation>
 <translation id="848952951823693243">Har doim mobil versiya ochilsin</translation>
-<translation id="8499083585497694743">Mikrofon ovozini yoqish</translation>
 <translation id="851751545965956758">Saytlarga qurilmalarga ulanishni taqiqlash</translation>
 <translation id="8525306231823319788">To‘liq ekran rejimi</translation>
 <translation id="857943718398505171">Ruxsat berilgan (tavsiya etiladi)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
index 51b70c11..95c269bd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Để cho phép <ph name="APP_NAME" /> sử dụng công nghệ thực tế tăng cường (AR), hãy bật cả máy ảnh trong phần <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Từ <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Đã tắt quyền truy cập vị trí đối với thiết bị này. Hãy bật trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Kết thúc</translation>
 <translation id="1919345977826869612">Quảng cáo</translation>
 <translation id="1919950603503897840">Chọn mục liên hệ</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Rời khỏi</translation>
 <translation id="2687403674020088961">Chặn tất cả cookie (không khuyến nghị)</translation>
 <translation id="2704606927547763573">Đã sao chép</translation>
-<translation id="2713106313042589954">Tắt máy ảnh</translation>
 <translation id="2717722538473713889">Địa chỉ email</translation>
 <translation id="2750481671343847896">Các trang web có thể đưa ra lời nhắc đăng nhập từ các dịch vụ nhận dạng.</translation>
 <translation id="2785051990912111074">Lựa chọn này sẽ xóa cookie của <ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Hỏi trước trước khi cho phép các trang web sử dụng máy ảnh của bạn (được đề xuất)</translation>
 <translation id="4505788138578415521">URL đã được mở rộng</translation>
 <translation id="4534723447064627427">Để cho phép <ph name="APP_NAME" /> truy cập vào micrô của bạn, hãy bật cả micrô trong phần <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Tắt micrô</translation>
 <translation id="4570913071927164677">Chi tiết</translation>
 <translation id="4645575059429386691">Do cha mẹ của bạn quản lý</translation>
 <translation id="4670064810192446073">Thực tế ảo</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Tùy chọn này ở gần đầu màn hình</translation>
 <translation id="5197729504361054390">Những người liên hệ bạn chọn sẽ được chia sẻ với <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Lần truy cập gần đây nhất: hôm nay</translation>
-<translation id="5225463052809312700">Bật máy ảnh</translation>
 <translation id="5264323282659631142">Xóa "<ph name="CHIP_LABEL" />"</translation>
 <translation id="528192093759286357">Kéo từ trên xuống và chạm vào nút quay lại để thoát khỏi chế độ toàn màn hình.</translation>
 <translation id="5300589172476337783">Hiển thị</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 cookie đang được sử dụng}other{# cookie đang được sử dụng}}</translation>
 <translation id="8487700953926739672">Có thể dùng khi không có mạng</translation>
 <translation id="848952951823693243">Luôn yêu cầu trang web dành cho thiết bị di động</translation>
-<translation id="8499083585497694743">Bật micrô</translation>
 <translation id="851751545965956758">Chặn các trang web kết nối với thiết bị</translation>
 <translation id="8525306231823319788">Toàn màn hình</translation>
 <translation id="857943718398505171">Được phép (nên dùng)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
index 860db03..249566f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">若要允许 <ph name="APP_NAME" /> 使用 AR 功能,您还需在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启摄像头。</translation>
 <translation id="1864927262126810325">来自<ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">此设备的位置信息使用权已关闭;若想开启这项权限,请转到 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />。</translation>
-<translation id="1915307458270490472">中止</translation>
 <translation id="1919345977826869612">广告</translation>
 <translation id="1919950603503897840">选择联系人</translation>
 <translation id="1923695749281512248">已下载 <ph name="BYTES_DOWNLOADED_WITH_UNITS" />,共 <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">离开</translation>
 <translation id="2687403674020088961">阻止所有 Cookie(不建议)</translation>
 <translation id="2704606927547763573">已复制</translation>
-<translation id="2713106313042589954">关闭摄像头</translation>
 <translation id="2717722538473713889">电子邮件地址</translation>
 <translation id="2750481671343847896">网站可以显示来自身份服务的登录提示。</translation>
 <translation id="2785051990912111074">此选项会清除 <ph name="WEBSITE" /> 的 Cookie</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">在允许网站使用您的摄像头前先询问(推荐)</translation>
 <translation id="4505788138578415521">网址已展开</translation>
 <translation id="4534723447064627427">若要允许 <ph name="APP_NAME" /> 使用您的麦克风,您还需在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启麦克风。</translation>
-<translation id="4566417217121906555">将麦克风静音</translation>
 <translation id="4570913071927164677">详情</translation>
 <translation id="4645575059429386691">由您父母管理</translation>
 <translation id="4670064810192446073">虚拟实境</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">选项位于屏幕顶部附近</translation>
 <translation id="5197729504361054390">系统会将您所选联系人的详细信息分享给 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />。</translation>
 <translation id="5216942107514965959">上次访问时间:今天</translation>
-<translation id="5225463052809312700">开启摄像头</translation>
 <translation id="5264323282659631142">移除“<ph name="CHIP_LABEL" />”</translation>
 <translation id="528192093759286357">从顶部向下拖动并触摸“返回”按钮,即可退出全屏模式。</translation>
 <translation id="5300589172476337783">显示</translation>
@@ -341,7 +337,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{正在使用 1 个 Cookie}other{正在使用 # 个 Cookie}}</translation>
 <translation id="8487700953926739672">可离线使用</translation>
 <translation id="848952951823693243">始终请求访问移动网站</translation>
-<translation id="8499083585497694743">将麦克风取消静音</translation>
 <translation id="851751545965956758">禁止网站连接到设备</translation>
 <translation id="8525306231823319788">全屏</translation>
 <translation id="857943718398505171">允许(推荐)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
index af1246a..87f87f3 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">如要讓 <ph name="APP_NAME" /> 使用 AR,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟相機。</translation>
 <translation id="1864927262126810325">來自「<ph name="SOURCE_NAME" />」</translation>
 <translation id="1887786770086287077">此裝置的位置資訊存取權已關閉,請在「<ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />」中開啟。</translation>
-<translation id="1915307458270490472">結束通話</translation>
 <translation id="1919345977826869612">廣告</translation>
 <translation id="1919950603503897840">選取聯絡人</translation>
 <translation id="1923695749281512248">已下載:<ph name="BYTES_DOWNLOADED_WITH_UNITS" />,總大小:<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">離開</translation>
 <translation id="2687403674020088961">封鎖所有 Cookie (不建議)</translation>
 <translation id="2704606927547763573">已複製</translation>
-<translation id="2713106313042589954">關閉攝錄機</translation>
 <translation id="2717722538473713889">電郵地址</translation>
 <translation id="2750481671343847896">網站可顯示來自身分服務的登入提示。</translation>
 <translation id="2785051990912111074">此選項將會清除 <ph name="WEBSITE" /> 的 Cookie</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">允許網站使用相機前先詢問您 (建議)</translation>
 <translation id="4505788138578415521">展開咗網址</translation>
 <translation id="4534723447064627427">如要讓 <ph name="APP_NAME" /> 存取您的麥克風,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟麥克風。</translation>
-<translation id="4566417217121906555">將麥克風設定為靜音</translation>
 <translation id="4570913071927164677">詳細資料</translation>
 <translation id="4645575059429386691">由您的家長管理</translation>
 <translation id="4670064810192446073">虛擬實境</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">選項喺螢幕頂部附近</translation>
 <translation id="5197729504361054390">系統會將您選取的聯絡人向 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> 提供。</translation>
 <translation id="5216942107514965959">上次瀏覽時間:今天</translation>
-<translation id="5225463052809312700">開啟攝錄機</translation>
 <translation id="5264323282659631142">移除「<ph name="CHIP_LABEL" />」</translation>
 <translation id="528192093759286357">由上而下拖曳,然後輕觸返回按鈕即可退出全螢幕。</translation>
 <translation id="5300589172476337783">顯示</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{1 個 Cookie 正在使用中}other{# 個 Cookie 正在使用中}}</translation>
 <translation id="8487700953926739672">可離線使用</translation>
 <translation id="848952951823693243">一律要求流動網站</translation>
-<translation id="8499083585497694743">將麥克風取消靜音</translation>
 <translation id="851751545965956758">禁止網站連接裝置</translation>
 <translation id="8525306231823319788">全螢幕</translation>
 <translation id="857943718398505171">允許 (建議)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
index 4138477..ae43999 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">如要允許 <ph name="APP_NAME" /> 使用 AR,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟攝影機。</translation>
 <translation id="1864927262126810325">來自 <ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">這部裝置的位置資訊存取權已關閉。請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中予以開啟。</translation>
-<translation id="1915307458270490472">掛斷</translation>
 <translation id="1919345977826869612">廣告</translation>
 <translation id="1919950603503897840">選取聯絡人</translation>
 <translation id="1923695749281512248">已下載:<ph name="BYTES_DOWNLOADED_WITH_UNITS" />,總大小:<ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">離開</translation>
 <translation id="2687403674020088961">封鎖所有 Cookie (不建議)</translation>
 <translation id="2704606927547763573">已複製</translation>
-<translation id="2713106313042589954">關閉攝影機</translation>
 <translation id="2717722538473713889">電子郵件地址</translation>
 <translation id="2750481671343847896">網站可以顯示身分識別服務的登入提示。</translation>
 <translation id="2785051990912111074">這會清除 <ph name="WEBSITE" /> 的 Cookie</translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">允許網站使用你的攝影機前,必須先詢問你 (建議)</translation>
 <translation id="4505788138578415521">已展開網址</translation>
 <translation id="4534723447064627427">如要允許 <ph name="APP_NAME" /> 存取裝置的麥克風,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟麥克風。</translation>
-<translation id="4566417217121906555">將麥克風設為靜音</translation>
 <translation id="4570913071927164677">詳細資料</translation>
 <translation id="4645575059429386691">你的家長已停用這項功能</translation>
 <translation id="4670064810192446073">虛擬實境</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">選項位於畫面頂端</translation>
 <translation id="5197729504361054390">系統會將你選取的聯絡人資訊提供給 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />。</translation>
 <translation id="5216942107514965959">上次造訪日期:今天</translation>
-<translation id="5225463052809312700">開啟攝影機</translation>
 <translation id="5264323282659631142">移除「<ph name="CHIP_LABEL" />」</translation>
 <translation id="528192093759286357">從頂端拖曳並輕觸返回按鈕即可結束全螢幕模式。</translation>
 <translation id="5300589172476337783">顯示</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{目前使用 1 個 Cookie}other{目前使用 # 個 Cookie}}</translation>
 <translation id="8487700953926739672">可離線使用</translation>
 <translation id="848952951823693243">一律要求行動版網站</translation>
-<translation id="8499083585497694743">將麥克風取消靜音</translation>
 <translation id="851751545965956758">禁止網站連線至裝置</translation>
 <translation id="8525306231823319788">全螢幕</translation>
 <translation id="857943718398505171">已允許 (建議)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
index 1838a3f7..4aebca0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -32,7 +32,6 @@
 <translation id="1818308510395330587">Ukuze uvumele i-<ph name="APP_NAME" /> isebenzise i-AR, vula nekhamera <ph name="BEGIN_LINK" />Kumasethingi e-Android<ph name="END_LINK" />.</translation>
 <translation id="1864927262126810325">Kusuka ku-<ph name="SOURCE_NAME" /></translation>
 <translation id="1887786770086287077">Ukufinyelela kwendawo kuvalelwe le divayisi. Kuvule <ph name="BEGIN_LINK" />kuzilungiselelo ze-Android<ph name="END_LINK" />.</translation>
-<translation id="1915307458270490472">Vala ikholi</translation>
 <translation id="1919345977826869612">Izikhangiso</translation>
 <translation id="1919950603503897840">Khetha oxhumana nabo</translation>
 <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation>
@@ -79,7 +78,6 @@
 <translation id="2677748264148917807">Hamba</translation>
 <translation id="2687403674020088961">Vimbela wonke amakhukhi (akunconywa)</translation>
 <translation id="2704606927547763573">Kukopishiwe</translation>
-<translation id="2713106313042589954">Vala ikhamera</translation>
 <translation id="2717722538473713889">Amakheli we-imeyili</translation>
 <translation id="2750481671343847896">Amasayithi angabonisa imiyalo yokungena ngemvume kusukela kumasevisi kamazisi.</translation>
 <translation id="2785051990912111074">Le nketho izusula amakhukhi we-<ph name="WEBSITE" /></translation>
@@ -156,7 +154,6 @@
 <translation id="4479647676395637221">Buza kuqala ngaphambi kokuvumela amasayithi ukuthi asebenzise ikhamera yakho (kunconyiwe)</translation>
 <translation id="4505788138578415521">I-URL inwetshiwe</translation>
 <translation id="4534723447064627427">Ukuze uvumele i-<ph name="APP_NAME" /> ifinyelele imakrofoni yakho, vula nemakrofoni <ph name="BEGIN_LINK" />Kumasethingi e-Android<ph name="END_LINK" />.</translation>
-<translation id="4566417217121906555">Thulisa imakrofoni</translation>
 <translation id="4570913071927164677">Imininingwane</translation>
 <translation id="4645575059429386691">Kuphethwe umzali wakho</translation>
 <translation id="4670064810192446073">Into engekho ngokoqobo</translation>
@@ -181,7 +178,6 @@
 <translation id="5186036860380548585">Inketho iyatholakala eduze kwaphezulu kwesikrini</translation>
 <translation id="5197729504361054390">Oxhumana nabo obakhethayo bazokwabiwa no-<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5216942107514965959">Kugcine ukuvakashelwa namuhla</translation>
-<translation id="5225463052809312700">Vula ikhamera</translation>
 <translation id="5264323282659631142">Susa i-'<ph name="CHIP_LABEL" />'</translation>
 <translation id="528192093759286357">Hudula kusukela phezulu uphinde uthinte inkinobho yokubuyela emuva ukuze uphume kusikrini esigcwele.</translation>
 <translation id="5300589172476337783">Bonisa</translation>
@@ -343,7 +339,6 @@
 <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Ikhukhi e-1 iyasebenza}one{Amakhukhi angu-# asebenzayo}other{Amakhukhi angu-# asebenzayo}}</translation>
 <translation id="8487700953926739672">Itholakala kokungaxhunyiwe ku-inthanethi</translation>
 <translation id="848952951823693243">Njalo cela isayithi leselula</translation>
-<translation id="8499083585497694743">Vula imakrofoni</translation>
 <translation id="851751545965956758">Vimbela amasayithi kusukela ekuxhumekeni kumadivayisi</translation>
 <translation id="8525306231823319788">Isikrini esigcwele</translation>
 <translation id="857943718398505171">Kuvunyelwe (kunconyiwe)</translation>
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index 99b2ecad..781d9b3 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -499,6 +499,20 @@
                                              Comparator(EQUAL, 0), 15, 90));
     return config;
   }
+  if (kIPHShoppingListMenuItemFeature.name == feature->name) {
+    absl::optional<FeatureConfig> config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    config->session_rate = Comparator(EQUAL, 1);
+    config->trigger = EventConfig("shopping_list_menu_item_iph_triggered",
+                                  Comparator(EQUAL, 0), 7, 7);
+    config->event_configs.insert(
+        EventConfig("shopping_list_menu_item_iph_triggered",
+                    Comparator(LESS_THAN, 3), 360, 360));
+    config->used = EventConfig("shopping_list_track_price_from_menu",
+                               Comparator(EQUAL, 0), 360, 360);
+    return config;
+  }
   if (kIPHTabSwitcherButtonFeature.name == feature->name) {
     absl::optional<FeatureConfig> config = FeatureConfig();
     config->valid = true;
diff --git a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
index d4b3b6d..a1acc964 100644
--- a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
@@ -163,10 +163,12 @@
 
   TestingPrefServiceSimple* pref_service() { return &pref_service_; }
 
-  const base::Value* GetSubscribedTopics() {
-    return pref_service()
-        ->GetDictionary(kTypeSubscribedForInvalidation)
-        ->FindDictKey(kProjectId);
+  const base::Value::Dict& GetSubscribedTopics() const {
+    const base::Value::Dict* subscribed_topics =
+        pref_service_.GetValueDict(kTypeSubscribedForInvalidation)
+            .FindDict(kProjectId);
+    DCHECK(subscribed_topics);
+    return *subscribed_topics;
   }
 
   SubscriptionChannelState observed_state() {
@@ -262,9 +264,9 @@
       per_user_topic_subscription_manager->HaveAllRequestsFinishedForTest());
 
   for (const auto& topic : topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
-    const base::Value* private_topic_value = subscribed_topics->FindKeyOfType(
-        topic.first, base::Value::Type::STRING);
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
+    const std::string* private_topic_value =
+        subscribed_topics.FindString(topic.first);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
@@ -609,17 +611,17 @@
 
   // Topics were disabled, check that they're not in the prefs.
   for (const auto& topic : disabled_topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
     const base::Value* private_topic_value =
-        subscribed_topics->FindKey(topic.first);
+        subscribed_topics.Find(topic.first);
     ASSERT_EQ(private_topic_value, nullptr);
   }
 
   // Check that enable topics are still in the prefs.
   for (const auto& topic : enabled_topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
-    const base::Value* private_topic_value = subscribed_topics->FindKeyOfType(
-        topic.first, base::Value::Type::STRING);
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
+    const std::string* private_topic_value =
+        subscribed_topics.FindString(topic.first);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
@@ -643,18 +645,16 @@
             per_user_topic_subscription_manager->GetSubscribedTopicsForTest());
 
   for (const auto& topic : topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
-    const base::Value* private_topic_value = subscribed_topics->FindKeyOfType(
-        topic.first, base::Value::Type::STRING);
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
+    const std::string* private_topic_value =
+        subscribed_topics.FindString(topic.first);
     ASSERT_NE(private_topic_value, nullptr);
-    ASSERT_TRUE(private_topic_value->is_string());
-    EXPECT_EQ("old-token-topic", private_topic_value->GetString());
+    EXPECT_EQ("old-token-topic", *private_topic_value);
   }
 
-  EXPECT_EQ(kFakeInstanceIdToken,
-            *pref_service()
-                 ->GetDictionary(kActiveRegistrationTokens)
-                 ->FindStringKey(kProjectId));
+  EXPECT_EQ(kFakeInstanceIdToken, *pref_service()
+                                       ->GetValueDict(kActiveRegistrationTokens)
+                                       .FindString(kProjectId));
 
   std::string token = "new-fake-token";
   AddCorrectSubscriptionResponce("new-token-topic", token);
@@ -663,18 +663,17 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(token, *pref_service()
-                        ->GetDictionary(kActiveRegistrationTokens)
-                        ->FindStringKey(kProjectId));
+                        ->GetValueDict(kActiveRegistrationTokens)
+                        .FindString(kProjectId));
   EXPECT_EQ(TopicSetFromTopics(topics),
             per_user_topic_subscription_manager->GetSubscribedTopicsForTest());
 
   for (const auto& topic : topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
-    const base::Value* private_topic_value = subscribed_topics->FindKeyOfType(
-        topic.first, base::Value::Type::STRING);
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
+    const std::string* private_topic_value =
+        subscribed_topics.FindString(topic.first);
     ASSERT_NE(private_topic_value, nullptr);
-    ASSERT_TRUE(private_topic_value->is_string());
-    EXPECT_EQ("new-token-topic", private_topic_value->GetString());
+    EXPECT_EQ("new-token-topic", *private_topic_value);
   }
 }
 
@@ -705,17 +704,17 @@
 
   // Topics should still be removed from prefs.
   for (const auto& topic : disabled_topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
     const base::Value* private_topic_value =
-        subscribed_topics->FindKey(topic.first);
+        subscribed_topics.Find(topic.first);
     ASSERT_EQ(private_topic_value, nullptr);
   }
 
   // Check that enable topics are still in the prefs.
   for (const auto& topic : enabled_topics) {
-    const base::Value* subscribed_topics = GetSubscribedTopics();
-    const base::Value* private_topic_value = subscribed_topics->FindKeyOfType(
-        topic.first, base::Value::Type::STRING);
+    const base::Value::Dict& subscribed_topics = GetSubscribedTopics();
+    const std::string* private_topic_value =
+        subscribed_topics.FindString(topic.first);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
diff --git a/components/password_manager/core/browser/form_parsing/form_parser.cc b/components/password_manager/core/browser/form_parsing/form_parser.cc
index b8dbb80b..6bdd0e0 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser.cc
@@ -813,41 +813,26 @@
   return;
 }
 
-// Helper to get the platform specific identifier by which autofill and password
-// manager refer to a field. The fuzzing infrastructure doed not run on iOS, so
-// the iOS specific parts of PasswordForm are also built on fuzzer enabled
-// platforms. See http://crbug.com/896594
-std::u16string GetPlatformSpecificIdentifier(const FormFieldData& field) {
-#if BUILDFLAG(IS_IOS)
-  return field.unique_id;
-#else
-  return field.name;
-#endif
-}
-
 // Set username and password fields in |password_form| based on
 // |significant_fields| .
 void SetFields(const SignificantFields& significant_fields,
                PasswordForm* password_form) {
   if (significant_fields.username) {
-    password_form->username_element =
-        GetPlatformSpecificIdentifier(*significant_fields.username);
+    password_form->username_element = significant_fields.username->name;
     password_form->username_value = GetFieldValue(*significant_fields.username);
     password_form->username_element_renderer_id =
         significant_fields.username->unique_renderer_id;
   }
 
   if (significant_fields.password) {
-    password_form->password_element =
-        GetPlatformSpecificIdentifier(*significant_fields.password);
+    password_form->password_element = significant_fields.password->name;
     password_form->password_value = GetFieldValue(*significant_fields.password);
     password_form->password_element_renderer_id =
         significant_fields.password->unique_renderer_id;
   }
 
   if (significant_fields.new_password) {
-    password_form->new_password_element =
-        GetPlatformSpecificIdentifier(*significant_fields.new_password);
+    password_form->new_password_element = significant_fields.new_password->name;
     password_form->new_password_value =
         GetFieldValue(*significant_fields.new_password);
     password_form->new_password_element_renderer_id =
@@ -856,8 +841,7 @@
 
   if (significant_fields.confirmation_password) {
     password_form->confirmation_password_element =
-        GetPlatformSpecificIdentifier(
-            *significant_fields.confirmation_password);
+        significant_fields.confirmation_password->name;
     password_form->confirmation_password_element_renderer_id =
         significant_fields.confirmation_password->unique_renderer_id;
   }
diff --git a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
index 79ac49c..8359322b36 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
@@ -183,9 +183,6 @@
       field.name = std::u16string(field_description.name);
     }
     field.name_attribute = field.name;
-#if BUILDFLAG(IS_IOS)
-    field.unique_id = StampUniqueSuffix(u"unique_id");
-#endif
     field.form_control_type = field_description.form_control_type;
     field.is_focusable = field_description.is_focusable;
     field.is_enabled = field_description.is_enabled;
@@ -215,9 +212,6 @@
     if (field_description.prediction.type != autofill::MAX_VALID_FIELD_TYPE) {
       predictions->fields.push_back(field_description.prediction);
       predictions->fields.back().renderer_id = renderer_id;
-#if BUILDFLAG(IS_IOS)
-      predictions->fields.back().unique_id = field.unique_id;
-#endif
     }
     if (field_description.predicted_username >= 0) {
       size_t index = static_cast<size_t>(field_description.predicted_username);
@@ -265,13 +259,7 @@
   ASSERT_TRUE(field_it != fields.end())
       << "Could not find a field with renderer ID " << renderer_id;
 
-// On iOS |unique_id| is used for identifying DOM elements, so the parser should
-// return it. See crbug.com/896594
-#if BUILDFLAG(IS_IOS)
-  EXPECT_EQ(element_name, field_it->unique_id);
-#else
   EXPECT_EQ(element_name, field_it->name);
-#endif
 
   std::u16string expected_value =
       field_it->user_input.empty() ? field_it->value : field_it->user_input;
diff --git a/components/password_manager/core/browser/form_parsing/fuzzer/form_data_producer.cc b/components/password_manager/core/browser/form_parsing/fuzzer/form_data_producer.cc
index b33438a..57f80de 100644
--- a/components/password_manager/core/browser/form_parsing/fuzzer/form_data_producer.cc
+++ b/components/password_manager/core/browser/form_parsing/fuzzer/form_data_producer.cc
@@ -147,10 +147,6 @@
       }
     }
 
-#if BUILDFLAG(IS_IOS)
-    result.fields[i].unique_id =
-        result.fields[i].id_attribute + u"-" + base::NumberToString16(i);
-#endif
     if (field_params[i].same_value_field &&
         first_field_with_same_value != static_cast<int>(i)) {
       result.fields[i].value = result.fields[first_field_with_same_value].value;
diff --git a/components/password_manager/core/browser/form_parsing/fuzzer/form_data_proto_producer.cc b/components/password_manager/core/browser/form_parsing/fuzzer/form_data_proto_producer.cc
index c92ff92a..0784a5b 100644
--- a/components/password_manager/core/browser/form_parsing/fuzzer/form_data_proto_producer.cc
+++ b/components/password_manager/core/browser/form_parsing/fuzzer/form_data_proto_producer.cc
@@ -45,10 +45,6 @@
   for (int i = 0; i < form_proto.fields_size(); ++i) {
     const ::form_data_fuzzer::FormField& form_data_proto = form_proto.fields(i);
     result.fields[i].id_attribute = UTF8ToUTF16(form_data_proto.id());
-#if BUILDFLAG(IS_IOS)
-    result.fields[i].unique_id =
-        result.fields[i].id_attribute + u"-" + base::NumberToString16(i);
-#endif
     result.fields[i].name_attribute = UTF8ToUTF16(form_data_proto.name());
     result.fields[i].is_focusable = form_data_proto.is_focusable();
     result.fields[i].form_control_type = form_data_proto.form_control_type();
diff --git a/components/password_manager/core/browser/form_parsing/password_field_prediction.cc b/components/password_manager/core/browser/form_parsing/password_field_prediction.cc
index f034569..c1401cc 100644
--- a/components/password_manager/core/browser/form_parsing/password_field_prediction.cc
+++ b/components/password_manager/core/browser/form_parsing/password_field_prediction.cc
@@ -129,9 +129,6 @@
     field_predictions.back().type = server_type;
     field_predictions.back().may_use_prefilled_placeholder =
         field->may_use_prefilled_placeholder();
-#if BUILDFLAG(IS_IOS)
-    field_predictions.back().unique_id = field->unique_id;
-#endif
   }
 
   FormPredictions predictions;
diff --git a/components/password_manager/core/browser/form_parsing/password_field_prediction.h b/components/password_manager/core/browser/form_parsing/password_field_prediction.h
index 3f39cdb..a6813a2 100644
--- a/components/password_manager/core/browser/form_parsing/password_field_prediction.h
+++ b/components/password_manager/core/browser/form_parsing/password_field_prediction.h
@@ -34,11 +34,7 @@
 
 // Contains server predictions for a field.
 struct PasswordFieldPrediction {
-  // Field identifier generated in Blink on non-iOS platforms.
   autofill::FieldRendererId renderer_id;
-#if BUILDFLAG(IS_IOS)
-  std::u16string unique_id;
-#endif
   autofill::FieldSignature signature;
   autofill::ServerFieldType type;
   bool may_use_prefilled_placeholder = false;
diff --git a/components/password_manager/core/browser/import/BUILD.gn b/components/password_manager/core/browser/import/BUILD.gn
index e833d76..6b3fa4ac 100644
--- a/components/password_manager/core/browser/import/BUILD.gn
+++ b/components/password_manager/core/browser/import/BUILD.gn
@@ -21,6 +21,7 @@
     ]
 
     deps = [
+      "//components/password_manager/core/browser",
       "//components/password_manager/services/csv_password:service",
       "//components/sync/base:base",
     ]
@@ -32,6 +33,7 @@
     deps = [
       ":importer",
       "//base/test:test_support",
+      "//components/password_manager/core/browser:test_support",
       "//mojo/public/cpp/bindings:bindings",
       "//testing/gmock",
       "//testing/gtest",
diff --git a/components/password_manager/core/browser/import/password_importer.cc b/components/password_manager/core/browser/import/password_importer.cc
index 929c415..bf51217 100644
--- a/components/password_manager/core/browser/import/password_importer.cc
+++ b/components/password_manager/core/browser/import/password_importer.cc
@@ -9,10 +9,12 @@
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/task/thread_pool.h"
 #include "base/types/expected.h"
 #include "components/password_manager/core/browser/import/csv_password.h"
 #include "components/password_manager/core/browser/import/csv_password_sequence.h"
+#include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
 #include "components/password_manager/services/csv_password/csv_password_parser_service.h"
 #include "components/sync/base/bind_to_task_runner.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -46,7 +48,8 @@
 
 }  // namespace
 
-PasswordImporter::PasswordImporter() = default;
+PasswordImporter::PasswordImporter(SavedPasswordsPresenter* presenter)
+    : presenter_(presenter) {}
 
 PasswordImporter::~PasswordImporter() = default;
 
@@ -75,15 +78,30 @@
   }
 }
 
-void PasswordImporter::Import(const base::FilePath& path,
-                              CompletionCallback completion) {
+void PasswordImporter::Import(const base::FilePath& path) {
   // Posting with USER_VISIBLE priority, because the result of the import is
   // visible to the user in the password settings page.
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()},
       base::BindOnce(&ReadFileToString, path),
       base::BindOnce(&PasswordImporter::ParseCSVPasswordsInSandbox,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(completion)));
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::BindOnce(&PasswordImporter::ConsumePasswords,
+                                    weak_ptr_factory_.GetWeakPtr())));
+}
+
+void PasswordImporter::ConsumePasswords(
+    password_manager::mojom::CSVPasswordSequencePtr seq) {
+  if (!seq)
+    return;
+
+  for (const auto& pwd : seq->csv_passwords) {
+    presenter_->AddCredential(password_manager::CredentialUIEntry(pwd),
+                              password_manager::PasswordForm::Type::kImported);
+  }
+
+  UMA_HISTOGRAM_COUNTS_1M("PasswordManager.ImportedPasswordsPerUserInCSV",
+                          seq->csv_passwords.size());
 }
 
 void PasswordImporter::SetServiceForTesting(
diff --git a/components/password_manager/core/browser/import/password_importer.h b/components/password_manager/core/browser/import/password_importer.h
index 8f12ade9..ee47f87 100644
--- a/components/password_manager/core/browser/import/password_importer.h
+++ b/components/password_manager/core/browser/import/password_importer.h
@@ -15,6 +15,8 @@
 
 namespace password_manager {
 
+class SavedPasswordsPresenter;
+
 // Exposes an API for importing passwords from a file. Parsing of CSV will be
 // performed using a utility SandBox process.
 class PasswordImporter {
@@ -34,15 +36,14 @@
   using CompletionCallback =
       password_manager::mojom::CSVPasswordParser::ParseCSVCallback;
 
-  PasswordImporter();
+  explicit PasswordImporter(SavedPasswordsPresenter* presenter);
   PasswordImporter(const PasswordImporter&) = delete;
   PasswordImporter& operator=(const PasswordImporter&) = delete;
   ~PasswordImporter();
 
-  // Imports passwords from the file at |path|, and fires |completion| callback
-  // on the calling thread with the passwords when ready. The only supported
-  // file format is CSV.
-  void Import(const base::FilePath& path, CompletionCallback completion);
+  // Imports passwords from the file at |path|.
+  // The only supported file format is CSV.
+  void Import(const base::FilePath& path);
 
   // Returns the file extensions corresponding to supported formats.
   static std::vector<std::vector<base::FilePath::StringType>>
@@ -70,6 +71,8 @@
 
   Status status_{Status::NONE};
 
+  const raw_ptr<SavedPasswordsPresenter> presenter_;
+
   base::WeakPtrFactory<PasswordImporter> weak_ptr_factory_{this};
 };
 
diff --git a/components/password_manager/core/browser/import/password_importer_unittest.cc b/components/password_manager/core/browser/import/password_importer_unittest.cc
index 885272d..4b27b51b 100644
--- a/components/password_manager/core/browser/import/password_importer_unittest.cc
+++ b/components/password_manager/core/browser/import/password_importer_unittest.cc
@@ -12,6 +12,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/task_environment.h"
 #include "components/password_manager/core/browser/import/csv_password_sequence.h"
+#include "components/password_manager/core/browser/test_password_store.h"
+#include "components/password_manager/core/browser/ui/credential_ui_entry.h"
+#include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -25,8 +28,9 @@
 
 namespace {
 const char kTestOriginURL[] = "http://accounts.google.com/a/LoginAuth";
-const char kTestUsername[] = "test@gmail.com";
-const char kTestPassword[] = "test1";
+const char kTestSignonRealm[] = "http://accounts.google.com/";
+const char16_t kTestUsername[] = u"test@gmail.com";
+const char16_t kTestPassword[] = u"test1";
 const char kTestFileName[] = "test_only.csv";
 }  // namespace
 
@@ -49,39 +53,30 @@
 
 class PasswordImporterTest : public testing::Test {
  public:
-  PasswordImporterTest() : receiver_{&service_} {
+  PasswordImporterTest() : receiver_{&service_}, importer_(&presenter_) {
     CHECK(temp_directory_.CreateUniqueTempDir());
     mojo::PendingRemote<mojom::CSVPasswordParser> pending_remote{
         receiver_.BindNewPipeAndPassRemote()};
     importer_.SetServiceForTesting(std::move(pending_remote));
+    store_->Init(/*prefs=*/nullptr, /*affiliated_match_helper=*/nullptr);
   }
 
   PasswordImporterTest(const PasswordImporterTest&) = delete;
   PasswordImporterTest& operator=(const PasswordImporterTest&) = delete;
 
+  ~PasswordImporterTest() override {
+    store_->ShutdownOnUIThread();
+    task_environment_.RunUntilIdle();
+  }
+
  protected:
   void StartImportAndWaitForCompletion(const base::FilePath& input_file) {
-    importer_.Import(input_file,
-                     base::BindOnce(&PasswordImporterTest::OnImportFinished,
-                                    base::Unretained(this)));
-
+    importer_.Import(input_file);
     task_environment_.RunUntilIdle();
-
-    ASSERT_TRUE(callback_called_);
   }
 
-  void OnImportFinished(mojom::CSVPasswordSequencePtr seq) {
-    callback_called_ = true;
-    imported_passwords_.clear();
-    if (!seq)
-      return;
-    for (const auto& pwd : seq->csv_passwords) {
-      imported_passwords_.push_back(pwd);
-    }
-  }
-
-  const std::vector<CSVPassword>& imported_passwords() {
-    return imported_passwords_;
+  std::vector<CredentialUIEntry> imported_passwords() {
+    return presenter_.GetSavedCredentials();
   }
 
   PasswordImporter::Status GetImportStatus() const {
@@ -93,10 +88,12 @@
 
  private:
   base::test::TaskEnvironment task_environment_;
-  bool callback_called_ = false;
-  std::vector<CSVPassword> imported_passwords_;
+  std::vector<CredentialUIEntry> imported_passwords_;
   FakePasswordParserService service_;
   mojo::Receiver<mojom::CSVPasswordParser> receiver_;
+  scoped_refptr<TestPasswordStore> store_ =
+      base::MakeRefCounted<TestPasswordStore>();
+  password_manager::SavedPasswordsPresenter presenter_{store_};
   password_manager::PasswordImporter importer_;
 };
 
@@ -112,9 +109,10 @@
   ASSERT_NO_FATAL_FAILURE(StartImportAndWaitForCompletion(input_path));
 
   ASSERT_EQ(1u, imported_passwords().size());
-  EXPECT_EQ(GURL(kTestOriginURL), imported_passwords()[0].GetURL());
-  EXPECT_EQ(kTestUsername, imported_passwords()[0].GetUsername());
-  EXPECT_EQ(kTestPassword, imported_passwords()[0].GetPassword());
+  EXPECT_EQ(GURL(kTestOriginURL), imported_passwords()[0].url);
+  EXPECT_EQ(kTestSignonRealm, imported_passwords()[0].signon_realm);
+  EXPECT_EQ(kTestUsername, imported_passwords()[0].username);
+  EXPECT_EQ(kTestPassword, imported_passwords()[0].password);
 }
 
 TEST_F(PasswordImporterTest, CSVImportLargeFile) {
diff --git a/components/password_manager/core/browser/password_form_filling.cc b/components/password_manager/core/browser/password_form_filling.cc
index 0f20e63..573f931 100644
--- a/components/password_manager/core/browser/password_form_filling.cc
+++ b/components/password_manager/core/browser/password_form_filling.cc
@@ -296,12 +296,6 @@
     result.password_field.unique_renderer_id =
         form_on_page.password_element_renderer_id;
     result.password_field.form_control_type = "password";
-
-    // On iOS, use the unique_id field to refer to elements.
-#if BUILDFLAG(IS_IOS)
-    result.username_field.unique_id = form_on_page.username_element;
-    result.password_field.unique_id = form_on_page.password_element;
-#endif
   }
 
   if (IsPublicSuffixMatchOrAffiliationBasedMatch(preferred_match)) {
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index 4eb4811..79d7c1e 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -385,21 +385,6 @@
     field.unique_renderer_id = autofill::FieldRendererId(5);
     observed_form_only_password_fields_.fields.push_back(field);
 
-// On iOS the unique_id member uniquely addresses this field in the DOM.
-// This is an ephemeral value which is not guaranteed to be stable across
-// page loads. It serves to allow a given field to be found during the
-// current navigation.
-// TODO(crbug.com/896689): Expand the logic/application of this to other
-// platforms and/or merge this concept with |unique_renderer_id|.
-#if BUILDFLAG(IS_IOS)
-    for (auto& f : observed_form_.fields) {
-      f.unique_id = f.id_attribute;
-    }
-    for (auto& f : observed_form_only_password_fields_.fields) {
-      f.unique_id = f.id_attribute;
-    }
-#endif
-
     submitted_form_ = observed_form_;
     submitted_form_.fields[kUsernameFieldIndex].value = u"user1";
     submitted_form_.fields[kPasswordFieldIndex].value = u"secret1";
@@ -1765,9 +1750,6 @@
       form.fields[kUsernameFieldIndex].unique_renderer_id.value() += 1000;
       form.fields[kUsernameFieldIndex].name += u"1";
       form.fields[kUsernameFieldIndex].id_attribute += u"1";
-#if BUILDFLAG(IS_IOS)
-      form.fields[kUsernameFieldIndex].unique_id += u"1";
-#endif
       form.fields[kPasswordFieldIndex].unique_renderer_id.value() += 1000;
     }
 
@@ -2126,8 +2108,6 @@
   // Use |generated_password| different from value in field to test that the
   // generated password is saved.
   const std::u16string generated_password = u"gen_pw";
-  // Use different |unique_id| and |name| to test that |unique_id| is taken.
-  password_field.unique_id = password_field.name + u"1";
   FieldRendererId generation_element = password_field.unique_renderer_id;
 
   PasswordForm saved_form;
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index 3972c04f..d041029 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -321,14 +321,6 @@
   }
 }
 
-void SetFieldName(const std::u16string& name, FormFieldData* field) {
-#if BUILDFLAG(IS_IOS)
-  field->unique_id = name;
-#else
-  field->name = name;
-#endif
-}
-
 // Verifies that |test_ukm_recorder| recorder has a single entry called |entry|
 // and returns it.
 const ukm::mojom::UkmEntry* GetMetricEntry(
@@ -353,20 +345,6 @@
       static_cast<int64_t>(value));
 }
 
-// Sets |unique_id| in fields on iOS.
-void SetUniqueIdIfNeeded(FormData* form) {
-  // On iOS the unique_id member uniquely addresses this field in the DOM.
-  // This is an ephemeral value which is not guaranteed to be stable across
-  // page loads. It serves to allow a given field to be found during the
-  // current navigation.
-  // TODO(crbug.com/896689): Expand the logic/application of this to other
-  // platforms and/or merge this concept with |unique_renderer_id|.
-#if BUILDFLAG(IS_IOS)
-  for (auto& f : form->fields)
-    f.unique_id = f.id_attribute;
-#endif
-}
-
 class MockFieldInfoManager : public FieldInfoManager {
  public:
   MOCK_METHOD(void,
@@ -524,7 +502,6 @@
     field.unique_renderer_id = FieldRendererId(3);
     form_data.fields.push_back(field);
 
-    SetUniqueIdIfNeeded(&form_data);
     return form_data;
   }
 
@@ -642,8 +619,6 @@
     field.autocomplete_attribute = "cc-number";
     form.form_data.fields.push_back(field);
 
-    SetUniqueIdIfNeeded(&form.form_data);
-
     return form;
   }
 
@@ -1499,8 +1474,7 @@
   // Different values of |username_element| needed to ensure that it is the
   // |observed_form| and not the |stored_form| what is passed to ShouldSave.
   observed_form.username_element += u"1";
-  SetFieldName(observed_form.username_element,
-               &observed_form.form_data.fields[0]);
+  observed_form.form_data.fields[0].name = observed_form.username_element;
   observed.push_back(observed_form.form_data);
   // Simulate that |form| is already in the store, making this an update.
   EXPECT_CALL(*store_, GetLogins(_, _))
diff --git a/components/password_manager/core/browser/password_save_manager_impl.cc b/components/password_manager/core/browser/password_save_manager_impl.cc
index d2008955..26e2470 100644
--- a/components/password_manager/core/browser/password_save_manager_impl.cc
+++ b/components/password_manager/core/browser/password_save_manager_impl.cc
@@ -63,16 +63,6 @@
   return pending_credentials;
 }
 
-// Helper to get the platform specific identifier by which autofill and password
-// manager refer to a field. See http://crbug.com/896594
-std::u16string GetPlatformSpecificIdentifier(const FormFieldData& field) {
-#if BUILDFLAG(IS_IOS)
-  return field.unique_id;
-#else
-  return field.name;
-#endif
-}
-
 // Copies field properties masks from the form |from| to the form |to|.
 void CopyFieldPropertiesMasks(const FormData& from, FormData* to) {
   // Skip copying if the number of fields is different.
@@ -81,8 +71,7 @@
 
   for (size_t i = 0; i < from.fields.size(); ++i) {
     to->fields[i].properties_mask =
-        GetPlatformSpecificIdentifier(to->fields[i]) ==
-                GetPlatformSpecificIdentifier(from.fields[i])
+        to->fields[i].name == from.fields[i].name
             ? from.fields[i].properties_mask
             : autofill::FieldPropertiesFlags::kErrorOccurred;
   }
diff --git a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
index d4139bb6..bf32b17 100644
--- a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
@@ -244,21 +244,6 @@
     field.unique_renderer_id = autofill::FieldRendererId(5);
     observed_form_only_password_fields_.fields.push_back(field);
 
-// On iOS the unique_id member uniquely addresses this field in the DOM.
-// This is an ephemeral value which is not guaranteed to be stable across
-// page loads. It serves to allow a given field to be found during the
-// current navigation.
-// TODO(crbug.com/896689): Expand the logic/application of this to other
-// platforms and/or merge this concept with |unique_renderer_id|.
-#if BUILDFLAG(IS_IOS)
-    for (auto& f : observed_form_.fields) {
-      f.unique_id = f.id_attribute;
-    }
-    for (auto& f : observed_form_only_password_fields_.fields) {
-      f.unique_id = f.id_attribute;
-    }
-#endif
-
     submitted_form_ = observed_form_;
     submitted_form_.fields[kUsernameFieldIndex].value = u"user1";
     submitted_form_.fields[kPasswordFieldIndex].value = u"secret1";
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index a95a18e..28df61f 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -11,6 +11,18 @@
 // NOTE: It is strongly recommended to use UpperCamelCase style for feature
 //       names, e.g. "MyGreatFeature".
 
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+// Enables biometric authentication before form filling.
+const base::Feature kBiometricAuthenticationForFilling = {
+    "BiometricAuthenticationForFilling", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
+#if BUILDFLAG(IS_MAC)
+// Enables biometric authentication in settings.
+const base::Feature kBiometricAuthenticationInSettings = {
+    "BiometricAuthenticationInSettings", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 // Enables Biometrics for the Touch To Fill feature. This only effects Android.
 const base::Feature kBiometricTouchToFill = {"BiometricTouchToFill",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
@@ -176,17 +188,6 @@
 const base::Feature kPasswordStrengthIndicator = {
     "PasswordStrengthIndicator", base::FEATURE_DISABLED_BY_DEFAULT};
 
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-// Enables biometric authentication before form filling.
-const base::Feature kBiometricAuthenticationForFilling = {
-    "BiometricAuthenticationForFilling", base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Enables biometric authentication in settings.
-const base::Feature kEnableBiometricAuthenticationInSettings = {
-    "EnableBiometricAuthenticationInSettings",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-#endif
-
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 // Displays at least the decryptable and never saved logins in the password
 // manager
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h
index 52a8fb169..8f7b478 100644
--- a/components/password_manager/core/common/password_manager_features.h
+++ b/components/password_manager/core/common/password_manager_features.h
@@ -21,6 +21,12 @@
 // All features in alphabetical order. The features should be documented
 // alongside the definition of their values in the .cc file.
 
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+extern const base::Feature kBiometricAuthenticationForFilling;
+#endif
+#if BUILDFLAG(IS_MAC)
+extern const base::Feature kBiometricAuthenticationInSettings;
+#endif
 extern const base::Feature kBiometricTouchToFill;
 extern const base::Feature kDetectFormSubmissionOnFormClear;
 extern const base::Feature kForceEnablePasswordDomainCapabilities;
@@ -55,10 +61,6 @@
 extern const base::Feature kPasswordStrengthIndicator;
 extern const base::Feature kRecoverFromNeverSaveAndroid;
 extern const base::Feature kSecondaryServerFieldPredictions;
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-extern const base::Feature kBiometricAuthenticationForFilling;
-extern const base::Feature kEnableBiometricAuthenticationInSettings;
-#endif
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 extern const base::Feature kSkipUndecryptablePasswords;
 #endif
diff --git a/components/password_manager/ios/ios_password_manager_driver.h b/components/password_manager/ios/ios_password_manager_driver.h
index 594a8a1..b449549 100644
--- a/components/password_manager/ios/ios_password_manager_driver.h
+++ b/components/password_manager/ios/ios_password_manager_driver.h
@@ -7,6 +7,7 @@
 
 #include <vector>
 
+#include "components/password_manager/core/browser/password_generation_frame_helper.h"
 #include "components/password_manager/core/browser/password_manager_driver.h"
 #include "components/password_manager/ios/password_manager_driver_bridge.h"
 
@@ -59,6 +60,8 @@
  private:
   __weak id<PasswordManagerDriverBridge> bridge_;  // (weak)
   password_manager::PasswordManager* password_manager_;
+  std::unique_ptr<password_manager::PasswordGenerationFrameHelper>
+      password_generation_helper_;
 };
 
 #endif  // COMPONENTS_PASSWORD_MANAGER_IOS_IOS_PASSWORD_MANAGER_DRIVER_H_
diff --git a/components/password_manager/ios/ios_password_manager_driver.mm b/components/password_manager/ios/ios_password_manager_driver.mm
index 741c123..4022be3 100644
--- a/components/password_manager/ios/ios_password_manager_driver.mm
+++ b/components/password_manager/ios/ios_password_manager_driver.mm
@@ -20,7 +20,11 @@
 IOSPasswordManagerDriver::IOSPasswordManagerDriver(
     id<PasswordManagerDriverBridge> bridge,
     password_manager::PasswordManager* password_manager)
-    : bridge_(bridge), password_manager_(password_manager) {}
+    : bridge_(bridge), password_manager_(password_manager) {
+  password_generation_helper_ =
+      std::make_unique<password_manager::PasswordGenerationFrameHelper>(
+          password_manager_->client(), this);
+}
 
 IOSPasswordManagerDriver::~IOSPasswordManagerDriver() = default;
 
@@ -70,7 +74,7 @@
 
 password_manager::PasswordGenerationFrameHelper*
 IOSPasswordManagerDriver::GetPasswordGenerationHelper() {
-  return [bridge_ passwordGenerationHelper];
+  return password_generation_helper_.get();
 }
 
 PasswordManager* IOSPasswordManagerDriver::GetPasswordManager() {
diff --git a/components/password_manager/ios/shared_password_controller.mm b/components/password_manager/ios/shared_password_controller.mm
index d7ba7530..e36c05d0 100644
--- a/components/password_manager/ios/shared_password_controller.mm
+++ b/components/password_manager/ios/shared_password_controller.mm
@@ -107,7 +107,6 @@
 
 @implementation SharedPasswordController {
   PasswordManagerInterface* _passwordManager;
-  std::unique_ptr<PasswordGenerationFrameHelper> _passwordGenerationHelper;
 
   // The WebState this instance is observing. Will be null after
   // -webStateDestroyed: has been called.
@@ -513,11 +512,7 @@
 }
 
 - (PasswordGenerationFrameHelper*)passwordGenerationHelper {
-  if (![self isIncognito]) {
-    _passwordGenerationHelper.reset(new PasswordGenerationFrameHelper(
-        _delegate.passwordManagerClient, _delegate.passwordManagerDriver));
-  }
-  return _passwordGenerationHelper.get();
+  return _delegate.passwordManagerDriver->GetPasswordGenerationHelper();
 }
 
 - (void)formEligibleForGenerationFound:(const PasswordFormGenerationData&)form {
@@ -602,8 +597,8 @@
 - (BOOL)canGeneratePasswordForForm:(FormRendererId)formIdentifier
                    fieldIdentifier:(FieldRendererId)fieldIdentifier
                          fieldType:(NSString*)fieldType {
-  if ([self isIncognito] || !self.passwordGenerationHelper->IsGenerationEnabled(
-                                /*log_debug_data*/ true)) {
+  if (!self.passwordGenerationHelper->IsGenerationEnabled(
+          /*log_debug_data*/ true)) {
     return NO;
   }
   if (![fieldType isEqual:kPasswordFieldType]) {
diff --git a/components/password_manager/ios/shared_password_controller_unittest.mm b/components/password_manager/ios/shared_password_controller_unittest.mm
index 3996f99..d5a56e3 100644
--- a/components/password_manager/ios/shared_password_controller_unittest.mm
+++ b/components/password_manager/ios/shared_password_controller_unittest.mm
@@ -13,6 +13,7 @@
 #import "components/autofill/ios/browser/form_suggestion_provider_query.h"
 #include "components/autofill/ios/form_util/form_activity_params.h"
 #include "components/autofill/ios/form_util/unique_id_data_tab_helper.h"
+#include "components/password_manager/core/browser/password_generation_frame_helper.h"
 #include "components/password_manager/core/browser/password_manager_interface.h"
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
 #include "components/password_manager/core/browser/stub_password_manager_driver.h"
@@ -112,14 +113,28 @@
               (override));
 };
 
+class TestPasswordManagerDriver : public StubPasswordManagerDriver {
+ public:
+  explicit TestPasswordManagerDriver(PasswordManagerClient* client)
+      : password_generation_helper_(client, this) {}
+
+  PasswordGenerationFrameHelper* GetPasswordGenerationHelper() override {
+    return &password_generation_helper_;
+  }
+
+ private:
+  PasswordGenerationFrameHelper password_generation_helper_;
+};
+
 class SharedPasswordControllerTest : public PlatformTest {
  public:
   SharedPasswordControllerTest() : PlatformTest() {
     delegate_ = OCMProtocolMock(@protocol(SharedPasswordControllerDelegate));
     password_manager::PasswordManagerClient* client_ptr =
         &password_manager_client_;
-    password_manager::PasswordManagerDriver* driver_ptr =
-        &password_manager_driver_;
+    password_manager_driver_ =
+        std::make_unique<TestPasswordManagerDriver>(client_ptr);
+    TestPasswordManagerDriver* driver_ptr = password_manager_driver_.get();
     [[[delegate_ stub] andReturnValue:OCMOCK_VALUE(client_ptr)]
         passwordManagerClient];
     [[[delegate_ stub] andReturnValue:OCMOCK_VALUE(driver_ptr)]
@@ -150,7 +165,7 @@
   id form_helper_;
   id suggestion_helper_;
   password_manager::StubPasswordManagerClient password_manager_client_;
-  password_manager::StubPasswordManagerDriver password_manager_driver_;
+  std::unique_ptr<TestPasswordManagerDriver> password_manager_driver_;
   id delegate_;
   SharedPasswordController* controller_;
 };
diff --git a/components/password_manager/ios/test_helpers.cc b/components/password_manager/ios/test_helpers.cc
index 268728d..75b602dc 100644
--- a/components/password_manager/ios/test_helpers.cc
+++ b/components/password_manager/ios/test_helpers.cc
@@ -38,13 +38,11 @@
   autofill::FormFieldData username;
   username.name = base::UTF8ToUTF16(username_field);
   username.unique_renderer_id = FieldRendererId(username_unique_id);
-  username.unique_id = base::UTF8ToUTF16(username_field);
   username.value = base::UTF8ToUTF16(username_value);
   form_data->username_field = username;
   autofill::FormFieldData password;
   password.name = base::UTF8ToUTF16(password_field);
   password.unique_renderer_id = FieldRendererId(password_unique_id);
-  password.unique_id = base::UTF8ToUTF16(password_field);
   password.value = base::UTF8ToUTF16(password_value);
   form_data->password_field = password;
   if (additional_username) {
@@ -108,7 +106,6 @@
   field.name_attribute = field.name;
   field.value = u"googleuser";
   field.form_control_type = "text";
-  field.unique_id = field.id_attribute;
   form_data.fields.push_back(field);
 
   field.name = u"Passwd";
@@ -116,7 +113,6 @@
   field.name_attribute = field.name;
   field.value = u"p4ssword";
   field.form_control_type = "password";
-  field.unique_id = field.id_attribute;
   form_data.fields.push_back(field);
 
   return form_data;
diff --git a/components/permissions/features.cc b/components/permissions/features.cc
index cace91d..87aada7 100644
--- a/components/permissions/features.cc
+++ b/components/permissions/features.cc
@@ -65,7 +65,7 @@
 
 const base::Feature kPermissionOnDeviceNotificationPredictions{
     "PermissionOnDeviceNotificationPredictions",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 #if BUILDFLAG(IS_ANDROID)
 
@@ -111,7 +111,7 @@
     kPermissionOnDeviceNotificationPredictionsHoldbackChance(
         &features::kPermissionOnDeviceNotificationPredictions,
         "holdback_chance",
-        0.0);
+        0.3);
 
 #if !BUILDFLAG(IS_ANDROID)
 // Specifies the `trigger_id` of the HaTS survey to trigger immediately after
diff --git a/components/policy/core/browser/cloud/user_policy_signin_service_base.cc b/components/policy/core/browser/cloud/user_policy_signin_service_base.cc
index 669d7b37..931eabf 100644
--- a/components/policy/core/browser/cloud/user_policy_signin_service_base.cc
+++ b/components/policy/core/browser/cloud/user_policy_signin_service_base.cc
@@ -76,15 +76,17 @@
     DCHECK(client->is_registered());
     DCHECK(!manager->core()->client());
     InitializeUserCloudPolicyManager(account_id, std::move(client));
+    // `UserCloudPolicyManager` will initiate a policy fetch right after
+    // initialization. Invoke `callback` after the policy is fetched.
+    policy_fetch_callbacks().AddUnsafe(std::move(callback));
+    return;
   }
 
-  DCHECK(manager->core()->client());
-
   if (!manager->IsClientRegistered()) {
     // The manager already has a client but it's still registering.
     // `UserCloudPolicyManager` will initiate a policy fetch when the client
     // registration completes. Invoke `callback` after the policy is fetched.
-    policy_fetch_callbacks_.AddUnsafe(std::move(callback));
+    policy_fetch_callbacks().AddUnsafe(std::move(callback));
     return;
   }
 
@@ -127,7 +129,9 @@
 void UserPolicySigninServiceBase::PrepareForUserCloudPolicyManagerShutdown() {
   registration_helper_.reset();
   registration_helper_for_temporary_client_.reset();
-  policy_fetch_callbacks_.Notify(/*success=*/false);
+  // Don't run the callbacks to be consistent with
+  // `CloudPolicyService::RefreshPolicy()` behavior during shutdown.
+  policy_fetch_callbacks_.reset();
   UserCloudPolicyManager* manager = policy_manager();
   if (manager && manager->core()->client())
     manager->core()->client()->RemoveObserver(this);
@@ -135,6 +139,15 @@
     manager->core()->service()->RemoveObserver(this);
 }
 
+base::OnceCallbackList<void(bool)>&
+UserPolicySigninServiceBase::policy_fetch_callbacks() {
+  if (!policy_fetch_callbacks_) {
+    policy_fetch_callbacks_ =
+        std::make_unique<base::OnceCallbackList<void(bool)>>();
+  }
+  return *policy_fetch_callbacks_;
+}
+
 std::unique_ptr<CloudPolicyClient>
 UserPolicySigninServiceBase::CreateClientForRegistrationOnly(
     const std::string& username) {
@@ -349,7 +362,7 @@
 }
 
 void UserPolicySigninServiceBase::OnPolicyRefreshed(bool success) {
-  policy_fetch_callbacks_.Notify(success);
+  policy_fetch_callbacks().Notify(success);
 }
 
 void UserPolicySigninServiceBase::ProhibitSignoutIfNeeded() {}
diff --git a/components/policy/core/browser/cloud/user_policy_signin_service_base.h b/components/policy/core/browser/cloud/user_policy_signin_service_base.h
index 77cfa42..4cc86dd 100644
--- a/components/policy/core/browser/cloud/user_policy_signin_service_base.h
+++ b/components/policy/core/browser/cloud/user_policy_signin_service_base.h
@@ -172,6 +172,10 @@
   }
 
  private:
+  // A getter for `policy_fetch_callbacks_` that constructs a new instance if
+  // it's null.
+  base::OnceCallbackList<void(bool)>& policy_fetch_callbacks();
+
   // Returns a CloudPolicyClient to perform a registration with the DM server,
   // or NULL if |username| shouldn't register for policy management.
   std::unique_ptr<CloudPolicyClient> CreateClientForRegistrationOnly(
@@ -209,7 +213,7 @@
   signin::ConsentLevel consent_level_ = signin::ConsentLevel::kSignin;
 
   // Callbacks to invoke upon policy fetch.
-  base::OnceCallbackList<void(bool)> policy_fetch_callbacks_;
+  std::unique_ptr<base::OnceCallbackList<void(bool)>> policy_fetch_callbacks_;
 
   // Helper for registering the client to DMServer to get a DM token using a
   // cloud policy client. When there is an instance of |registration_helper_|,
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 27e114f..5397a385 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -4200,6 +4200,7 @@
 <translation id="5464816904705580310">Mengonfigurasi setelan untuk pengguna yang dikelola.</translation>
 <translation id="5466596281866046569">Melaporkan informasi aplikasi</translation>
 <translation id="546726650689747237">Penundaan peredupan layar saat menggunakan daya AC</translation>
+<translation id="546830339470589966">Pelengkapan otomatis domain untuk tiket Kerberos baru</translation>
 <translation id="5469143988693423708">Pengguna diaktifkan untuk menjalankan Crostini</translation>
 <translation id="5469825884154817306">Blokir gambar di situs ini</translation>
 <translation id="5470500958458209831">URL tempat playbook Ansible dapat didownload.</translation>
@@ -5065,6 +5066,10 @@
       Tidak menyetel kebijakan ini untuk suatu situs akan membuat kebijakan dari <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> berlaku untuk situs tersebut, jika disetel, atau izin akan mengikuti setelan default browser dan memungkinkan pengguna memilih izin ini untuk setiap situs.</translation>
 <translation id="6384542789059421431">Izinkan halaman hasil penelusuran mesin telusur default ditampilkan di panel samping Browser.</translation>
 <translation id="6394350458541421998">Kebijakan ini tidak lagi digunakan sejak <ph name="PRODUCT_OS_NAME" /> versi 29. Gunakan kebijakan PresentationScreenDimDelayScale sebagai gantinya.</translation>
+<translation id="6396956366662970339">Menentukan apakah model pengisian daya adaptif akan diizinkan untuk menunda proses pengisian daya guna memperpanjang masa pakai baterai.
+
+      Jika perangkat mengaktifkan AC (pengisian daya adaptif), model pengisian daya adaptif akan mengevaluasi apakah proses pengisian daya harus ditunda untuk memperpanjang masa pakai baterai. Jika proses pengisian daya ditunda, model pengisian daya adaptif akan menghentikan proses pengisian daya pada level tertentu (misalnya 80%), lalu kembali mengisi daya perangkat sampai 100% saat pengguna memerlukannya.
+      Jika kebijakan ini disetel ke Benar (True), model pengisian daya adaptif akan diaktifkan dan diizinkan untuk menunda proses pengisian daya guna memperpanjang masa pakai baterai. Jika kebijakan ini disetel ke Salah (False) atau tidak disetel, model pengisian daya adaptif tidak akan memengaruhi proses pengisian daya.</translation>
 <translation id="6397588391180665797">Melaporkan konfigurasi jaringan pengguna di perangkat terdaftar.
 
       Jika kebijakan disetel ke salah (false), informasi tersebut tidak akan dilaporkan.
@@ -6398,6 +6403,10 @@
 
       Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Kebijakan ini hanya mencocokkan berdasarkan asal, sehingga jalur apa pun di pola URL akan diabaikan.</translation>
 <translation id="7771298620150437359">Mengonfigurasi konten dan urutan bahasa pilihan</translation>
+<translation id="7773790010815041731">Aplikasi Chrome tidak digunakan lagi di <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" />, dan <ph name="LINUX_OS_NAME" />.
+      Jika kebijakan ini diaktifkan, <ph name="PRODUCT_NAME" /> akan terus mengizinkan Aplikasi Chrome dijalankan di platform berikut hingga tanggal akhir saat dukungan Aplikasi Chrome dihapus di semua platform, yakni Juni 2022.
+      Jika kebijakan ini dinonaktifkan atau tidak disetel, Aplikasi Chrome mungkin tidak diizinkan berjalan, bergantung pada status peluncuran penghentian.
+      Dalam kasus apa pun, Aplikasi Chrome yang diinstal otomatis oleh kebijakan akan terus diizinkan.</translation>
 <translation id="7774768074957326919">Gunakan setelan proxy sistem</translation>
 <translation id="777734450201217641">Mengaktifkan pintasan fitur aksesibilitas di layar login.
 
@@ -7509,6 +7518,7 @@
 
       Untuk informasi selengkapnya tentang pola input yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini. Kebijakan ini hanya mencocokkan berdasarkan asal, sehingga jalur apa pun di pola URL akan diabaikan.</translation>
 <translation id="9010080992450148617">Mengaktifkan pengiriman download ke Google untuk pemindaian mendalam bagi pengguna yang terdaftar di Program Perlindungan Lanjutan</translation>
+<translation id="9012101302849557459">Memperluas dukungan untuk Aplikasi Chrome di <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" />, dan <ph name="LINUX_OS_NAME" />.</translation>
 <translation id="9013875414788074110">Selama proses login, <ph name="PRODUCT_OS_NAME" /> dapat melakukan autentikasi terhadap server (online) atau menggunakan sandi yang tersimpan di cache (offline).
 
       Jika kebijakan ini ditetapkan ke nilai -1, pengguna dapat menjalankan autentikasi offline tanpa batas waktu. Jika ditetapkan ke nilai lain, kebijakan ini akan menentukan durasi waktu sejak autentikasi online terakhir, yang setelah itu pengguna harus menggunakan autentikasi online lagi.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index f10cebc..5a685437 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -4177,6 +4177,7 @@
 <translation id="5464816904705580310">Configurazione delle impostazioni per gli utenti gestiti.</translation>
 <translation id="5466596281866046569">Segnala informazioni sulle applicazioni</translation>
 <translation id="546726650689747237">Ritardo oscuramento schermo in caso di utilizzo di CA</translation>
+<translation id="546830339470589966">Completa automaticamente il dominio per i nuovi ticket Kerberos</translation>
 <translation id="5469143988693423708">L'utente è abilitato a eseguire Crostini</translation>
 <translation id="5469825884154817306">Blocca immagini su questi siti</translation>
 <translation id="5470500958458209831">L'URL da cui è possibile scaricare il playbook Ansible.</translation>
@@ -5018,6 +5019,10 @@
       Se il criterio non viene configurato per un sito, il criterio di <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> viene applicato al sito, se configurato, altrimenti l'autorizzazione seguirà le impostazioni predefinite del browser e consentirà agli utenti di scegliere se concedere o meno l'autorizzazione per ciascun sito.</translation>
 <translation id="6384542789059421431">Attiva la visualizzazione delle pagine di risultati del motore di ricerca predefinito in un riquadro laterale del browser.</translation>
 <translation id="6394350458541421998">La norma non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_OS_NAME" />. Utilizza la norma PresentationScreenDimDelayScale.</translation>
+<translation id="6396956366662970339">Consente di specificare se un modello di ricarica adattiva può sospendere la procedura di ricarica per prolungare la durata della batteria.
+
+      Quando per il dispositivo viene usata l'alimentazione CA, il modello di ricarica adattiva valuta se sospendere o meno la procedura di ricarica per prolungare la durata della batteria. Se il modello di ricarica adattiva sospende la procedura di ricarica, mantiene la batteria a un determinato livello (ossia 80%), dopodiché ricarica il dispositivo fino al 100% quando l'utente ne ha bisogno.
+      Se questo criterio viene impostato su True, il modello di ricarica adattiva viene attivato e può sospendere la procedura di ricarica per prolungare la durata della batteria. Se questo criterio viene impostato su False o se non viene configurato, il modello di ricarica adattiva non influisce sulla procedura di ricarica.</translation>
 <translation id="6397588391180665797">Consente di segnalare eventi di configurazione di rete degli utenti su dispositivi registrati.
 
       Se il criterio viene impostato su Falso, le informazioni non vengono segnalate.
@@ -6353,6 +6358,10 @@
 
       Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="7771298620150437359">Configura i contenuti e l'ordine delle lingue preferite</translation>
+<translation id="7773790010815041731">Le app di Chrome sono state ritirate su <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />.
+      Se questo criterio viene attivato, <ph name="PRODUCT_NAME" /> continuerà a consentire l'esecuzione delle app di Chrome su queste piattaforme fino alla data ultima del ritiro del supporto di queste app su tutte le piattaforme, vale a dire giugno 2022.
+      Se questo criterio viene disattivato o se non viene configurato, potrebbe non essere consentita l'esecuzione delle app di Chrome, in base allo stato del ritiro graduale.
+      In ogni caso, continueranno a essere consentite le app di Chrome con installazione forzata in base al criterio.</translation>
 <translation id="7774768074957326919">Utilizza le impostazioni proxy di sistema</translation>
 <translation id="777734450201217641">Consente di attivare le scorciatoie delle funzioni di accessibilità nella schermata di accesso.
 
@@ -7456,6 +7465,7 @@
 
       Per informazioni dettagliate sui pattern di input validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation>
 <translation id="9010080992450148617">Attiva invio download a Google per scansione approfondita per utenti iscritti al programma di protezione avanzata</translation>
+<translation id="9012101302849557459">Estendi il supporto delle app di Chrome su <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" /></translation>
 <translation id="9013875414788074110">Durante l'accesso, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
 
       Quando la norma è impostata sul valore -1, l'utente può eseguire per sempre l'autenticazione offline. Quando la norma è impostata su qualsiasi altro valore, questo specifica il periodo di tempo trascorso dall'ultima autenticazione online, dopo il quale l'utente dovrà eseguire nuovamente l'autenticazione.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 374efa5..afdd276 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -4192,6 +4192,7 @@
 <translation id="5464816904705580310">관리 사용자에 대한 설정 구성</translation>
 <translation id="5466596281866046569">애플리케이션 정보 보고</translation>
 <translation id="546726650689747237">AC 전원으로 실행할 때 화면 어둡게 하기 지연</translation>
+<translation id="546830339470589966">새 Kerberos 티켓의 도메인 자동 완성</translation>
 <translation id="5469143988693423708">사용자가 Crostini를 실행할 수 있음</translation>
 <translation id="5469825884154817306">이 사이트의 이미지 차단</translation>
 <translation id="5470500958458209831">Ansible 플레이북을 다운로드할 수 있는 URL입니다.</translation>
@@ -5044,6 +5045,10 @@
       사이트에 해당 정책을 설정하지 않으면 <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" />의 정책이 설정되어 있는 경우 사이트에 적용됩니다. 설정되어 있지 않다면 권한이 브라우저의 기본값을 따르고 사용자는 사이트별로 이 권한을 선택할 수 있습니다.</translation>
 <translation id="6384542789059421431">브라우저 측면 패널에 기본 검색엔진 결과 페이지 표시를 사용 설정합니다.</translation>
 <translation id="6394350458541421998">이 정책은 <ph name="PRODUCT_OS_NAME" /> 버전 29를 기준으로 지원 중단되었습니다. 대신 PresentationScreenDimDelayScale 정책을 사용해 주시기 바랍니다.</translation>
+<translation id="6396956366662970339">배터리 수명 연장을 위해 충전 프로세스를 보류하는 자동 조절 충전 모델의 사용 여부를 지정합니다.
+
+      기기가 AC 전원을 사용하는 경우 자동 조절 충전 모델이 배터리 수명 연장을 위해 충전 프로세스를 보류해야 할지 결정합니다. 충전 프로세스를 보류하는 경우 자동 조절 충전 모델은 배터리를 특정 수준(예: 80%)으로 유지하다가 사용자에게 필요할 때 기기를 100%까지 충전합니다.
+      정책을 True로 설정하면 자동 조절 충전 모델이 사용 설정되어 배터리 수명 연장을 위해 충전 프로세스를 보류할 수 있습니다. 정책을 False로 설정하거나 설정하지 않으면 자동 조절 충전 모델은 충전 프로세스에 영향을 주지 않습니다.</translation>
 <translation id="6397588391180665797">등록된 기기에서 사용자 네트워크 구성을 보고합니다.
 
       정책을 False로 설정하면 정보가 보고되지 않습니다.
@@ -6380,6 +6385,10 @@
 
       유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요.  이 정책은 출처만 기준으로 일치 여부를 판단하므로 URL 패턴의 경로는 무시됩니다.</translation>
 <translation id="7771298620150437359">기본 언어의 콘텐츠 및 순서 구성</translation>
+<translation id="7773790010815041731"><ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" />, <ph name="LINUX_OS_NAME" />에서 Chrome 앱 지원이 중단되었습니다.
+      정책을 사용 설정하면 2022년 6월에 모든 플랫폼에서 Chrome 앱 지원이 삭제되는 마지막 날짜까지 <ph name="PRODUCT_NAME" />에서는 Chrome 앱이 이러한 플랫폼에서 실행되도록 허용합니다.
+      정책을 사용 안함으로 설정하거나 설정하지 않으면 지원 중단 시행 상태에 따라 Chrome 앱이 실행되지 않을 수도 있습니다.
+      어떤 경우든 정책에 의해 강제 설치된 Chrome 앱은 계속 허용됩니다.</translation>
 <translation id="7774768074957326919">시스템 프록시 설정 사용</translation>
 <translation id="777734450201217641">로그인 화면에서 접근성 기능 단축키를 사용 설정합니다.
 
@@ -7497,6 +7506,7 @@
 
       유효한 입력 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다. 이 정책은 출처만 기준으로 매치하므로 URL 패턴의 경로는 무시됩니다.</translation>
 <translation id="9010080992450148617">고급 보호 프로그램에 등록된 사용자가 다운로드한 항목을 심층 검사를 위해 Google에 전송하도록 허용</translation>
+<translation id="9012101302849557459"><ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" />, <ph name="LINUX_OS_NAME" />에서 Chrome 앱 지원을 확장합니다.</translation>
 <translation id="9013875414788074110">로그인하는 동안 <ph name="PRODUCT_OS_NAME" />은(는) 서버(온라인) 또는 캐시된 비밀번호(오프라인)를 사용하여 인증할 수 있습니다.
 
       이 정책의 값을 -1로 설정하면 사용자는 언제든지 오프라인에서 인증할 수 있습니다. 이 정책을 다른 값으로 설정하면 마지막 온라인 인증 후 오프라인에서 인증할 수 있는 기간(이 기간이 지나면 다시 온라인 인증을 사용해야 함)이 지정됩니다.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 80659e6..7df8b65f 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -107,6 +107,11 @@
 <translation id="1117535567637097036">ไม่มีการใช้เครื่องจัดการโปรโตคอลที่ตั้งค่าผ่านนโยบายนี้ระหว่างการจัดการ Intent ของ Android</translation>
 <translation id="1118093128235245168">อนุญาตให้เว็บไซต์ขอสิทธิ์จากผู้ใช้เพื่อเข้าถึงอุปกรณ์ USB ที่เชื่อมต่ออยู่</translation>
 <translation id="111910763555783249">การตั้งค่าการแจ้งเตือน</translation>
+<translation id="1120291391245112391">รายงานตำแหน่งทางภูมิศาสตร์ของอุปกรณ์
+
+      การตั้งค่านโยบายเป็น "เปิดใช้" จะทำให้อุปกรณ์ที่ลงทะเบียนไว้รายงานตำแหน่งเป็นระยะๆ
+
+      การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานตำแหน่ง</translation>
 <translation id="1122089575901325963">การตั้งค่านโยบายนี้จะกำหนดค่าตัวควบคุมการวินิจฉัยและการวัดและส่งข้อมูลทางไกล (DTC) ของ <ph name="WILCO_NAME" /> หากมีให้ใช้งานในอุปกรณ์ การตั้งค่าต้องมีขนาดไม่เกิน 1 MB (1,000,000 ไบต์) และต้องอยู่ในรูปแบบ JSON DTC ของ <ph name="WILCO_NAME" /> จะมีหน้าที่จัดการกับการกำหนดค่าดังกล่าว ระบบใช้แฮชแบบเข้ารหัสเพื่อยืนยันความสมบูรณ์ของการดาวน์โหลด รวมถึงจะดาวน์โหลดและแคชการกำหนดค่า และดาวน์โหลดซ้ำอีกเมื่อใดก็ตามที่ URL หรือแฮชมีการเปลี่ยนแปลง
 
       หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนไม่ได้</translation>
@@ -156,6 +161,7 @@
 <translation id="1163080558183062209">ปิดใช้ประเภทเครื่องพิมพ์ในรายการปฏิเสธ</translation>
 <translation id="117059611145966538">เซิร์ฟเวอร์การพิมพ์ภายนอก</translation>
 <translation id="117080706484659953">อนุญาตการตรวจหาขอบเขตนโยบายใน <ph name="MAC_OS_NAME" /></translation>
+<translation id="1171106901454883937">เปิดใช้การรายงานข้อมูลเวอร์ชันอุปกรณ์</translation>
 <translation id="1171785618439752042">การตั้งค่านโยบายจะกำหนดประเภทการเข้ารหัสที่ได้รับอนุญาตเมื่อขอตั๋ว Kerberos จากเซิร์ฟเวอร์ <ph name="MS_AD_NAME" />
 
       การตั้งค่านโยบายเป็น
@@ -470,6 +476,11 @@
       ดูเอกสารประกอบเกี่ยวกับส่วนขยายจากภายนอกและการติดตั้งได้ที่ https://developer.chrome.com/apps/external_extensions
       </translation>
 <translation id="1486021504508098388">รายงานข้อมูลแบ็กไลต์</translation>
+<translation id="1486469502848499602">เปลี่ยนการกำหนดค่าที่แนะนำของ <ph name="KRB5_CONFIG" /> สำหรับตั๋วใหม่ที่สร้างขึ้นด้วยตนเอง
+
+      หากตั้งค่านโยบายนี้ ระบบจะใช้ค่าของนโยบายเป็นการกำหนดค่าที่แนะนำและแสดงในส่วน "ขั้นสูง" ของกล่องโต้ตอบการตรวจสอบสิทธิ์
+
+      หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้การกำหนดค่าที่แนะนำของ "<ph name="PRODUCT_OS_NAME" />" แทน โดยจะแสดงในส่วน "ขั้นสูง" ของกล่องโต้ตอบการตรวจสอบสิทธิ์ด้วย</translation>
 <translation id="1487916040416013623">การตั้งค่านโยบายจะระบุว่าเซิร์ฟเวอร์ใดควรจะได้รับอนุญาตสำหรับการตรวจสอบสิทธิ์แบบผสานรวม การตรวจสอบสิทธิ์แบบผสานรวมจะเปิดเฉพาะเมื่อ <ph name="PRODUCT_NAME" /> ได้รับคำขอตรวจสอบสิทธิ์จากพร็อกซีหรือจากเซิร์ฟเวอร์ที่อยู่ในรายการที่ได้รับอนุญาตนี้
 
       การไม่ตั้งค่านโยบายหมายความว่า <ph name="PRODUCT_NAME" /> จะพยายามตรวจหาว่าเซิร์ฟเวอร์อยู่บนอินทราเน็ตไหม หากใช่ก็จะตอบรับคำขอ IWA หากมีการตรวจพบว่าเซิร์ฟเวอร์เป็นอินเทอร์เน็ต <ph name="PRODUCT_NAME" /> จะไม่สนใจคำขอ IWA จากเซิร์ฟเวอร์
@@ -552,6 +563,7 @@
 <translation id="1583248206450240930">ใช้ <ph name="PRODUCT_FRAME_NAME" /> โดยค่าเริ่มต้น</translation>
 <translation id="1587585749332985896">ไม่อนุญาตให้ใช้โหมดไม่มีส่วนหัว</translation>
 <translation id="1588240398285670601">การตั้งค่าเบราว์เซอร์</translation>
+<translation id="1592334921377856028">ปิดใช้การรายงานสถานะของฮาร์ดแวร์อุปกรณ์</translation>
 <translation id="1597684038583138808">เปิดใช้คำจำกัดความของคำตอบด่วน</translation>
 <translation id="1599424828227887013">เปิดใช้การแยกเว็บไซต์สำหรับต้นทางที่เจาะจงในอุปกรณ์ Android</translation>
 <translation id="159946228300522107">การตั้งค่านโยบายเป็น "จริง" หมายความว่า Chrome จะขยายหน้าต่างแรกที่แสดงเมื่อเรียกใช้ครั้งแรก
@@ -701,6 +713,7 @@
 
       การตั้งค่านโยบายเป็น "เท็จ" หมายความว่าผู้ใช้จะเพิ่ม แก้ไข หรือนำบุ๊กมาร์กออกไม่ได้ แต่ยังใช้บุ๊กมาร์กที่มีได้</translation>
 <translation id="1715151459541210849">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการเขียนตามคำบอก</translation>
+<translation id="1719033799014769396">ปิดใช้การรายงานโหมดเปิดเครื่องของอุปกรณ์</translation>
 <translation id="1721158690981421598">การตั้งค่านโยบายจะระบุชื่อโดเมนของโฮสต์ซึ่งจะกำหนดให้กับโฮสต์การเข้าถึงระยะไกล และผู้ใช้จะเปลี่ยนแปลงชื่อไม่ได้ ระบบจะแชร์โฮสต์ได้ต่อเมื่อใช้บัญชีที่ลงทะเบียนในชื่อโดเมนที่ระบุไว้เท่านั้น
 
       การตั้งค่านโยบายเป็นรายการที่ว่างเปล่าหรือไม่ตั้งค่าจะทำให้ระบบแชร์โฮสต์โดยใช้บัญชีใดก็ได้
@@ -957,6 +970,7 @@
 
       การเปลี่ยนแปลงนโยบายจะมีผลขณะที่ ARC ไม่ได้ทำงานอยู่เท่านั้น เช่น ขณะเริ่มต้น Chrome OS</translation>
 <translation id="1985598967415986700">การลด User Agent จะควบคุมได้ผ่านช่วงทดลองใช้งานภาคสนามและช่วงทดลองใช้จากต้นทาง</translation>
+<translation id="1987789058026551147">เปิดใช้การรายงานเซสชันคีออสก์ของอุปกรณ์</translation>
 <translation id="1988345404999458987">ระบุการกำหนดค่าเซิร์ฟเวอร์การพิมพ์ที่พร้อมใช้งาน
 
       นโยบายนี้ช่วยให้คุณระบุการกำหนดค่าเซิร์ฟเวอร์การพิมพ์ภายนอกสำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> เป็นไฟล์ JSON ได้
@@ -2463,6 +2477,7 @@
 <translation id="3539103206548425861">การตั้งค่านโยบายอนุญาตให้วิดีโอเล่นโดยอัตโนมัติ (โดยไม่ต้องมีคำยินยอมจากผู้ใช้) พร้อมเนื้อหาเสียงใน <ph name="PRODUCT_NAME" /> หากตั้งค่านโยบาย <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> เป็น "จริง" นโยบายนี้ก็จะไม่มีผล หากตั้งค่านโยบาย <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> เป็น "เท็จ" รูปแบบ URL ที่กำหนดไว้ในนโยบายนี้จะยังเล่นได้อยู่ หากนโยบายนี้เปลี่ยนแปลงในขณะที่ <ph name="PRODUCT_NAME" /> ทำงานอยู่ จะมีผลกับแท็บที่เปิดใหม่เท่านั้น
 
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns</translation>
+<translation id="3540846231645422635">ปิดใช้การรายงานอินเทอร์เฟซเครือข่ายของอุปกรณ์</translation>
 <translation id="3540935459049973317">การจำกัดเวลาต่อแอป</translation>
 <translation id="3547954654003013442">การตั้งค่าพร็อกซี</translation>
 <translation id="3548642468619496972">บล็อกการดาวน์โหลดที่เป็นอันตราย ไม่ปกติ หรือไม่พึงประสงค์ รวมถึงประเภทไฟล์ที่เป็นอันตราย</translation>
@@ -2609,6 +2624,7 @@
 <translation id="3736879847913515635">เปิดใช้การเพิ่มบุคคลในการจัดการผู้ใช้</translation>
 <translation id="3749259744154402564">ไม่รองรับ</translation>
 <translation id="3750220015372671395">บล็อกการสร้างคีย์ในเว็บไซต์เหล่านี้</translation>
+<translation id="3753959315989102457">ปิดใช้การรายงานตำแหน่งของอุปกรณ์</translation>
 <translation id="3755237588083934849">การตั้งค่านโยบายจะกำหนดความถี่ในการส่งการอัปโหลดสถานะอุปกรณ์เป็นมิลลิวินาที ค่าขั้นต่ำที่อนุญาตคือ 60 วินาที
 
       หากไม่ได้ตั้งค่า ระบบจะใช้ช่วงเวลาเริ่มต้น 3 ชั่วโมง</translation>
@@ -2686,6 +2702,7 @@
 <translation id="3798922329287609568">การตั้งค่านโยบายนี้จะจำกัดโหมดการพิมพ์ 2 ด้าน
 
       หากไม่ตั้งค่านโยบายหรือปล่อยว่างไว้ ระบบจะถือว่าไม่มีข้อจำกัด</translation>
+<translation id="3799417300383048419">เก็บข้อมูลโปรไฟล์ไว้ในดิสก์เมื่อเซสชันของผู้ใช้สิ้นสุดลง</translation>
 <translation id="3803171355925844705">ไม่อนุญาตให้เว็บไซต์ใดๆ โหลดเนื้อหาผสม</translation>
 <translation id="3808945828600697669">ระบุรายการปลั๊กอินที่ปิดใช้งาน</translation>
 <translation id="3810642039169532482">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการเขียนตามคำบอกในหน้าจอการเข้าสู่ระบบ
@@ -2794,6 +2811,7 @@
 <translation id="3897218615484393758">จำกัดเวลาที่ผู้ใช้ซึ่งตรวจสอบสิทธิ์ผ่าน SAML จะเข้าสู่ระบบแบบออฟไลน์ได้ในหน้าจอล็อก</translation>
 <translation id="3898345958122666461">ปิด NTLMv2</translation>
 <translation id="3898795800259311780">อนุญาตหรือปฏิเสธการจับภาพหน้าจอ</translation>
+<translation id="3903313632842363082">ปิดใช้การรายงานผู้ใช้อุปกรณ์</translation>
 <translation id="3907683835264956726">อนุญาตให้ผู้ใช้ที่ออนไลน์ลงชื่อเข้าใช้ในหน้าจอล็อก หากตั้งค่านโยบายเป็น "จริง" นโยบายอย่างเช่น <ph name="POLICY" /> จะทำให้มีการตรวจสอบสิทธิ์อีกครั้งทางออนไลน์ในหน้าจอล็อก
       ระบบจะบังคับใช้การตรวจสอบสิทธิ์อีกครั้งทันทีที่อยู่ในหน้าจอล็อก หรือครั้งถัดไปที่ผู้ใช้ล็อกหน้าจอหลังเงื่อนไขตรงตามที่กำหนด
       หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า ผู้ใช้จะปลดล็อกหน้าจอได้เสมอด้วยข้อมูลเข้าสู่ระบบในเครื่อง</translation>
@@ -2825,6 +2843,7 @@
       หากปล่อยว่างไว้หรือไม่ได้ตั้งค่า ระบบจะปิดใช้ฟีเจอร์นี้
 
       หมายเหตุ: ต้องใช้นโยบายนี้กับ <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" /></translation>
+<translation id="3924506460382372403">ปิดใช้การรายงานสถานะกราฟิกของอุปกรณ์</translation>
 <translation id="3925377537407648234">ตั้งค่าความละเอียดและปัจจัยที่มีผลต่อขนาดการแสดงผล</translation>
 <translation id="3927137827189017535">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับคีย์ติดหนึบในหน้าจอการเข้าสู่ระบบ
 
@@ -2925,6 +2944,7 @@
       ใน <ph name="MS_WIN_NAME" /> ฟังก์ชันการทำงานนี้ใช้ได้เฉพาะในอินสแตนซ์ที่เข้าร่วมโดเมน <ph name="MS_AD_NAME" />, ทำงานใน Windows 10 Pro หรือลงทะเบียนใน<ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" /> ใน <ph name="MAC_OS_NAME" /> ฟังก์ชันการทำงานนี้ใช้ได้เฉพาะในอินสแตนซ์ที่จัดการผ่าน MDM หรือเข้าร่วมโดเมนผ่าน MCX</translation>
 <translation id="4043796890723386527">ป้องกันไม่ให้ผู้ใช้สร้างและใช้โปรไฟล์รอง ตลอดจนป้องกันไม่ให้ใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" /></translation>
 <translation id="4051723201852944592">เปิดใช้การตรวจหาการบังหน้าต่าง</translation>
+<translation id="4053157306171963473">ปิดใช้การรายงานเวลาของกิจกรรมในอุปกรณ์</translation>
 <translation id="4056910949759281379">ปิดใช้งานโปรโตคอล SPDY</translation>
 <translation id="4061107397839125009">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่แสดงการแจ้งเตือนไม่ได้
 
@@ -3101,6 +3121,7 @@
 <translation id="4261964161337162399">อัตราที่ใช้ในการสุ่มตัวอย่างและรวบรวมข้อมูลเสียง ค่าขั้นต่ำที่อนุญาตคือ 1 นาที
 
       หากไม่ได้ตั้งค่า ระบบจะใช้อัตราเริ่มต้น 10 นาที</translation>
+<translation id="4263788921751326798">ปิดใช้การรายงานรายละเอียดข้อขัดข้องของอุปกรณ์</translation>
 <translation id="4266547484666068234">การตั้งค่านโยบายจะให้สิทธิ์เข้าถึง URL ที่ระบุไว้ โดยเป็นข้อยกเว้นของ <ph name="URL_BLOCKLIST_POLICY_NAME" /> ดูรูปแบบของรายการในลิสต์นี้ได้จากคำอธิบายของนโยบายดังกล่าว ตัวอย่างเช่น การตั้งค่า <ph name="URL_BLOCKLIST_POLICY_NAME" /> เป็น * จะบล็อกคำขอทั้งหมด และคุณจะใช้นโยบายนี้เพื่ออนุญาตการเข้าถึงรายการ URL ที่จำกัดไว้ได้ ตลอดจนใช้ในการเปิดข้อยกเว้นให้แก่บางรูปแบบ โดเมนย่อยของโดเมนอื่นๆ พอร์ต หรือเส้นทางที่เฉพาะเจาะจง โดยใช้รูปแบบที่ระบุไว้ที่ (https://www.chromium.org/administrators/url-blocklist-filter-format) ตัวกรองที่เฉพาะเจาะจงมากที่สุดจะเป็นตัวกำหนดว่า URL หนึ่งๆ ถูกบล็อกหรือได้รับอนุญาต นโยบาย <ph name="URL_ALLOWLIST_POLICY_NAME" /> จะมีความสำคัญเหนือ <ph name="URL_BLOCKLIST_POLICY_NAME" /> นโยบายนี้ระบุรายการได้ไม่เกิน 1,000 รายการ
 
       นโยบายนี้ยังให้คุณเปิดใช้การเรียกใช้อัตโนมัติโดยเบราว์เซอร์ของแอปพลิเคชันภายนอกที่ลงทะเบียนเป็นเครื่องจัดการโปรโตคอลสำหรับโปรโตคอลที่ระบุไว้ เช่น "tel:" หรือ "ssh:"
@@ -3443,7 +3464,9 @@
 <translation id="4674871290487541952">อนุญาตอัลกอริทึมที่ไม่ปลอดภัยในการตรวจสอบความสมบูรณ์ของการอัปเดตและการติดตั้งส่วนขยาย</translation>
 <translation id="4680961954980851756">เปิดใช้งานการป้อนอัตโนมัติ</translation>
 <translation id="4685721728282448265">CECPQ2 ซึ่งเป็นข้อตกลงเกี่ยวกับคีย์หลังยุคควอนตัมที่เปิดใช้สำหรับ TLS</translation>
+<translation id="4693190628432874457">เปิดใช้การรายงานตำแหน่งของอุปกรณ์</translation>
 <translation id="4693779768620889402">ปลายทางตามส่วนขยาย</translation>
+<translation id="4694138212536142867">เปิดใช้การรายงานสถานะของฮาร์ดแวร์อุปกรณ์</translation>
 <translation id="4697581738794063407">ควบคุมฟีเจอร์ตัวกรองพารามิเตอร์ของ URL</translation>
 <translation id="4699172675775169585">รูปภาพและไฟล์ที่แคชไว้</translation>
 <translation id="4699592681017489215">นโยบายนี้กำหนดค่าการสลับในเครื่องที่จะใช้สำหรับการปิดใช้การตรวจสอบการสกัดกั้น DNS ได้ การตรวจสอบจะพยายามหาว่าเบราว์เซอร์อยู่หลังพร็อกซีที่เปลี่ยนเส้นทางชื่อโฮสต์ที่ไม่รู้จักหรือไม่
@@ -3468,6 +3491,7 @@
 <translation id="475479145997699293">การตั้งค่านโยบายเป็น <ph name="ASK_FILE_HANDLING" /> จะทำให้เว็บแอปสามารถขอสิทธิ์เข้าถึงไฟล์ประเภทต่างๆ ผ่าน File Handling API การตั้งค่านโยบายเป็น <ph name="BLOCK_FILE_HANDLING" /> จะปฏิเสธการเข้าถึงไฟล์ประเภทต่างๆ
 
       การไม่ตั้งค่าจะทำให้เว็บแอปสามารถขอสิทธิ์เข้าถึง แต่ผู้ใช้เปลี่ยนการตั้งค่านี้ได้</translation>
+<translation id="4756953551789081500">ปิดใช้การรายงานสถานะการอัปเดตระบบปฏิบัติการของอุปกรณ์</translation>
 <translation id="4757053978738874325">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับเสียงโมโน
 
           ฟีเจอร์นี้ทำหน้าที่เอาต์พุตเสียงสเตอริโอซึ่งรวมช่องสัญญาณเสียงที่ต่างกันเพื่อให้หูคนละข้างได้รับเสียงที่ต่างกัน
@@ -3505,6 +3529,7 @@
 <translation id="4816674326202173458">อนุญาตให้ผู้ใช้ขององค์กรเป็นทั้งผู้ใช้หลักและรอง (ค่าเริ่มต้นสำหรับผู้ใช้ที่ไม่ได้รับการจัดการ)</translation>
 <translation id="4820432864264617413">ป้องกันไม่ให้ <ph name="BOREALIS_NAME" /> ทำงานสำหรับผู้ใช้</translation>
 <translation id="4821987881803903281">บล็อกสิทธิ์สำหรับตำแหน่งหน้าต่างในเว็บไซต์เหล่านี้</translation>
+<translation id="4825777333376170738">ปิดใช้การรายงานเซสชันคีออสก์ของอุปกรณ์</translation>
 <translation id="4826326557828204741">การกระทำที่จะดำเนินการเมื่อไม่มีการใช้งานจนถึงการหน่วงเวลาที่กำหนด ขณะที่ใช้พลังงานจากแบตเตอรี่</translation>
 <translation id="4827727182370777723">การตั้งค่าเริ่มต้นของสิทธิ์สำหรับแบบอักษรในเครื่อง</translation>
 <translation id="482803100714220060">แสดง URL แบบเต็ม</translation>
@@ -3656,6 +3681,11 @@
       หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่า ผู้ใช้จะเป็นผู้เลือกว่าจะส่งรายงานหรือไม่
 
       ดูเพิ่มเติมเกี่ยวกับ Google Safe Browsing (https://developers.google.com/safe-browsing)</translation>
+<translation id="4954352279763128540">เพิ่มโดเมนที่กรอกไว้ล่วงหน้าลงในกล่องโต้ตอบการตรวจสอบสิทธิ์ Kerberos
+
+          หากตั้งค่านโยบายนี้ ช่อง "ชื่อผู้ใช้ Kerberos" จะแสดงโดเมนที่กรอกไว้ล่วงหน้าทางด้านขวา หากผู้ใช้ป้อนชื่อผู้ใช้ ระบบจะเชื่อมโยงกับโดเมนที่กรอกไว้ล่วงหน้าดังกล่าว หากผู้ใช้ป้อนข้อมูลที่มี "@" โดเมนที่กรอกไว้ล่วงหน้าจะไม่แสดงและไม่ส่งผลต่อการป้อนข้อมูลนั้น
+
+          หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะไม่แสดงข้อมูลเพิ่มเติมและการสร้างตั๋วจะทำงานตามปกติ</translation>
 <translation id="4955566229684195326">การตั้งค่านี้อนุญาตให้ผู้ใช้สร้างและใช้โปรไฟล์รอง และใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" />
 
       หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า ผู้ใช้จะไม่สามารถสร้างหรือใช้โปรไฟล์รองและโหมดผู้มาเยือนได้ ซึ่งคล้ายกับทั้งนโยบาย <ph name="BROWSER_ADD_PERSON_ENABLED_POLICY_NAME" /> และ <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" /> โปรไฟล์รองที่สร้างก่อนหน้านี้ (หากมี) จะใช้ไม่ได้
@@ -3713,6 +3743,7 @@
 <translation id="5025239932007658691">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ <ph name="PRODUCT_NAME" /> ส่งการค้นหาไปยังเซิร์ฟเวอร์ของ Google เป็นครั้งคราวเพื่อเรียกการประทับเวลาที่ถูกต้อง
 
       การตั้งค่านโยบายเป็น "ปิดใช้" จะหยุด <ph name="PRODUCT_NAME" /> ไม่ให้ส่งการค้นหาเหล่านี้</translation>
+<translation id="5034504101537897433">เปิดใช้การรายงานรายละเอียดข้อขัดข้องของอุปกรณ์</translation>
 <translation id="5039110755072335605">การรองรับส่วนหัวของคำขอที่ไม่มีไวลด์การ์ดสำหรับ CORS</translation>
 <translation id="504116558738617678">แสดงคำเตือนพื้นที่ในดิสก์เหลือน้อยเฉพาะในกรณีที่อุปกรณ์ไม่มีการจัดการหรือมีผู้ใช้เพียงคนเดียว</translation>
 <translation id="5055474681190962362">วันที่ของเดือน [1-31] ที่ควรมีการรีบูต โดยตีความในเขตเวลาท้องถิ่นของอุปกรณ์ ใช้เมื่อ "frequency" เท่ากับ "MONTHLY" เท่านั้น หากต้องการระบุจำนวนที่มากกว่าจำนวนวันสูงสุดในเดือนหนึ่งๆ ให้เลือกวันสุดท้ายของเดือน</translation>
@@ -3918,6 +3949,7 @@
       การตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่าจะปิดเดสก์ท็อปแบบรวมหลายหน้าจอ และผู้ใช้จะเปิดไม่ได้</translation>
 <translation id="5255162913209987122">สามารถรับคำแนะนำได้</translation>
 <translation id="5257395339965216304">ข้อมูลแอปที่โฮสต์ไว้</translation>
+<translation id="5262320080678421295">ปิดใช้การเชื่อถือใบรับรองที่ออกโดย PKI เดิมของ Symantec Corporation</translation>
 <translation id="5266173014392157048">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้นโยบาย "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />" แทน
 
       การตั้งค่านโยบายจะกำหนดเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> อาจมอบสิทธิ์ให้ คั่นชื่อเซิร์ฟเวอร์หลายรายการด้วยเครื่องหมายจุลภาค ใช้ไวลด์การ์ด (<ph name="WILDCARD_VALUE" />) ได้
@@ -5053,6 +5085,7 @@
           วิธีที่แนะนำสำหรับการล็อกหน้าจอเมื่อไม่มีความเคลื่อนไหวก็คือการเปิดใช้การล็อกหน้าจอเมื่อถูกระงับการใช้งาน และให้ <ph name="PRODUCT_OS_NAME" /> ระงับการใช้งานหลังจากหมดระยะหน่วงเวลาของการไม่มีความเคลื่อนไหว นโยบายนี้ควรใช้ในเวลาที่การล็อกหน้าจอควรจะเกิดขึ้นก่อนเวลาระงับการใช้งานเป็นเวลานาน หรือเมื่อไม่ต้องการใช้การระงับการใช้งานเมื่อไม่ใช้งานเลยเท่านั้น
 
           ควรระบุค่าของนโยบายเป็นมิลลิวินาที ค่าจะถูกบีบให้น้อยกว่าระยะหน่วงเวลาของการไม่มีความเคลื่อนไหว</translation>
+<translation id="6497085755801788141">ใช้ตัวตรวจสอบใบรับรองในตัว</translation>
 <translation id="6506239283767807745">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="NOTE_TAKING_APPS_LOCK_SCREEN_ALLOWLIST" /> แทน
 
       การตั้งค่านโยบายจะระบุแอปที่ผู้ใช้เปิดเป็นแอปจดโน้ตในหน้าจอล็อกของ <ph name="PRODUCT_OS_NAME" /> ได้
@@ -5145,6 +5178,7 @@
       โปรดทราบว่า EnabledPlugins และ DisabledPluginsExceptions ลบล้างนโยบายนี้ได้
 
       หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะใช้ปลั๊กอินใดก็ตามที่ติดตั้งไว้ในระบบได้ ยกเว้นปลั๊กอินที่มีฮาร์ดโค้ดที่เข้ากันไม่ได้ ล้าสมัย หรือเป็นอันตราย</translation>
+<translation id="6574903167639386816">ล้างข้อมูลโปรไฟล์ในดิสก์เมื่อเซสชันของผู้ใช้สิ้นสุดลง</translation>
 <translation id="6575944031719151455">การตั้งค่านโยบายจะระบุรายการบัญชีในอุปกรณ์ที่จะแสดงในหน้าจอลงชื่อเข้าใช้ ตัวระบุจะเป็นตัวบอกความแตกต่างของบัญชีในอุปกรณ์
 
       หากไม่ได้ตั้งค่านโยบายหรือนโยบายเป็นรายการที่ว่างเปล่า ก็จะไม่มีบัญชีในอุปกรณ์แสดงเลย</translation>
@@ -5326,6 +5360,7 @@
 
       เมื่อตั้งค่าเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า เว็บไซต์จะใช้ SharedArrayBuffers ได้เฉพาะเมื่อมีการแยกแบบข้ามต้นทาง</translation>
 <translation id="6735701345096330595">บังคับให้เปิดใช้การตรวจการสะกดของภาษาต่างๆ</translation>
+<translation id="6736283207617136584">เปิดใช้การรายงานสถานะการอัปเดตระบบปฏิบัติการของอุปกรณ์</translation>
 <translation id="6740611636377710500">อนุญาตให้ผู้ใช้รายนี้เรียกใช้ PluginVm ได้
 
       หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า จะไม่มีการเปิดใช้ <ph name="PLUGIN_VM_NAME" /> สำหรับผู้ใช้คนดังกล่าว
@@ -5338,6 +5373,7 @@
 <translation id="6763023079133439068">อนุญาตใบรับรองที่ไม่มีส่วนขยาย subjectAlternativeName เมื่อออกโดย Trust Anchor ในพื้นที่</translation>
 <translation id="6766216162565713893">อนุญาตให้เว็บไซต์ขอสิทธิ์เข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียงจากผู้ใช้</translation>
 <translation id="6770454900105963262">รายงานข้อมูลเกี่ยวกับเซสชันคีออสก์ที่ใช้งาน</translation>
+<translation id="6782331708811245959">เปิดใช้การรายงานโหมดเปิดเครื่องของอุปกรณ์</translation>
 <translation id="6782977971207381602">การตั้งค่านโยบายเป็น "เปิดใช้" จะอนุญาตให้อุปกรณ์เรียกใช้เครื่องเสมือนใน <ph name="PRODUCT_OS_NAME" /> ต้องเปิดใช้ <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> และ <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> เพื่อใช้ <ph name="PRODUCT_CROSTINI_NAME" /> การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าอุปกรณ์เรียกใช้เครื่องเสมือนไม่ได้ การเปลี่ยนเป็น "ปิดใช้" จะเริ่มใช้นโยบายเพื่อเริ่มเครื่องเสมือนใหม่ ไม่ใช่เครื่องเสมือนที่ทำงานอยู่แล้ว
 
       หากไม่ได้ตั้งค่านโยบายนี้ในอุปกรณ์ที่มีการจัดการ อุปกรณ์ดังกล่าวจะเรียกใช้เครื่องเสมือนไม่ได้ อุปกรณ์ที่ไม่มีการจัดการจะเรียกใช้เครื่องเสมือนได้</translation>
@@ -5476,6 +5512,7 @@
       หากตั้งค่านโยบายนี้เป็น "เท็จ" <ph name="PRODUCT_NAME" /> และ <ph name="LACROS_NAME" /> จะไม่อนุญาตให้เริ่มโปรไฟล์ผู้มาเยือน
 
       โปรดทราบว่าหากไม่กำหนดค่านโยบายนี้หรือตั้งค่าเป็น "จริง" แต่ตั้งค่า <ph name="LACROS_SECONDARY_PROFILES_ALLOWED_POLICY_NAME" /> เป็น "เท็จ" <ph name="LACROS_NAME" /> จะไม่อนุญาตให้เริ่มโปรไฟล์ผู้มาเยือน</translation>
+<translation id="6920640961852058581">เปลี่ยนการกำหนดค่าเริ่มต้นสำหรับตั๋ว Kerberos</translation>
 <translation id="6921544339867564740">อนุญาตให้อุปกรณ์เรียกใช้เครื่องเสมือนใน Chrome OS ได้</translation>
 <translation id="6922884955650325312">บล็อกปลั๊กอิน <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="6923731550900440989">เปิดใช้ฟีเจอร์การไฮไลต์เคอร์เซอร์ข้อความในหน้าจอการเข้าสู่ระบบ</translation>
@@ -5736,6 +5773,7 @@
       สำหรับ <ph name="ANDROID_VERSION" /> ขึ้นไป หากโหมด DNS-over-TLS เปิดใช้งานอยู่ <ph name="PRODUCT_NAME" /> จะไม่ส่งคำขอ DNS ที่ไม่ปลอดภัย
 
       หากไม่ได้ตั้งค่านโยบายนี้ เบราว์เซอร์อาจส่งคำขอ DNS-over-HTTPS ไปยังรีโซลเวอร์ที่เกี่ยวข้องกับรีโซลเวอร์ระบบของผู้ใช้ซึ่งมีการกำหนดค่าไว้</translation>
+<translation id="7152640356717355643">เปิดใช้การรายงานอินเทอร์เฟซเครือข่ายของอุปกรณ์</translation>
 <translation id="7157329428182136164">เปิดใช้การรองรับ API ของกราฟิก 3 มิติ</translation>
 <translation id="7158358621906236999">การตั้งค่าเซ็นเซอร์เริ่มต้น</translation>
 <translation id="7161568070244869726">บังคับเปิดใช้ AppCache</translation>
@@ -5911,6 +5949,11 @@
 <translation id="7375785904116479354">การตั้งค่านโยบายเป็น "เปิดใช้" จะนำเข้าเครื่องมือค้นหาเริ่มต้นจากเบราว์เซอร์เริ่มต้นก่อนหน้าเมื่อเรียกใช้ครั้งแรก การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า หมายความว่าจะไม่มีการนำเข้าเครื่องมือค้นหาเริ่มต้นเมื่อเรียกใช้ครั้งแรก
 
       ผู้ใช้จะทริกเกอร์กล่องโต้ตอบการนำเข้า และจะมีการเลือกหรือไม่ได้เลือกช่องทำเครื่องหมายเครื่องมือค้นหาเริ่มต้นไว้ เพื่อให้ตรงกับค่าของนโยบายนี้</translation>
+<translation id="7383581189726479261">นโยบายนี้เลิกใช้งานไปแล้วในรุ่น M96 โปรดใช้ <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> และ <ph name="REPORT_DEVICE_NETWORK_STATUS" /> แทน
+
+      การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้รายงานรายการอินเทอร์เฟซเครือข่ายพร้อมด้วยประเภทและที่อยู่ฮาร์ดแวร์
+
+      การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานอินเทอร์เฟซเครือข่าย</translation>
 <translation id="7389872682701720082">หากคุณเปิดใช้การตั้งค่านี้ ปลั๊กอินที่ยังไม่ล้าสมัยจะทำงานเสมอ
 
       หากปิดใช้การตั้งค่านี้หรือไม่ได้ตั้งค่า ระบบจะขออนุญาตจากผู้ใช้เพื่อเรียกใช้ปลั๊กอินที่ต้องมีการให้สิทธิ์ ปลั๊กอินเหล่านี้อาจทำให้ระบบผ่อนปรนเรื่องความปลอดภัย</translation>
@@ -6482,6 +6525,7 @@
 <translation id="7999023147219236247">นโยบายสำหรับการให้สิทธิ์คำขอเข้าถึงแอป PERMISSION_POLICY_UNSPECIFIED: ไม่มีการระบุนโยบาย หากไม่มีการระบุนโยบายสำหรับสิทธิ์ในทุกระดับ ระบบจะใช้การทำงานของ "PROMPT" โดยค่าเริ่มต้น PROMPT: แจ้งให้ผู้ใช้ให้สิทธิ์ GRANT: ให้สิทธิ์โดยอัตโนมัติ DENY: ปฏิเสธสิทธิ์โดยอัตโนมัติ</translation>
 <translation id="7999818120028621358">เปิดใช้การรายงานเหตุการณ์การป้องกันข้อมูลรั่วไหล</translation>
 <translation id="8001701200415781021">จำกัดบัญชี Google ที่อนุญาตให้ตั้งค่าเป็นบัญชีหลักของเบราว์เซอร์ใน <ph name="PRODUCT_NAME" /></translation>
+<translation id="800595420827930383">ใช้ตัวตรวจสอบใบรับรองของแพลตฟอร์มเดิม</translation>
 <translation id="8006219716745491366">หาก <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> เปิดอยู่ การตั้งค่า <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> จะระบุรายการ URL ทางเลือกสำหรับการแยกข้อความค้นหาออกจากเครื่องมือค้นหา URL ดังกล่าวควรมีสตริง <ph name="SEARCH_TERM_MARKER" />
 
       การไม่ตั้งค่า <ph name="DEFAULT_SEARCH_PROVIDER_ALTERNATE_URLS_POLICY_NAME" /> จะทำให้ไม่มีการใช้ URL ทางเลือกเพื่อแยกข้อความค้นหา</translation>
@@ -6490,6 +6534,7 @@
           นโยบายนี้จะไม่มีผลหากตั้งค่าเป็น "จริง" ปล่อยว่างไว้ หรือไม่ได้ตั้งค่า</translation>
 <translation id="8008421342605619236">กำหนดค่านโยบายสำหรับการรับส่งข้อความแบบเนทีฟ โฮสต์การรับส่งข้อความแบบเนทีฟที่ถูกบล็อกจะไม่ได้รับอนุญาต เว้นแต่ว่าเป็นรายการที่อนุญาตพิเศษ</translation>
 <translation id="8011935490612940798">ควบคุมฟีเจอร์ <ph name="PRODUCT_NAME" /></translation>
+<translation id="8013646845541206453">ใช้ตัวตรวจสอบใบรับรองใดก็ได้</translation>
 <translation id="8013739405949922317">การตั้งค่านี้เลิกใช้งานแล้ว ให้ใช้ <ph name="LACROS_AVAILABILITY_POLICY_NAME" /> แทน
 
       หากตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ได้ตั้งค่า ผู้ใช้จะใช้ <ph name="LACROS_NAME" /> ไม่ได้
@@ -6598,6 +6643,11 @@
 เมื่อมีการตั้งค่านโยบายนี้ ผู้ใช้จะลบล้างค่าไม่ได้เมื่อหน้าจอการเข้าสู่ระบบแสดงขึ้น
 
 หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้หน้าจอส่วนตัวในตอนแรก แต่ผู้ใช้จะยังควบคุมได้ต่อไปเมื่อหน้าจอการเข้าสู่ระบบแสดงขึ้น</translation>
+<translation id="814753199998535240">นโยบายนี้เลิกใช้งานไปแล้วตั้งแต่รุ่น M96 โปรดใช้ <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> และ <ph name="REPORT_DEVICE_AUDIO_STATUS" /> แทน
+
+      การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้รายงานสถิติด้านฮาร์ดแวร์ เช่น การใช้งาน CPU/RAM
+
+      การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานสถิติด้านฮาร์ดแวร์</translation>
 <translation id="8147730407149297036">ปิดใช้การตรวจหาการรั่วไหลของรหัสผ่าน</translation>
 <translation id="815061180603915310">หากตั้งค่าเป็นเปิดใช้นโยบาย นโยบายนี้จะบังคับให้โปรไฟล์เปลี่ยนเป็นโหมดชั่วคราว หากระบุนโยบายนี้เป็นนโยบาย OS (เช่น GPO ใน Windows) นโยบายจะใช้กับทุกโปรไฟล์บนระบบ หากตั้งค่านโยบายเป็นนโยบายระบบคลาวด์ นโยบายจะใช้กับโปรไฟล์ที่ลงชื่อเข้าใช้ด้วยบัญชีที่มีการจัดการเท่านั้น
 
@@ -6958,6 +7008,7 @@
       "1412.24.34": อัปเดตเป็นเวอร์ชันนี้เท่านั้น
 
       คำเตือน: เราไม่แนะนำให้กำหนดค่าข้อจำกัดของเวอร์ชันเพราะอาจทำให้ผู้ใช้ไม่ได้รับการอัปเดตซอฟต์แวร์และการปรับปรุงความปลอดภัยที่สำคัญ การจำกัดการอัปเดตเป็นส่วนนำเวอร์ชันที่เจาะจงอาจทำให้ผู้ใช้มีความเสี่ยง</translation>
+<translation id="8508489378025029342">เปิดใช้การรายงานเวลาของกิจกรรมในอุปกรณ์</translation>
 <translation id="8519264904050090490">URL ข้อยกเว้นแบบกำหนดเองของผู้ใช้ที่ได้รับการจัดการ</translation>
 <translation id="8519516251436131647">เปิดใช้แป้นพิมพ์ลัดของฟีเจอร์การช่วยเหลือพิเศษ
 
@@ -7034,6 +7085,7 @@
       หากตั้งค่านโยบายนี้เป็น "จริง" ผู้ใช้ต้องลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /> ด้วยโปรไฟล์ของตนก่อนใช้เบราว์เซอร์ และระบบจะตั้งค่าเริ่มต้นของ BrowserGuestModeEnabled เป็น "เท็จ" โปรดทราบว่าโปรไฟล์ที่ไม่ได้ลงชื่อเข้าใช้ซึ่งมีอยู่จะถูกล็อกและเข้าถึงไม่ได้หลังจากเปิดใช้นโยบายนี้ ดูข้อมูลเพิ่มเติมได้จากบทความในศูนย์ช่วยเหลือ
 
       หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้กำหนดค่า ผู้ใช้จะใช้เบราว์เซอร์ได้โดยไม่ต้องลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /></translation>
+<translation id="8575739761246140675">เปิดใช้การเชื่อถือใบรับรองที่ออกโดย PKI เดิมของ Symantec Corporation</translation>
 <translation id="8575746110808109915">การตั้งค่านโยบายเพื่อเปิดใช้ฟีเจอร์การคืนค่าโดยสมบูรณ์
       หากตั้งค่านโยบายนี้เป็น "จริง" ระบบจะคืนค่าหรือไม่คืนค่าแอปและหน้าต่างแอปหลังมีข้อขัดข้องหรือมีการรีบูต โดยเป็นไปตามการตั้งค่าการคืนค่าแอป
       หากตั้งค่านโยบายนี้เป็น "เท็จ" จะมีเพียงหน้าต่างเบราว์เซอร์ที่เปิดขึ้นโดยอัตโนมัติ</translation>
@@ -7128,6 +7180,7 @@
 
       หากนโยบายนี้เปลี่ยนแปลงในขณะที่ <ph name="PRODUCT_NAME" /> ทำงานอยู่ จะมีผลกับแท็บที่เปิดใหม่เท่านั้น</translation>
 <translation id="8685748277907759932">ป้องกันไม่ให้ผู้ใช้ใช้ "แตะเพื่อค้นหา"</translation>
+<translation id="8686700500128191717">เปิดใช้การรายงานผู้ใช้อุปกรณ์</translation>
 <translation id="8687958770985542440">เปิดใช้ Web Components v0 API ได้อีกครั้งจนกว่าจะถึงเวอร์ชัน M84</translation>
 <translation id="8693243869659262736">ใช้ไคลเอ็นต์ DNS ในตัว</translation>
 <translation id="8698286761337647563">จำนวนวันที่จะแจ้งผู้ใช้ SAML ล่วงหน้าเมื่อรหัสผ่านจะหมดอายุ</translation>
@@ -7197,6 +7250,8 @@
       ระบบจะอนุญาตโฮสต์การรับส่งข้อความดั้งเดิมทั้งหมดโดยค่าเริ่มต้น แต่หากนโยบายปฏิเสธโฮสต์การรับส่งข้อความดั้งเดิมทั้งหมด ผู้ดูแลระบบจะใช้รายการอนุญาตเพื่อเปลี่ยนนโยบายนั้นได้</translation>
 <translation id="877557628527387598">ลงชื่อเข้าใช้ด้วยรหัสผ่าน</translation>
 <translation id="8777369558049831576">แสดงช่องทำเครื่องหมาย "เปิดตลอดเวลา" ในกล่องโต้ตอบของโปรโตคอลภายนอก</translation>
+<translation id="8778320022586618010">เปิดใช้การรายงานสถานะกราฟิกของอุปกรณ์</translation>
+<translation id="8780039702448388726">ปิดใช้การรายงานข้อมูลเวอร์ชันอุปกรณ์</translation>
 <translation id="8786409859071107656">การตั้งค่านโยบายเป็น "เปิดใช้" จะเปิดนโยบายการจัดการพลังงานของการแชร์พลังงานผ่าน USB
 
       อุปกรณ์บางเครื่องจะมีพอร์ต USB พอร์ตหนึ่งซึ่งมีไอคอนรูปสายฟ้าหรือรูปแบตเตอรี่สำหรับชาร์จอุปกรณ์โดยใช้แบตเตอรี่ของระบบ นโยบายนี้ส่งผลต่อลักษณะการชาร์จของพอร์ตนี้ขณะที่ระบบอยู่ในโหมดสลีปและโหมดปิดเครื่อง นโยบายนี้ไม่ส่งผลต่อพอร์ต USB อื่นๆ และลักษณะการชาร์จขณะที่ระบบทำงานอยู่ เมื่อพอร์ต USB จ่ายไฟเสมอ
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index df13cdf..fb7c34d 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -4164,6 +4164,7 @@
 <translation id="5464816904705580310">Yönetilen kullanıcılar için ayarları yapılandırın.</translation>
 <translation id="5466596281866046569">Uygulama bilgilerini bildir</translation>
 <translation id="546726650689747237">AC güçle çalışırken ekran karartma gecikmesi</translation>
+<translation id="546830339470589966">Yeni Kerberos biletleri için alan adını otomatik tamamla</translation>
 <translation id="5469143988693423708">Kullanıcının Crostini'yi çalıştırmasına izin verilir</translation>
 <translation id="5469825884154817306">Bu sitelerdeki resimleri engelle</translation>
 <translation id="5470500958458209831">Ansible başucu kitabının indirilebileceği URL.</translation>
@@ -5009,6 +5010,10 @@
       Bu politikanın ayarlanmadığı siteler için, ayarlanmışsa <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> politikası geçerli olur. Aksi takdirde ilgili izin, tarayıcının varsayılan ayarına uyarak kullanıcıların site bazında bu izni belirlemesine imkan verir.</translation>
 <translation id="6384542789059421431">Varsayılan arama motoru sonuç sayfalarının, tarayıcı yan panelinde gösterilmesini etkinleştir.</translation>
 <translation id="6394350458541421998">Bu politika, <ph name="PRODUCT_OS_NAME" /> Sürüm 29 itibariyle kullanımdan kaldırılmıştır. Lütfen bunun yerine PresentationScreenDimDelayScale politikasını kullanın.</translation>
+<translation id="6396956366662970339">Uyarlanabilir şarj modelinin, pil ömrünü uzatmak için şarj sürecini geçici olarak durdurmasına izin verilip verilmeyeceğini belirtir.
+
+      Uyarlanabilir şarj modeli, cihaz AC gücünde çalışırken pil ömrünü uzatmak için şarj sürecinin geçici olarak durdurulmasına gerek olup olmadığını değerlendirir. Uyarlanabilir şarj modeli ile şarj süreci geçici olarak durdurulursa pil belirli bir seviyede (ör. %80) tutulur, daha sonra kullanıcı ihtiyaç duyduğunda cihaz %100'e kadar şarj edilir.
+      Bu politika, Doğru değerine ayarlanırsa uyarlanabilir şarj modeli etkinleştirilir. Böylece pil ömrünü uzatmak için şarj sürecinin geçici olarak durdurulmasına izin verilmiş olur. Bu politika, Yanlış değerine ayarlanır veya ayarlanmadan bırakılırsa uyarlanabilir şarj modeli şarj sürecini etkilemez.</translation>
 <translation id="6397588391180665797">Kayıtlı cihazlardaki kullanıcıların ağ yapılandırmasını raporla.
 
       Bu politika yanlış değerine ayarlanırsa bilgi raporlanmaz.
@@ -6346,6 +6351,10 @@
 
       Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz.  Bu politika, yalnızca kaynağa göre eşleşir. Dolayısıyla, URL kalıbındaki yollar yoksayılır.</translation>
 <translation id="7771298620150437359">İçeriği ve tercih edilen diller sıralamasını yapılandır</translation>
+<translation id="7773790010815041731"><ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> ve <ph name="LINUX_OS_NAME" /> cihazlarda Chrome Uygulamaları kullanımdan kaldırıldı.
+      Bu politika etkinleştirilirse <ph name="PRODUCT_NAME" />, Chrome Uygulamaları desteğinin tüm platformlardan kaldırılacağı son tarih olan Haziran 2022'ye kadar Chrome Uygulamalarının bu platformlarda çalıştırılmasına izin verir.
+      Bu politika devre dışı bırakılır veya ayarlanmazsa, kullanımdan kaldırma durumuna bağlı olarak Chrome Uygulamalarının çalışmasına izin verilmeyebilir.
+      Her iki durumda da, politika gereği zorunlu yüklenmiş Chrome Uygulamalarına izin verilmeye devam edilir.</translation>
 <translation id="7774768074957326919">Sistem proxy ayarlarını kullan</translation>
 <translation id="777734450201217641">Giriş ekranında erişilebilirlik özellikleri kısayollarını etkinleştirin.
 
@@ -7449,6 +7458,7 @@
 
       Geçerli giriş kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir. Bu politika, yalnızca kaynağa göre eşleşir. Dolayısıyla, URL kalıbındaki yollar yok sayılır.</translation>
 <translation id="9010080992450148617">Gelişmiş Koruma programına kayıtlı kullanıcıların indirdikleri dosyaları ayrıntılı tarama için Google'a göndermelerine izin ver</translation>
+<translation id="9012101302849557459"><ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> ve <ph name="LINUX_OS_NAME" /> cihazlarda Chrome Uygulamaları'na yönelik desteğin kapsamını genişlet.</translation>
 <translation id="9013875414788074110"><ph name="PRODUCT_OS_NAME" /> giriş yapılırken bir sunucu (online) veya önbelleğe alınmış bir şifre (çevrimdışı) ile kimlik doğrulaması yapabilir.
 
       Bu politika -1 değerine ayarlandığında, kullanıcı süresiz şekilde çevrimdışı olarak kimlik doğrulaması yapabilir. Bu politika başka herhangi bir değere ayarlandığında, kullanıcının online kimlik doğrulamayı tekrar kullanması gereken, en son online kimlik doğrulama işleminden beri geçen zamanı belirtir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 4e6751e..7bbfa18 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -4191,6 +4191,7 @@
 <translation id="5464816904705580310">Налаштувати параметри для керованих користувачів.</translation>
 <translation id="5466596281866046569">Повідомляти дані додатків</translation>
 <translation id="546726650689747237">Затримка затемнення екрана, коли використовується живлення від мережі</translation>
+<translation id="546830339470589966">Автозаповнення доменного імені для нових заявок Kerberos</translation>
 <translation id="5469143988693423708">Користувач може запускати Crostini</translation>
 <translation id="5469825884154817306">Блокувати зображення на цих сайтах</translation>
 <translation id="5470500958458209831">URL-адреса, з якої можна завантажити посібник правил Ansible.</translation>
@@ -5051,6 +5052,10 @@
       Якщо це правило не налаштувати для сайту, застосовується правило <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> (якщо його налаштовано). В іншому разі застосовуватимуться стандартні параметри веб-переглядача, а користувачі зможуть вибирати, яким сайтам надавати дозвіл.</translation>
 <translation id="6384542789059421431">Увімкнути на бічній панелі веб-переглядача показ сторінок із результатами, знайденими пошуковою системою, яку вибрано за умовчанням.</translation>
 <translation id="6394350458541421998">Це правило не підтримується від 29-ї версії <ph name="PRODUCT_OS_NAME" />. Натомість використовуйте правило PresentationScreenDimDelayScale.</translation>
+<translation id="6396956366662970339">Указує, чи може модель адаптивного заряджання призупиняти заряджання, щоб подовжувати час роботи акумулятора.
+
+      Коли пристрій підключено до електромережі, модель визначає, чи потрібно призупинити заряджання. Якщо вона це зробить, заряд акумулятора підтримуватиметься на певному рівні (наприклад, 80%), а потім пристрій зарядиться на 100% до потрібного часу.
+      Якщо для цього правила вибрати значення True, модель адаптивного заряджання буде ввімкнено й вона зможе призупиняти заряджання для подовження часу роботи акумулятора. Якщо для цього правила вибрати значення False або не налаштувати його, модель адаптивного заряджання не впливатиме на процес заряджання.</translation>
 <translation id="6397588391180665797">Визначає, чи надсилати дані про конфігурацію мережі користувачів на зареєстрованих пристроях.
 
       Якщо для цього правила вибрати значення false, інформація не надсилатиметься.
@@ -6385,6 +6390,10 @@
 
       Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.  Це правило враховує тільки джерела, тож шляхи в шаблонах URL-адрес ігноруються.</translation>
 <translation id="7771298620150437359">Налаштувати вибрані мови та їх порядок</translation>
+<translation id="7773790010815041731">Додатки Chrome більше не підтримуються в ОС <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> і <ph name="LINUX_OS_NAME" />.
+      Якщо це правило ввімкнути, <ph name="PRODUCT_NAME" /> дозволятиме запускати додатки Chrome на цих платформах до дати завершення їх підтримки на всіх платформах (червень 2022 року).
+      Якщо це правило вимкнути або не налаштувати, запуск додатків Chrome може бути забороненим залежно від статусу припинення підтримки.
+      У будь-якому випадку додатки Chrome, які примусово встановили за допомогою правила, можна буде запускати.</translation>
 <translation id="7774768074957326919">Використовувати налаштування проксі-сервера системи</translation>
 <translation id="777734450201217641">Увімкнути комбінації клавіш для спеціальних можливостей на екрані входу.
 
@@ -7500,6 +7509,7 @@
 
       Докладніше про дійсні шаблони можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила. Це правило враховує тільки джерела, тож шляхи в шаблонах URL-адрес ігноруються.</translation>
 <translation id="9010080992450148617">Увімкнути надсилання завантажень у Google для ретельної перевірки для користувачів, які зареєструвались у Програмі додаткового захисту</translation>
+<translation id="9012101302849557459">Подовжити підтримку додатків Chrome в ОС <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> і <ph name="LINUX_OS_NAME" />.</translation>
 <translation id="9013875414788074110"><ph name="PRODUCT_OS_NAME" /> може автентифікувати користувачів під час входу за даними із сервера (онлайн) або за допомогою кешованих паролів (офлайн).
 
       Якщо для цього правила вибрано значення -1, користувача можна автентифікувати офлайн без обмежень у часі. Якщо для цього правила вибрано будь-яке інше значення, воно вказує, через який період часу після останньої автентифікації онлайн цю процедуру потрібно повторити.
diff --git a/components/signin/core/browser/BUILD.gn b/components/signin/core/browser/BUILD.gn
index 71a713e..0624c7c 100644
--- a/components/signin/core/browser/BUILD.gn
+++ b/components/signin/core/browser/BUILD.gn
@@ -40,8 +40,6 @@
     "signin_header_helper.h",
     "signin_internals_util.cc",
     "signin_internals_util.h",
-    "signin_investigator.cc",
-    "signin_investigator.h",
     "signin_status_metrics_provider_helpers.cc",
     "signin_status_metrics_provider_helpers.h",
   ]
@@ -116,7 +114,6 @@
     "account_reconcilor_unittest.cc",
     "signin_error_controller_unittest.cc",
     "signin_header_helper_unittest.cc",
-    "signin_investigator_unittest.cc",
     "signin_status_metrics_provider_helpers_unittest.cc",
   ]
 
@@ -173,10 +170,7 @@
   }
 
   java_cpp_enum("signin_enums_javagen") {
-    sources = [
-      "signin_header_helper.h",
-      "signin_investigator.h",
-    ]
+    sources = [ "signin_header_helper.h" ]
     visibility = [ ":*" ]  # Depend on through :signin_enums_java
   }
 }
diff --git a/components/signin/core/browser/signin_investigator.cc b/components/signin/core/browser/signin_investigator.cc
deleted file mode 100644
index 82fa9cf0..0000000
--- a/components/signin/core/browser/signin_investigator.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/signin/core/browser/signin_investigator.h"
-
-#include "base/check.h"
-#include "base/metrics/histogram_macros.h"
-#include "components/signin/public/base/signin_metrics.h"
-#include "components/signin/public/base/signin_pref_names.h"
-#include "google_apis/gaia/gaia_auth_util.h"
-
-using signin_metrics::AccountEquality;
-using signin_metrics::LogAccountEquality;
-
-SigninInvestigator::SigninInvestigator(const std::string& current_email,
-                                       const std::string& current_id,
-                                       DependencyProvider* provider)
-    : current_email_(current_email),
-      current_id_(current_id),
-      provider_(provider) {
-  DCHECK(!current_email_.empty());
-  DCHECK(provider);
-}
-
-SigninInvestigator::~SigninInvestigator() {}
-
-bool SigninInvestigator::AreAccountsEqualWithFallback() {
-  const std::string last_id =
-      provider_->GetPrefs()->GetString(prefs::kGoogleServicesLastAccountId);
-  bool same_email = gaia::AreEmailsSame(
-      current_email_,
-      provider_->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername));
-  if (!current_id_.empty() && !last_id.empty()) {
-    bool same_id = current_id_ == last_id;
-    if (same_email && same_id) {
-      LogAccountEquality(AccountEquality::BOTH_EQUAL);
-    } else if (same_email) {
-      LogAccountEquality(AccountEquality::ONLY_SAME_EMAIL);
-    } else if (same_id) {
-      LogAccountEquality(AccountEquality::ONLY_SAME_ID);
-    } else {
-      LogAccountEquality(AccountEquality::BOTH_DIFFERENT);
-    }
-    return same_id;
-  } else {
-    LogAccountEquality(AccountEquality::EMAIL_FALLBACK);
-    return same_email;
-  }
-}
-
-InvestigatedScenario SigninInvestigator::Investigate() {
-  InvestigatedScenario scenario;
-  if (provider_->GetPrefs()
-          ->GetString(prefs::kGoogleServicesLastUsername)
-          .empty()) {
-    scenario = InvestigatedScenario::kFirstSignIn;
-  } else if (AreAccountsEqualWithFallback()) {
-    scenario = InvestigatedScenario::kSameAccount;
-  } else {
-    scenario = InvestigatedScenario::kDifferentAccount;
-  }
-
-  UMA_HISTOGRAM_ENUMERATION("Signin.InvestigatedScenario", scenario);
-  return scenario;
-}
diff --git a/components/signin/core/browser/signin_investigator.h b/components/signin/core/browser/signin_investigator.h
deleted file mode 100644
index 2dcb34862..0000000
--- a/components/signin/core/browser/signin_investigator.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2015 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_SIGNIN_CORE_BROWSER_SIGNIN_INVESTIGATOR_H_
-#define COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_INVESTIGATOR_H_
-
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "components/prefs/pref_service.h"
-
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-// A Java counterpart will be generated for this enum.
-// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.signin
-// Broad categorization of signin type from investigation.
-enum class InvestigatedScenario : int {
-  // First signin and should not be warned. As little friction as possible
-  // should get between the user and signing in.
-  kFirstSignIn = 0,
-  // Was never used (see crbug.com/983183, crbug.com/572754).
-  kDeprecatedUpgradeHighRisk = 1,
-  // Relogging with the same account.
-  kSameAccount = 2,
-  // User is switching accounts, can be very dangerous depending on the amount
-  // of local syncable data.
-  kDifferentAccount = 3,
-  // Always the last enumerated type.
-  kMaxValue = kDifferentAccount,
-};
-
-// Performs various checks with the current account being used to login in and
-// against the local data. Decides what kind of signin scenario we're in, if
-// we should warn the user about sync merge dangerous, and emits metrics.
-class SigninInvestigator {
- public:
-  // This interface allows the embedder to only have to worry about retrieving
-  // dependencies, not any of the logic for using them.
-  class DependencyProvider {
-   public:
-    virtual ~DependencyProvider() {}
-    // Returns a non owning pointer to the pref service.
-    virtual PrefService* GetPrefs() = 0;
-  };
-
-  SigninInvestigator(const std::string& current_email,
-                     const std::string& current_id,
-                     DependencyProvider* provider);
-
-  SigninInvestigator(const SigninInvestigator&) = delete;
-  SigninInvestigator& operator=(const SigninInvestigator&) = delete;
-
-  ~SigninInvestigator();
-
-  // Determines the current scenario, wether it is an upgrade, same account, or
-  // different.
-  InvestigatedScenario Investigate();
-
- private:
-  friend class SigninInvestigatorTest;
-
-  // Determines if the current account is the same as the last email/gaia id.
-  // Because email can change but gaia id cannot, the id is the authoritative
-  // source of account equality. However, initially we were only storing the
-  // last username/email that was used to sign in, so for any client that hasn't
-  // logged in since we added logic to store the gaia id, the last id is blank.
-  // In this case, we fallback to using last_email. This equality check is
-  // slightly more strict than the version AccountId defines as == operator.
-  bool AreAccountsEqualWithFallback();
-
-  std::string current_email_;
-  std::string current_id_;
-
-  // Non-owning pointer.
-  raw_ptr<DependencyProvider> provider_;
-};
-
-#endif  // COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_INVESTIGATOR_H_
diff --git a/components/signin/core/browser/signin_investigator_unittest.cc b/components/signin/core/browser/signin_investigator_unittest.cc
deleted file mode 100644
index d9e3054..0000000
--- a/components/signin/core/browser/signin_investigator_unittest.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2015 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 <string>
-
-#include "base/test/metrics/histogram_tester.h"
-#include "base/test/task_environment.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/signin/core/browser/signin_investigator.h"
-#include "components/signin/public/base/signin_metrics.h"
-#include "components/signin/public/base/signin_pref_names.h"
-#include "components/signin/public/identity_manager/identity_test_environment.h"
-#include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using signin_metrics::AccountEquality;
-
-namespace {
-const char kSameEmail[] = "user1@domain.com";
-const char kDifferentEmail[] = "user2@domain.com";
-const char kSameId[] = "1";
-const char kDifferentId[] = "2";
-const char kEmptyId[] = "";
-
-class FakeProvider : public SigninInvestigator::DependencyProvider {
- public:
-  FakeProvider(const std::string& last_email, const std::string& last_id)
-      : identity_test_env_(/*test_url_loader_factory=*/nullptr, &prefs_) {
-    prefs_.SetString(prefs::kGoogleServicesLastUsername, last_email);
-    prefs_.SetString(prefs::kGoogleServicesLastAccountId, last_id);
-  }
-  PrefService* GetPrefs() override { return &prefs_; }
-
- private:
-  base::test::TaskEnvironment task_environment_;
-  sync_preferences::TestingPrefServiceSyncable prefs_;
-  signin::IdentityTestEnvironment identity_test_env_;
-};
-}  // namespace
-
-class SigninInvestigatorTest : public testing::Test {
- protected:
-  void AssertAccountEquality(const std::string& email,
-                             const std::string& id,
-                             bool equals_expectated,
-                             AccountEquality histogram_expected) {
-    FakeProvider provider(email, id);
-    SigninInvestigator investigator(kSameEmail, kSameId, &provider);
-    AssertAccountEquality(&investigator, equals_expectated, histogram_expected);
-  }
-
-  void AssertAccountEquality(SigninInvestigator* investigator,
-                             bool equals_expectated,
-                             AccountEquality histogram_expected) {
-    base::HistogramTester histogram_tester;
-    bool equals_actual = investigator->AreAccountsEqualWithFallback();
-    ASSERT_EQ(equals_expectated, equals_actual);
-    histogram_tester.ExpectUniqueSample(
-        "Signin.AccountEquality", static_cast<int>(histogram_expected), 1);
-  }
-
-  void AssertInvestigatedScenario(const std::string& email,
-                                  const std::string& id,
-                                  InvestigatedScenario expected) {
-    base::HistogramTester histogram_tester;
-    FakeProvider provider(email, id);
-    SigninInvestigator investigator(kSameEmail, kSameId, &provider);
-    InvestigatedScenario actual = investigator.Investigate();
-    ASSERT_EQ(expected, actual);
-    histogram_tester.ExpectUniqueSample("Signin.InvestigatedScenario",
-                                        static_cast<int>(expected), 1);
-  }
-};
-
-TEST_F(SigninInvestigatorTest, EqualitySameEmailsSameIds) {
-  AssertAccountEquality(kSameEmail, kSameId, true, AccountEquality::BOTH_EQUAL);
-}
-
-TEST_F(SigninInvestigatorTest, EqualitySameEmailsDifferentIds) {
-  AssertAccountEquality(kSameEmail, kDifferentId, false,
-                        AccountEquality::ONLY_SAME_EMAIL);
-}
-
-TEST_F(SigninInvestigatorTest, EqualityDifferentEmailsSameIds) {
-  AssertAccountEquality(kDifferentEmail, kSameId, true,
-                        AccountEquality::ONLY_SAME_ID);
-}
-
-TEST_F(SigninInvestigatorTest, EqualityDifferentEmailsDifferentIds) {
-  AssertAccountEquality(kDifferentEmail, kDifferentId, false,
-                        AccountEquality::BOTH_DIFFERENT);
-}
-
-TEST_F(SigninInvestigatorTest, EqualitySameEmailFallback) {
-  AssertAccountEquality(kSameEmail, kEmptyId, true,
-                        AccountEquality::EMAIL_FALLBACK);
-}
-
-TEST_F(SigninInvestigatorTest, EqualityDifferentEmailFallback) {
-  AssertAccountEquality(kDifferentEmail, kEmptyId, false,
-                        AccountEquality::EMAIL_FALLBACK);
-}
-
-TEST_F(SigninInvestigatorTest, EqualitySameEmailFallbackEmptyCurrentId) {
-  FakeProvider provider(kSameEmail, kDifferentId);
-  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
-  AssertAccountEquality(&investigator, true, AccountEquality::EMAIL_FALLBACK);
-}
-
-TEST_F(SigninInvestigatorTest, EqualityDifferentEmailFallbackEmptyCurrentId) {
-  FakeProvider provider(kDifferentId, kDifferentId);
-  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
-  AssertAccountEquality(&investigator, false, AccountEquality::EMAIL_FALLBACK);
-}
-
-TEST_F(SigninInvestigatorTest, InvestigateSameAccount) {
-  AssertInvestigatedScenario(kSameEmail, kSameId,
-                             InvestigatedScenario::kSameAccount);
-}
-
-TEST_F(SigninInvestigatorTest, InvestigateFirstSignIn) {
-  AssertInvestigatedScenario("", "", InvestigatedScenario::kFirstSignIn);
-}
-
-TEST_F(SigninInvestigatorTest, InvestigateDifferentAccount) {
-  AssertInvestigatedScenario(kDifferentEmail, kDifferentId,
-                             InvestigatedScenario::kDifferentAccount);
-}
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index 82d8297..c230126 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -185,12 +185,6 @@
                             state);
 }
 
-void LogAccountEquality(AccountEquality equality) {
-  UMA_HISTOGRAM_ENUMERATION("Signin.AccountEquality",
-                            static_cast<int>(equality),
-                            static_cast<int>(AccountEquality::HISTOGRAM_COUNT));
-}
-
 void LogCookieJarStableAge(const base::TimeDelta stable_age,
                            const ReportingType type) {
   INVESTIGATOR_HISTOGRAM_CUSTOM_COUNTS(
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 4c88169..80404ebb 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -335,26 +335,6 @@
   kMaxValue = ACCOUNT_RECONCILOR_SCHEDULED,
 };
 
-// Values of histogram comparing account id and email.
-enum class AccountEquality : int {
-  // Expected case when the user is not switching accounts.
-  BOTH_EQUAL = 0,
-  // Expected case when the user is switching accounts.
-  BOTH_DIFFERENT,
-  // The user has changed at least two email account names. This is actually
-  // a different account, even though the email matches.
-  ONLY_SAME_EMAIL,
-  // The user has changed the email of their account, but the account is
-  // actually the same.
-  ONLY_SAME_ID,
-  // The last account id was not present, email equality was used. This should
-  // happen once to all old clients. Does not differentiate between same and
-  // different accounts.
-  EMAIL_FALLBACK,
-  // Always the last enumerated type.
-  HISTOGRAM_COUNT,
-};
-
 // Values of Signin.AccountType histogram. This histogram records if the user
 // uses a gmail account or a managed account when signing in.
 enum class SigninAccountType : int {
@@ -510,10 +490,6 @@
 // be shown a different set of accounts in the content-area and the settings UI.
 void LogAccountReconcilorStateOnGaiaResponse(AccountReconcilorState state);
 
-// Records the AccountEquality metric when an investigator compares the current
-// and previous id/emails during a signin.
-void LogAccountEquality(AccountEquality equality);
-
 // Records the amount of time since the cookie jar was last changed.
 void LogCookieJarStableAge(const base::TimeDelta stable_age,
                            const ReportingType type);
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index a01f6c1..895ec6d 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -2764,7 +2764,7 @@
 <translation id="8564985650692024650">Chromium препорачува ресетирање на лозинката за <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ако повторно сте ја употребиле на други сајтови.</translation>
 <translation id="8576310925653847813">Системи за домашно кино</translation>
 <translation id="8577348305244205642">Виртуелната картичка не е достапна</translation>
-<translation id="858637041960032120">Додај телефонски број</translation>
+<translation id="858637041960032120">Додајте телефонски број</translation>
 <translation id="8589998999637048520">Најдобар квалитет</translation>
 <translation id="8600271352425265729">Само овојпат</translation>
 <translation id="860043288473659153">Име на сопственикот на картичката</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb
index b16f4cc..c9a8a46 100644
--- a/components/strings/components_strings_or.xtb
+++ b/components/strings/components_strings_or.xtb
@@ -2761,7 +2761,7 @@
 <translation id="8564985650692024650">ଆପଣ ଯଦି ଆପଣଙ୍କର <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ପାସ୍‌ୱାର୍ଡକୁ ଅନ୍ୟ ସାଇଟ୍‌ଗୁଡ଼ିକରେ ପୁନଃ ବ୍ୟବହାର କରିଛନ୍ତି, ତେବେ Chromium ଆପଣଙ୍କୁ ଏହି ପାସ୍‌ୱାର୍ଡକୁ ରିସେଟ୍ କରିବା ପାଇଁ ସୁପାରିଶ କରୁଛି।</translation>
 <translation id="8576310925653847813">ହୋମ ଥିଏଟର ସିଷ୍ଟମଗୁଡ଼ିକ</translation>
 <translation id="8577348305244205642">ଭର୍ଚୁଆଲ୍ କାର୍ଡ ଉପଲବ୍ଧ ନାହିଁ</translation>
-<translation id="858637041960032120">ଫୋନ୍‌ ନମ୍ବର୍‍ ଯୋଗ କରନ୍ତୁ</translation>
+<translation id="858637041960032120">ଫୋନ ନମ୍ବର ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="8589998999637048520">ଉତ୍ତମ ଗୁଣବତ୍ତା</translation>
 <translation id="8600271352425265729">କେବଳ ଏହି ସମୟ ପାଇଁ</translation>
 <translation id="860043288473659153">କାର୍ଡହୋଲ୍ଡର୍‌ର ନାମ</translation>
diff --git a/components/stylus_handwriting/DIR_METADATA b/components/stylus_handwriting/DIR_METADATA
new file mode 100644
index 0000000..3bdc49b
--- /dev/null
+++ b/components/stylus_handwriting/DIR_METADATA
@@ -0,0 +1,4 @@
+os: ANDROID
+monorail {
+  component: "UI>Input>Text"
+}
\ No newline at end of file
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingConstants.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingConstants.java
index d2b6f0c..6a13f2ca 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingConstants.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingConstants.java
@@ -11,6 +11,10 @@
 class DirectWritingConstants {
     private DirectWritingConstants() {}
 
+    // This constant is defined in Samsung Platform, which sets the Hover icon for direct writing.
+    // Since this constant is not available to non-Samsung apps, it is defined below.
+    static final int STYLUS_WRITING_ICON_VALUE = 20024;
+
     static final String SERVICE_PKG_NAME = "com.samsung.android.honeyboard";
     static final String SERVICE_CLS_NAME =
             "com.samsung.android.directwriting.service.DirectWritingService";
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
index 3ffc8c45..32225f5 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
@@ -11,22 +11,26 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.view.MotionEvent;
+import android.view.PointerIcon;
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 
 import androidx.annotation.RequiresApi;
 
 import org.chromium.base.Log;
+import org.chromium.base.compat.ApiHelperForN;
 import org.chromium.content_public.browser.StylusWritingHandler;
 import org.chromium.content_public.browser.StylusWritingImeCallback;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.ViewAndroidDelegate.StylusWritingCursorHandler;
 
 /**
  * Direct writing class that manages Input events, starting and stopping of recognition. Forwards
  * calls to DW service connection handler class {@link DirectWritingServiceBinder}. Also, sets the
  * {@link StylusWritingHandler} to receive messages about stylus writing events.
  */
-class DirectWritingTrigger implements StylusWritingHandler, StylusApiOption {
+class DirectWritingTrigger
+        implements StylusWritingHandler, StylusApiOption, StylusWritingCursorHandler {
     private static final String TAG = "DWTrigger";
 
     private DirectWritingServiceBinder mBinder = new DirectWritingServiceBinder();
@@ -70,6 +74,11 @@
     }
 
     @Override
+    public StylusWritingCursorHandler getStylusWritingCursorHandler() {
+        return this;
+    }
+
+    @Override
     public void onFocusedNodeChanged(Rect editableBoundsOnScreen, boolean isEditable) {
         if (!mDwServiceEnabled || !mBinder.isServiceConnected()
                 || mStylusWritingImeCallback == null) {
@@ -401,4 +410,14 @@
         if (!mDwServiceEnabled) return;
         mBinder.hideDWToolbar();
     }
+
+    @Override
+    public boolean didHandleCursorUpdate(View currentView) {
+        // Direct writing hover cursor is supported from Android S.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return false;
+        PointerIcon icon = PointerIcon.getSystemIcon(
+                currentView.getContext(), DirectWritingConstants.STYLUS_WRITING_ICON_VALUE);
+        ApiHelperForN.setPointerIcon(currentView, icon);
+        return true;
+    }
 }
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusApiOption.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusApiOption.java
index 5b99a159..d6eb07a 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusApiOption.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusApiOption.java
@@ -7,6 +7,7 @@
 import android.content.Context;
 
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.ViewAndroidDelegate.StylusWritingCursorHandler;
 
 /**
  * This interface allows {@link StylusWritingController} to abstract over
@@ -21,4 +22,11 @@
     void onWebContentsChanged(Context context, WebContents webContents);
 
     default void onWindowFocusChanged(Context context, boolean hasFocus) {}
+
+    /**
+     * @return Handler that implements showing hover cursor during stylus writing.
+     */
+    default StylusWritingCursorHandler getStylusWritingCursorHandler() {
+        return null;
+    }
 }
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java
index f4a30f79..134b53e5 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java
@@ -71,8 +71,10 @@
         if (webContents.getViewAndroidDelegate() == null) return;
 
         mCurrentWebContents = webContents;
-
-        getHandler().onWebContentsChanged(mContext, webContents);
+        StylusApiOption handler = getHandler();
+        handler.onWebContentsChanged(mContext, webContents);
+        webContents.getViewAndroidDelegate().setStylusWritingCursorHandler(
+                handler.getStylusWritingCursorHandler());
     }
 
     /**
@@ -86,8 +88,10 @@
         StylusApiOption handler = getHandler();
         handler.onWindowFocusChanged(mContext, hasFocus);
 
-        if (mCurrentWebContents != null) {
-            handler.onWebContentsChanged(mContext, mCurrentWebContents);
-        }
+        if (mCurrentWebContents == null) return;
+        handler.onWebContentsChanged(mContext, mCurrentWebContents);
+        if (mCurrentWebContents.getViewAndroidDelegate() == null) return;
+        mCurrentWebContents.getViewAndroidDelegate().setStylusWritingCursorHandler(
+                handler.getStylusWritingCursorHandler());
     }
 }
diff --git a/components/sync/trusted_vault/degraded_recoverability_scheduler.cc b/components/sync/trusted_vault/degraded_recoverability_scheduler.cc
index fd4afb7..26a2045 100644
--- a/components/sync/trusted_vault/degraded_recoverability_scheduler.cc
+++ b/components/sync/trusted_vault/degraded_recoverability_scheduler.cc
@@ -4,13 +4,13 @@
 
 #include "components/sync/trusted_vault/degraded_recoverability_scheduler.h"
 
-#include <utility>
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "components/sync/base/time.h"
 #include "components/sync/protocol/local_trusted_vault.pb.h"
+#include "components/sync/trusted_vault/trusted_vault_connection.h"
 
 namespace {
 base::TimeDelta ComputeTimeUntilNextRefresh(
@@ -27,15 +27,29 @@
   return refresh_period - elapsed_time;
 }
 
+sync_pb::LocalTrustedVaultDegradedRecoverabilityState
+MakeDegradedRecoverabilityState(bool is_recoverability_degraded,
+                                const base::Time& last_refresh_time) {
+  sync_pb::LocalTrustedVaultDegradedRecoverabilityState
+      degraded_recoverability_state;
+  degraded_recoverability_state.set_is_recoverability_degraded(
+      is_recoverability_degraded);
+  degraded_recoverability_state.set_last_refresh_time_millis_since_unix_epoch(
+      syncer::TimeToProtoTime(last_refresh_time));
+  return degraded_recoverability_state;
+}
+
 }  // namespace
 
 namespace syncer {
 
 DegradedRecoverabilityScheduler::DegradedRecoverabilityScheduler(
+    TrustedVaultConnection* connection,
     Delegate* delegate,
-    base::RepeatingClosure refresh_callback)
-    : delegate_(delegate),
-      refresh_callback_(std::move(refresh_callback)),
+    const CoreAccountInfo& account_info)
+    : connection_(connection),
+      delegate_(delegate),
+      account_info_(account_info),
       current_refresh_period_(kLongDegradedRecoverabilityRefreshPeriod) {
   // TODO(crbug.com/1247990): read `last_refresh_time_`, convert it to
   // TimeTicks, and schedule next refresh.
@@ -56,9 +70,6 @@
 }
 
 void DegradedRecoverabilityScheduler::RefreshImmediately() {
-  // TODO(crbug.com/1247990): Currently if the timer is not running, then this
-  // means that Refresh() has just invoked. Probably this would be changed
-  // later, then we need to take care.
   if (!next_refresh_timer_.IsRunning()) {
     return;
   }
@@ -73,25 +84,34 @@
 }
 
 void DegradedRecoverabilityScheduler::Refresh() {
-  // TODO(crbug.com/1247990): To be implemented, make sure the to schedule the
-  // next Refresh() after the current one is completed.
-  NOTIMPLEMENTED();
-  last_refresh_time_ = base::TimeTicks::Now();
-  delegate_->WriteDegradedRecoverabilityState(GetDegradedRecoverabilityState());
-  refresh_callback_.Run();
-  next_refresh_timer_.Start(FROM_HERE, current_refresh_period_, this,
-                            &DegradedRecoverabilityScheduler::Refresh);
+  // Since destroying the request object causes actual request cancellation, so
+  // it's safe to use base::Unretained() here.
+  ongoing_get_recoverability_request_ =
+      connection_->DownloadIsRecoverabilityDegraded(
+          account_info_,
+          base::BindOnce(&DegradedRecoverabilityScheduler::
+                             OnRecoverabilityIsDegradedDownloaded,
+                         base::Unretained(this)));
 }
 
-sync_pb::LocalTrustedVaultDegradedRecoverabilityState
-DegradedRecoverabilityScheduler::GetDegradedRecoverabilityState() const {
-  sync_pb::LocalTrustedVaultDegradedRecoverabilityState
-      degraded_recoverability_state;
-  // TODO(crbug.com/1247990): Should set `is_recoverability_degraded` once the
-  // connection passed to the scheduler.
-  degraded_recoverability_state.set_last_refresh_time_millis_since_unix_epoch(
-      TimeToProtoTime(base::Time::Now()));
-  return degraded_recoverability_state;
+void DegradedRecoverabilityScheduler::OnRecoverabilityIsDegradedDownloaded(
+    TrustedVaultRecoverabilityStatus status) {
+  switch (status) {
+    case TrustedVaultRecoverabilityStatus::kDegraded:
+      is_recoverability_degraded_ = true;
+      break;
+    case TrustedVaultRecoverabilityStatus::kNotDegraded:
+      is_recoverability_degraded_ = false;
+      break;
+    case TrustedVaultRecoverabilityStatus::kError:
+      // TODO(crbug.com/1247990): To be handled.
+      break;
+  }
+  last_refresh_time_ = base::TimeTicks::Now();
+  delegate_->WriteDegradedRecoverabilityState(MakeDegradedRecoverabilityState(
+      is_recoverability_degraded_, base::Time::Now()));
+  next_refresh_timer_.Start(FROM_HERE, current_refresh_period_, this,
+                            &DegradedRecoverabilityScheduler::Refresh);
 }
 
 }  // namespace syncer
diff --git a/components/sync/trusted_vault/degraded_recoverability_scheduler.h b/components/sync/trusted_vault/degraded_recoverability_scheduler.h
index 5608ab3e..fec90c2 100644
--- a/components/sync/trusted_vault/degraded_recoverability_scheduler.h
+++ b/components/sync/trusted_vault/degraded_recoverability_scheduler.h
@@ -5,10 +5,14 @@
 #ifndef COMPONENTS_SYNC_TRUSTED_VAULT_DEGRADED_RECOVERABILITY_SCHEDULER_H_
 #define COMPONENTS_SYNC_TRUSTED_VAULT_DEGRADED_RECOVERABILITY_SCHEDULER_H_
 
+#include <memory>
 #include "base/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/sync/trusted_vault/trusted_vault_connection.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace sync_pb {
 class LocalTrustedVaultDegradedRecoverabilityState;
@@ -38,11 +42,10 @@
     virtual void OnDegradedRecoverabilityChanged(bool value) = 0;
   };
 
-  // TODO(crbug.com/1247990): `refresh_callback` is currently used for testing,
-  // should be replaced with the connection calls once it passed to the
-  // scheduler.
-  DegradedRecoverabilityScheduler(Delegate* delegate,
-                                  base::RepeatingClosure refresh_callback);
+  // `connection` and `delegate` must not be null and must outlive this object.
+  DegradedRecoverabilityScheduler(TrustedVaultConnection* connection,
+                                  Delegate* delegate,
+                                  const CoreAccountInfo& account_info);
   DegradedRecoverabilityScheduler(const DegradedRecoverabilityScheduler&) =
       delete;
   DegradedRecoverabilityScheduler& operator=(
@@ -56,18 +59,22 @@
  private:
   void Start();
   void Refresh();
-  sync_pb::LocalTrustedVaultDegradedRecoverabilityState
-  GetDegradedRecoverabilityState() const;
+  void OnRecoverabilityIsDegradedDownloaded(
+      TrustedVaultRecoverabilityStatus status);
 
+  const raw_ptr<TrustedVaultConnection> connection_;
   const raw_ptr<Delegate> delegate_;
-  base::RepeatingClosure refresh_callback_;
+  CoreAccountInfo account_info_;
   // A "timer" takes care of invoking Refresh() in the future, once after a
   // `current_refresh_period_` delay has elapsed.
   base::OneShotTimer next_refresh_timer_;
   base::TimeDelta current_refresh_period_;
+  bool is_recoverability_degraded_;
   // The last time Refresh has executed, it's initially null until the first
   // Refresh() execution.
   base::TimeTicks last_refresh_time_;
+  std::unique_ptr<TrustedVaultConnection::Request>
+      ongoing_get_recoverability_request_;
 };
 
 }  // namespace syncer
diff --git a/components/sync/trusted_vault/degraded_recoverability_scheduler_unittest.cc b/components/sync/trusted_vault/degraded_recoverability_scheduler_unittest.cc
index 7b76ddc..ebd2f0f 100644
--- a/components/sync/trusted_vault/degraded_recoverability_scheduler_unittest.cc
+++ b/components/sync/trusted_vault/degraded_recoverability_scheduler_unittest.cc
@@ -5,14 +5,31 @@
 #include "components/sync/trusted_vault/degraded_recoverability_scheduler.h"
 
 #include <memory>
+#include <string>
+#include <utility>
+#include <vector>
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
+#include "components/signin/public/identity_manager/account_info.h"
 #include "components/sync/base/time.h"
 #include "components/sync/protocol/local_trusted_vault.pb.h"
+#include "components/sync/trusted_vault/securebox.h"
+#include "components/sync/trusted_vault/trusted_vault_connection.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace syncer {
+namespace {
+using testing::_;
+using testing::Eq;
+
+CoreAccountInfo MakeAccountInfoWithGaiaId(const std::string& gaia_id) {
+  CoreAccountInfo account_info;
+  account_info.gaia = gaia_id;
+  return account_info;
+}
+
 MATCHER_P(DegradedRecoverabilityStateEq, expected_state, "") {
   const sync_pb::LocalTrustedVaultDegradedRecoverabilityState& given_state =
       arg;
@@ -22,8 +39,40 @@
              expected_state.last_refresh_time_millis_since_unix_epoch();
 }
 
-namespace syncer {
-namespace {
+class MockTrustedVaultConnection : public TrustedVaultConnection {
+ public:
+  MockTrustedVaultConnection() = default;
+  ~MockTrustedVaultConnection() override = default;
+  MOCK_METHOD(std::unique_ptr<Request>,
+              RegisterAuthenticationFactor,
+              (const CoreAccountInfo& account_info,
+               const std::vector<std::vector<uint8_t>>& trusted_vault_keys,
+               int last_trusted_vault_key_version,
+               const SecureBoxPublicKey& authentication_factor_public_key,
+               AuthenticationFactorType authentication_factor_type,
+               absl::optional<int> authentication_factor_type_hint,
+               RegisterAuthenticationFactorCallback callback),
+              (override));
+  MOCK_METHOD(std::unique_ptr<Request>,
+              RegisterDeviceWithoutKeys,
+              (const CoreAccountInfo& account_info,
+               const SecureBoxPublicKey& device_public_key,
+               RegisterDeviceWithoutKeysCallback callback),
+              (override));
+  MOCK_METHOD(
+      std::unique_ptr<Request>,
+      DownloadNewKeys,
+      (const CoreAccountInfo& account_info,
+       const TrustedVaultKeyAndVersion& last_trusted_vault_key_and_version,
+       std::unique_ptr<SecureBoxKeyPair> device_key_pair,
+       DownloadNewKeysCallback callback),
+      (override));
+  MOCK_METHOD(std::unique_ptr<Request>,
+              DownloadIsRecoverabilityDegraded,
+              (const CoreAccountInfo& account_info,
+               IsRecoverabilityDegradedCallback callback),
+              (override));
+};
 
 class MockDelegate : public DegradedRecoverabilityScheduler::Delegate {
  public:
@@ -43,8 +92,18 @@
   ~DegradedRecoverabilitySchedulerTest() override = default;
 
   void SetUp() override {
+    ON_CALL(connection_, DownloadIsRecoverabilityDegraded(
+                             Eq(MakeAccountInfoWithGaiaId("user")), _))
+        .WillByDefault(
+            [&](const CoreAccountInfo&,
+                MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
+                    callback) {
+              std::move(callback).Run(
+                  TrustedVaultRecoverabilityStatus::kDegraded);
+              return std::make_unique<TrustedVaultConnection::Request>();
+            });
     scheduler_ = std::make_unique<DegradedRecoverabilityScheduler>(
-        &delegate_, refresh_callback_.Get());
+        &connection_, &delegate_, MakeAccountInfoWithGaiaId("user"));
     // Moving the time forward by one millisecond to make sure that the first
     // refresh had called.
     task_environment().FastForwardBy(base::Milliseconds(1));
@@ -52,46 +111,42 @@
 
   DegradedRecoverabilityScheduler& scheduler() { return *scheduler_.get(); }
 
-  base::MockCallback<base::RepeatingClosure>& refresh_callback() {
-    return refresh_callback_;
-  }
-
   base::test::SingleThreadTaskEnvironment& task_environment() {
     return task_environment_;
   }
 
  protected:
+  testing::NiceMock<MockTrustedVaultConnection> connection_;
   testing::NiceMock<MockDelegate> delegate_;
-  base::MockCallback<base::RepeatingClosure> refresh_callback_;
   std::unique_ptr<DegradedRecoverabilityScheduler> scheduler_;
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 };
 
 TEST_F(DegradedRecoverabilitySchedulerTest, ShouldRefreshOnceWhenInitialize) {
+  testing::NiceMock<MockTrustedVaultConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
-  base::MockCallback<base::RepeatingClosure> refresh_callback;
-  EXPECT_CALL(refresh_callback, Run());
+  EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded);
   std::unique_ptr<DegradedRecoverabilityScheduler> scheduler =
-      std::make_unique<DegradedRecoverabilityScheduler>(&delegate,
-                                                        refresh_callback.Get());
+      std::make_unique<DegradedRecoverabilityScheduler>(
+          &connection, &delegate, MakeAccountInfoWithGaiaId("user"));
   task_environment().FastForwardBy(base::Milliseconds(1));
 }
 
 TEST_F(DegradedRecoverabilitySchedulerTest, ShouldRefreshImmediately) {
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   scheduler().RefreshImmediately();
 }
 
 TEST_F(DegradedRecoverabilitySchedulerTest, ShouldRefreshOncePerLongPeriod) {
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   task_environment().FastForwardBy(kLongDegradedRecoverabilityRefreshPeriod +
                                    base::Milliseconds(1));
 }
 
 TEST_F(DegradedRecoverabilitySchedulerTest, ShouldSwitchToShortPeriod) {
   scheduler().StartShortIntervalRefreshing();
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   task_environment().FastForwardBy(kShortDegradedRecoverabilityRefreshPeriod +
                                    base::Milliseconds(1));
 }
@@ -99,10 +154,10 @@
 TEST_F(DegradedRecoverabilitySchedulerTest, ShouldSwitchToLongPeriod) {
   scheduler().StartShortIntervalRefreshing();
   scheduler().StartLongIntervalRefreshing();
-  EXPECT_CALL(refresh_callback(), Run()).Times(0);
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded).Times(0);
   task_environment().FastForwardBy(kShortDegradedRecoverabilityRefreshPeriod +
                                    base::Milliseconds(1));
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   task_environment().FastForwardBy(kLongDegradedRecoverabilityRefreshPeriod +
                                    base::Milliseconds(1));
 }
@@ -112,7 +167,7 @@
   task_environment().FastForwardBy(kShortDegradedRecoverabilityRefreshPeriod -
                                    base::Seconds(1));
   scheduler().StartShortIntervalRefreshing();
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   task_environment().FastForwardBy(base::Seconds(1) + base::Milliseconds(1));
 }
 
@@ -120,23 +175,55 @@
        ShouldSwitchToShortPeriodAndRefreshImmediately) {
   task_environment().FastForwardBy(kShortDegradedRecoverabilityRefreshPeriod +
                                    base::Seconds(1));
-  EXPECT_CALL(refresh_callback(), Run());
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded);
   scheduler().StartShortIntervalRefreshing();
   task_environment().FastForwardBy(base::Milliseconds(1));
 }
 
 TEST_F(DegradedRecoverabilitySchedulerTest,
-       ShouldWriteTheStateImmediatelyWithCurrentTime) {
+       ShouldWriteTheStateImmediatelyWithRecoverabilityDegradedAndCurrentTime) {
   sync_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
+  degraded_recoverability_state.set_is_recoverability_degraded(true);
   // Since the time is not moving, the `Time::Now()` is the expected to be
   // written.
   degraded_recoverability_state.set_last_refresh_time_millis_since_unix_epoch(
       TimeToProtoTime(base::Time::Now()));
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded(
+                               Eq(MakeAccountInfoWithGaiaId("user")), _))
+      .WillOnce([&](const CoreAccountInfo&,
+                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
+                        callback) {
+        std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
+        return std::make_unique<TrustedVaultConnection::Request>();
+      });
   EXPECT_CALL(delegate_,
               WriteDegradedRecoverabilityState(DegradedRecoverabilityStateEq(
                   degraded_recoverability_state)));
-  EXPECT_CALL(refresh_callback(), Run());
+  scheduler().RefreshImmediately();
+}
+
+TEST_F(
+    DegradedRecoverabilitySchedulerTest,
+    ShouldWriteTheStateImmediatelyWithRecoverabilityNotDegradedAndCurrentTime) {
+  sync_pb::LocalTrustedVaultDegradedRecoverabilityState
+      degraded_recoverability_state;
+  degraded_recoverability_state.set_is_recoverability_degraded(false);
+  // Since the time is not moving, the `Time::Now()` is the expected to be
+  // written.
+  degraded_recoverability_state.set_last_refresh_time_millis_since_unix_epoch(
+      TimeToProtoTime(base::Time::Now()));
+  EXPECT_CALL(connection_, DownloadIsRecoverabilityDegraded(
+                               Eq(MakeAccountInfoWithGaiaId("user")), _))
+      .WillOnce([&](const CoreAccountInfo&,
+                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
+                        callback) {
+        std::move(callback).Run(TrustedVaultRecoverabilityStatus::kNotDegraded);
+        return std::make_unique<TrustedVaultConnection::Request>();
+      });
+  EXPECT_CALL(delegate_,
+              WriteDegradedRecoverabilityState(DegradedRecoverabilityStateEq(
+                  degraded_recoverability_state)));
   scheduler().RefreshImmediately();
 }
 
diff --git a/components/viz/service/debugger/rwlock.h b/components/viz/service/debugger/rwlock.h
index 6233a5e8..cfdb494 100644
--- a/components/viz/service/debugger/rwlock.h
+++ b/components/viz/service/debugger/rwlock.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_VIZ_SERVICE_DEBUGGER_RWLOCK_H_
 #define COMPONENTS_VIZ_SERVICE_DEBUGGER_RWLOCK_H_
 
+#include <atomic>
 #include <cstdint>
 #include <unordered_map>
 #include "components/viz/service/viz_service_export.h"
diff --git a/components/viz/service/display_embedder/compositor_gpu_thread.cc b/components/viz/service/display_embedder/compositor_gpu_thread.cc
index 80c206a..a93e1095 100644
--- a/components/viz/service/display_embedder/compositor_gpu_thread.cc
+++ b/components/viz/service/display_embedder/compositor_gpu_thread.cc
@@ -124,6 +124,14 @@
   attribs.angle_context_virtualization_group_number =
       gl::AngleContextVirtualizationGroup::kDrDc;
 
+  bool enable_angle_validation = features::IsANGLEValidationEnabled();
+#if DCHECK_IS_ON()
+  // Force validation on for all debug builds and testing
+  enable_angle_validation = true;
+#endif
+
+  attribs.can_skip_validation = !enable_angle_validation;
+
   // Compositor thread context doesn't need access textures and semaphores
   // created with other contexts.
   attribs.global_texture_share_group = false;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 49db28e..be545a3 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1953,6 +1953,8 @@
     "service_worker/service_worker_updated_script_loader.h",
     "service_worker/service_worker_version.cc",
     "service_worker/service_worker_version.h",
+    "service_worker/url_loader_client_checker.cc",
+    "service_worker/url_loader_client_checker.h",
     "shared_storage/shared_storage_budget_charger.cc",
     "shared_storage/shared_storage_budget_charger.h",
     "shared_storage/shared_storage_document_service_impl.cc",
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index 9b95dd05..247adb9 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -358,6 +358,15 @@
   if (new_mode_flags & ui::AXMode::kHTML)
     RecordNewAccessibilityModeFlags(
         ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_HTML);
+  if (new_mode_flags & ui::AXMode::kHTMLMetadata)
+    RecordNewAccessibilityModeFlags(
+        ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_HTML_METADATA);
+  if (new_mode_flags & ui::AXMode::kLabelImages)
+    RecordNewAccessibilityModeFlags(
+        ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_LABEL_IMAGES);
+  if (new_mode_flags & ui::AXMode::kPDF)
+    RecordNewAccessibilityModeFlags(
+        ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_PDF);
 
   std::vector<WebContentsImpl*> web_contents_vector =
       WebContentsImpl::GetAllWebContents();
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status.cc b/content/browser/renderer_host/cross_origin_opener_policy_status.cc
index 8608333..0d053901 100644
--- a/content/browser/renderer_host/cross_origin_opener_policy_status.cc
+++ b/content/browser/renderer_host/cross_origin_opener_policy_status.cc
@@ -19,34 +19,10 @@
 
 namespace content {
 
-namespace {
-
-// This function implements the COOP matching algorithm as detailed in [1].
-// Note that COEP is also provided since the COOP enum does not have a
-// "same-origin + COEP" value.
-// [1] https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e
-bool CrossOriginOpenerPolicyMatch(
-    network::mojom::CrossOriginOpenerPolicyValue initiator_coop,
-    const url::Origin& initiator_origin,
-    network::mojom::CrossOriginOpenerPolicyValue destination_coop,
-    const url::Origin& destination_origin) {
-  if (initiator_coop != destination_coop)
-    return false;
-
-  if (initiator_coop ==
-      network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone) {
-    return true;
-  }
-
-  if (!initiator_origin.IsSameOriginWith(destination_origin))
-    return false;
-  return true;
-}
-
 // This function returns whether the BrowsingInstance should change following
 // COOP rules defined in:
 // https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e#changes-to-navigation
-bool ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
+CoopSwapResult ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
     network::mojom::CrossOriginOpenerPolicyValue initiator_coop,
     const url::Origin& initiator_origin,
     bool is_navigation_from_initial_empty_document,
@@ -54,34 +30,65 @@
     const url::Origin& destination_origin) {
   using network::mojom::CrossOriginOpenerPolicyValue;
 
-  // If policies match there is no reason to switch BrowsingInstances.
-  if (CrossOriginOpenerPolicyMatch(initiator_coop, initiator_origin,
-                                   destination_coop, destination_origin)) {
-    return false;
-  }
+  switch (initiator_coop) {
+    case CrossOriginOpenerPolicyValue::kUnsafeNone:
+      switch (destination_coop) {
+        case CrossOriginOpenerPolicyValue::kUnsafeNone:
+          return CoopSwapResult::kNoSwap;
+        case CrossOriginOpenerPolicyValue::kRestrictProperties:
+        case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
+          return CoopSwapResult::kSwapWithReference;
+        case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
+        case CrossOriginOpenerPolicyValue::kSameOrigin:
+        case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
+          return CoopSwapResult::kSwap;
+      }
 
-  // "same-origin-allow-popups" is used to stay in the same BrowsingInstance
-  // despite COOP mismatch. This case is defined in the spec [1] as follow.
-  // ```
-  // If the result of matching currentCOOP, currentOrigin, potentialCOOP, and
-  // potentialOrigin is false and one of the following is false:
-  //  - doc is the initial about:blank document
-  //  - currentCOOP is "same-origin-allow-popups"
-  //  - potentialCOOP is "unsafe-none"
-  // Then create a new browsing context group.
-  // ```
-  // [1]
-  // https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e#changes-to-navigation
-  if (is_navigation_from_initial_empty_document &&
-      initiator_coop == CrossOriginOpenerPolicyValue::kSameOriginAllowPopups &&
-      destination_coop == CrossOriginOpenerPolicyValue::kUnsafeNone) {
-    return false;
+    case CrossOriginOpenerPolicyValue::kRestrictProperties:
+    case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
+      switch (destination_coop) {
+        case CrossOriginOpenerPolicyValue::kUnsafeNone:
+        case CrossOriginOpenerPolicyValue::kRestrictProperties:
+        case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
+          return CoopSwapResult::kSwapWithReference;
+        case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
+        case CrossOriginOpenerPolicyValue::kSameOrigin:
+        case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
+          return CoopSwapResult::kSwap;
+      }
+
+    // "same-origin-allow-popups" is used to stay in the same BrowsingInstance
+    // despite COOP mismatch during the first navigation the popup.
+    case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
+      switch (destination_coop) {
+        case CrossOriginOpenerPolicyValue::kUnsafeNone:
+          return is_navigation_from_initial_empty_document
+                     ? CoopSwapResult::kNoSwap
+                     : CoopSwapResult::kSwap;
+        case CrossOriginOpenerPolicyValue::kRestrictProperties:
+        case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
+          return is_navigation_from_initial_empty_document
+                     ? CoopSwapResult::kSwapWithReference
+                     : CoopSwapResult::kSwap;
+        case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
+          return initiator_origin.IsSameOriginWith(destination_origin)
+                     ? CoopSwapResult::kNoSwap
+                     : CoopSwapResult::kSwap;
+        case CrossOriginOpenerPolicyValue::kSameOrigin:
+        case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
+          return CoopSwapResult::kSwap;
+      }
+
+    // "same-origin" requires that both policies and origin match.
+    case CrossOriginOpenerPolicyValue::kSameOrigin:
+    case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
+      return (initiator_coop == destination_coop &&
+              initiator_origin.IsSameOriginWith(destination_origin))
+                 ? CoopSwapResult::kNoSwap
+                 : CoopSwapResult::kSwap;
   }
-  return true;
 }
 
-}  // namespace
-
 CrossOriginOpenerPolicyStatus::CrossOriginOpenerPolicyStatus(
     NavigationRequest* navigation_request)
     : navigation_request_(navigation_request),
@@ -170,7 +177,7 @@
     // We should force a COOP browsing instance swap to avoid certain
     // opener+error pages exploits, see https://crbug.com/1256823 and
     // https://github.com/whatwg/html/issues/7345.
-    require_browsing_instance_swap_ = true;
+    require_browsing_instance_swap_ = CoopSwapResult::kSwap;
     virtual_browsing_context_group_ =
         CrossOriginOpenerPolicyAccessReportManager::
             NextVirtualBrowsingContextGroup();
@@ -222,32 +229,47 @@
                 ->coop_reporter()
           : coop_reporter_.get();
 
-  bool cross_origin_policy_swap =
+  CoopSwapResult cross_origin_policy_swap =
       ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
           current_coop_.value, current_origin_,
           is_navigation_from_initial_empty_document_, response_coop.value,
           response_origin);
 
+  // Over the whole redirect chain, keep track of the "strongest" way the new
+  // context must be separated from the previous one.
+  // kNoSwap < kSwapWithReference < kSwap.
+  if (cross_origin_policy_swap > require_browsing_instance_swap_)
+    require_browsing_instance_swap_ = cross_origin_policy_swap;
+
   // Both report only cases (navigation from and to document) use the following
   // result, computing the need of a browsing context group swap based on both
   // documents' report-only values.
+  //
+  // Note: We're only interested in computing BrowsingInstance swaps here, and
+  // not whether we'll preserve some connection, so we group kSwap and
+  // kSwapWithReference in a simple boolean.
+  //
+  // TODO(https://crbug.com/1221127): See if we need to distinguish to support
+  // COOP: restrict-properties reporting.
   bool report_only_coop_swap =
       ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
           current_coop_.report_only_value, current_origin_,
           is_navigation_from_initial_empty_document_,
-          response_coop.report_only_value, response_origin);
+          response_coop.report_only_value,
+          response_origin) == CoopSwapResult::kSwap;
 
   bool navigating_to_report_only_coop_swap =
       ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
           current_coop_.value, current_origin_,
           is_navigation_from_initial_empty_document_,
-          response_coop.report_only_value, response_origin);
+          response_coop.report_only_value,
+          response_origin) == CoopSwapResult::kSwap;
 
   bool navigating_from_report_only_coop_swap =
       ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
           current_coop_.report_only_value, current_origin_,
           is_navigation_from_initial_empty_document_, response_coop.value,
-          response_origin);
+          response_origin) == CoopSwapResult::kSwap;
 
   bool has_other_window_in_browsing_context_group =
       frame_tree_node_->current_frame_host()
@@ -256,9 +278,7 @@
               frame_tree_node_->current_frame_host())
           .size() > 1;
 
-  if (cross_origin_policy_swap) {
-    require_browsing_instance_swap_ = true;
-
+  if (cross_origin_policy_swap == CoopSwapResult::kSwap) {
     // If this response's COOP causes a BrowsingInstance swap that severs
     // communication with another page, report this to the previous COOP
     // reporter and/or the COOP reporter of the response if they exist.
@@ -298,7 +318,7 @@
     }
   }
 
-  if (require_browsing_instance_swap_ || virtual_browsing_instance_swap) {
+  if (require_browsing_instance_swap() || virtual_browsing_instance_swap) {
     virtual_browsing_context_group_ =
         CrossOriginOpenerPolicyAccessReportManager::
             NextVirtualBrowsingContextGroup();
@@ -309,7 +329,8 @@
   if (ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
           current_coop_.soap_by_default_value, current_origin_,
           is_navigation_from_initial_empty_document_,
-          response_coop.soap_by_default_value, response_origin)) {
+          response_coop.soap_by_default_value,
+          response_origin) != CoopSwapResult::kNoSwap) {
     soap_by_default_virtual_browsing_context_group_ =
         CrossOriginOpenerPolicyAccessReportManager::
             NextVirtualBrowsingContextGroup();
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status.h b/content/browser/renderer_host/cross_origin_opener_policy_status.h
index 9fbc55b..436cfd76 100644
--- a/content/browser/renderer_host/cross_origin_opener_policy_status.h
+++ b/content/browser/renderer_host/cross_origin_opener_policy_status.h
@@ -29,6 +29,20 @@
 class StoragePartition;
 struct ChildProcessTerminationInfo;
 
+enum class CoopSwapResult { kNoSwap, kSwapWithReference, kSwap };
+
+// Helper function that returns whether the BrowsingInstance should change
+// following COOP rules defined in:
+//
+// https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e#changes-to-navigation
+CONTENT_EXPORT CoopSwapResult
+ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
+    network::mojom::CrossOriginOpenerPolicyValue initiator_coop,
+    const url::Origin& initiator_origin,
+    bool is_navigation_from_initial_empty_document,
+    network::mojom::CrossOriginOpenerPolicyValue destination_coop,
+    const url::Origin& destination_origin);
+
 // Groups information used to apply COOP during navigations. This class will be
 // used to trigger a number of mechanisms such as BrowsingInstance switch or
 // reporting.
@@ -57,7 +71,7 @@
   // those references will be broken; window.name will also be reset to an empty
   // string.
   bool require_browsing_instance_swap() const {
-    return require_browsing_instance_swap_;
+    return require_browsing_instance_swap_ > CoopSwapResult::kNoSwap;
   }
 
   // The virtual browsing context group of the document to commit. Initially,
@@ -127,7 +141,7 @@
   base::ScopedObservation<RenderProcessHost, RenderProcessHostObserver>
       previous_document_rph_observation_{this};
 
-  bool require_browsing_instance_swap_ = false;
+  CoopSwapResult require_browsing_instance_swap_ = CoopSwapResult::kNoSwap;
 
   int virtual_browsing_context_group_;
 
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status_unittest.cc b/content/browser/renderer_host/cross_origin_opener_policy_status_unittest.cc
new file mode 100644
index 0000000..58a4df7
--- /dev/null
+++ b/content/browser/renderer_host/cross_origin_opener_policy_status_unittest.cc
@@ -0,0 +1,148 @@
+// Copyright 2022 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/renderer_host/cross_origin_opener_policy_status.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/cross_origin_opener_policy.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/origin.h"
+
+namespace content {
+
+using COOP = network::mojom::CrossOriginOpenerPolicyValue;
+using Result = CoopSwapResult;
+using CrossOriginOpenerPolicyStatusTest = testing::Test;
+
+TEST(CrossOriginOpenerPolicyStatusTest,
+     ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy) {
+  struct TestCase {
+    COOP coop_from;
+    COOP coop_to;
+    CoopSwapResult expect_swap_same_origin;
+    CoopSwapResult expect_swap_cross_origin;
+    CoopSwapResult expect_swap_new_popup;
+  } cases[] = {
+      // 'unsafe-none' -> *
+      {COOP::kUnsafeNone, COOP::kUnsafeNone, Result::kNoSwap, Result::kNoSwap,
+       Result::kNoSwap},
+      {COOP::kUnsafeNone, COOP::kSameOrigin, Result::kSwap, Result::kSwap,
+       Result::kSwap},
+      {COOP::kUnsafeNone, COOP::kSameOriginPlusCoep, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kUnsafeNone, COOP::kSameOriginAllowPopups, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kUnsafeNone, COOP::kRestrictProperties, Result::kSwapWithReference,
+       Result::kSwapWithReference, Result::kSwapWithReference},
+      {COOP::kUnsafeNone, COOP::kRestrictPropertiesPlusCoep,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+
+      // 'same-origin' -> *
+      {COOP::kSameOrigin, COOP::kUnsafeNone, Result::kSwap, Result::kSwap,
+       Result::kSwap},
+      {COOP::kSameOrigin, COOP::kSameOrigin, Result::kNoSwap, Result::kSwap,
+       Result::kSwap},
+      {COOP::kSameOrigin, COOP::kSameOriginPlusCoep, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOrigin, COOP::kSameOriginAllowPopups, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOrigin, COOP::kRestrictProperties, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOrigin, COOP::kRestrictPropertiesPlusCoep, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+
+      // 'same-origin' + COEP -> *
+      {COOP::kSameOriginPlusCoep, COOP::kUnsafeNone, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginPlusCoep, COOP::kSameOrigin, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginPlusCoep, COOP::kSameOriginPlusCoep, Result::kNoSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginPlusCoep, COOP::kSameOriginAllowPopups, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginPlusCoep, COOP::kRestrictProperties, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginPlusCoep, COOP::kRestrictPropertiesPlusCoep,
+       Result::kSwap, Result::kSwap, Result::kSwap},
+
+      // 'same-origin-allow-popups' -> *
+      {COOP::kSameOriginAllowPopups, COOP::kUnsafeNone, Result::kSwap,
+       Result::kSwap, Result::kNoSwap},
+      {COOP::kSameOriginAllowPopups, COOP::kSameOrigin, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginAllowPopups, COOP::kSameOriginPlusCoep, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginAllowPopups, COOP::kSameOriginAllowPopups,
+       Result::kNoSwap, Result::kSwap, Result::kSwap},
+      {COOP::kSameOriginAllowPopups, COOP::kRestrictProperties, Result::kSwap,
+       Result::kSwap, Result::kSwapWithReference},
+      {COOP::kSameOriginAllowPopups, COOP::kRestrictPropertiesPlusCoep,
+       Result::kSwap, Result::kSwap, Result::kSwapWithReference},
+
+      // 'restrict-properties' -> *
+      {COOP::kRestrictProperties, COOP::kUnsafeNone, Result::kSwapWithReference,
+       Result::kSwapWithReference, Result::kSwapWithReference},
+      {COOP::kRestrictProperties, COOP::kSameOrigin, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kRestrictProperties, COOP::kSameOriginPlusCoep, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kRestrictProperties, COOP::kSameOriginAllowPopups, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kRestrictProperties, COOP::kRestrictProperties,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+      {COOP::kRestrictProperties, COOP::kRestrictPropertiesPlusCoep,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+
+      // 'restrict-properties' + COEP -> *
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kUnsafeNone,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kSameOrigin, Result::kSwap,
+       Result::kSwap, Result::kSwap},
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kSameOriginPlusCoep,
+       Result::kSwap, Result::kSwap, Result::kSwap},
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kSameOriginAllowPopups,
+       Result::kSwap, Result::kSwap, Result::kSwap},
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kRestrictProperties,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+      {COOP::kRestrictPropertiesPlusCoep, COOP::kRestrictPropertiesPlusCoep,
+       Result::kSwapWithReference, Result::kSwapWithReference,
+       Result::kSwapWithReference},
+  };
+  for (const auto& test : cases) {
+    url::Origin A = url::Origin::Create(GURL("https://www.a.com"));
+    url::Origin B = url::Origin::Create(GURL("https://www.b.com"));
+
+    SCOPED_TRACE(testing::Message() << "from " << test.coop_from << " to "
+                                    << test.coop_to << std::endl);
+
+    // Verify the behavior for two same-origin documents.
+    EXPECT_EQ(ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
+                  test.coop_from, A,
+                  /*is_navigation_from_initial_empty_document=*/false,
+                  test.coop_to, A),
+              test.expect_swap_same_origin);
+
+    // Verify behavior for two cross-origin documents.
+    EXPECT_EQ(ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
+                  test.coop_from, A,
+                  /*is_navigation_from_initial_empty_document=*/false,
+                  test.coop_to, B),
+              test.expect_swap_cross_origin);
+
+    // Verify behavior when opening a new cross-origin popup.
+    EXPECT_EQ(ShouldSwapBrowsingInstanceForCrossOriginOpenerPolicy(
+                  test.coop_from, A,
+                  /*is_navigation_from_initial_empty_document=*/true,
+                  test.coop_to, B),
+              test.expect_swap_new_popup);
+  }
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc
index 0f301a3..8846216 100644
--- a/content/browser/renderer_host/input/input_router_impl.cc
+++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -338,6 +338,19 @@
   UpdateTouchAckTimeoutEnabled();
 }
 
+void InputRouterImpl::SetPanAction(blink::mojom::PanAction pan_action) {
+  if (pan_action_ == pan_action)
+    return;
+  pan_action_ = pan_action;
+
+  // TODO(mahesh.ma): Update PanAction state to view, once RenderWidgetHostView
+  // is set again.
+  if (!client_->GetRenderWidgetHostViewBase())
+    return;
+  client_->GetRenderWidgetHostViewBase()->SetHoverActionStylusWritable(
+      pan_action_ == blink::mojom::PanAction::kStylusWritable);
+}
+
 void InputRouterImpl::OnSetCompositorAllowedTouchAction(
     cc::TouchAction touch_action) {
   TRACE_EVENT1("input", "InputRouterImpl::OnSetCompositorAllowedTouchAction",
diff --git a/content/browser/renderer_host/input/input_router_impl.h b/content/browser/renderer_host/input/input_router_impl.h
index f7c7e77e..ce6298c 100644
--- a/content/browser/renderer_host/input/input_router_impl.h
+++ b/content/browser/renderer_host/input/input_router_impl.h
@@ -95,6 +95,7 @@
 
   // InputHandlerHost impl
   void SetTouchActionFromMain(cc::TouchAction touch_action) override;
+  void SetPanAction(blink::mojom::PanAction pan_action) override;
   void DidOverscroll(blink::mojom::DidOverscrollParamsPtr params) override;
   void ImeCancelComposition() override;
   void DidStartScrollingViewport() override;
@@ -250,6 +251,11 @@
   // Whether stylus writing has started.
   bool stylus_writing_started_ = false;
 
+  // Stores the pan action that can take place like stylus writing, moving
+  // cursor or scrolling. This is sent when the pointer is hovering and set from
+  // the main thread.
+  blink::mojom::PanAction pan_action_ = blink::mojom::PanAction::kNone;
+
   MouseWheelEventQueue wheel_event_queue_;
   PassthroughTouchEventQueue touch_event_queue_;
   TouchpadPinchEventQueue touchpad_pinch_event_queue_;
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc
index 1697007..ad91a1db 100644
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc
@@ -108,12 +108,19 @@
 
   bool RequestStartStylusWriting() override { return supports_stylus_writing_; }
 
+  void SetHoverActionStylusWritable(bool stylus_writable) override {
+    hover_action_stylus_writable_ = stylus_writable;
+  }
+
   void set_supports_stylus_writing(bool supports) {
     supports_stylus_writing_ = supports;
   }
 
+  bool hover_action_stylus_writable() { return hover_action_stylus_writable_; }
+
  private:
   bool supports_stylus_writing_ = false;
+  bool hover_action_stylus_writable_ = false;
 };
 
 // TODO(dtapuska): Remove this class when we don't have multiple implementations
@@ -2299,6 +2306,27 @@
 
 }  // namespace
 
+// Tests that hover action stylus writable is set when pan action is received.
+TEST_F(InputRouterImplStylusWritingTest, SetHoverActionStylusWritableToView) {
+  // Hover action is not set before pan action is received.
+  ASSERT_FALSE(mock_view_->hover_action_stylus_writable());
+
+  // Hover action is stylus writable only when pan action is writable.
+  input_router_->SetPanAction(blink::mojom::PanAction::kStylusWritable);
+  ASSERT_TRUE(mock_view_->hover_action_stylus_writable());
+
+  // Hover action is not stylus writable when pan action is cursor control.
+  input_router_->SetPanAction(blink::mojom::PanAction::kMoveCursorOrScroll);
+  ASSERT_FALSE(mock_view_->hover_action_stylus_writable());
+
+  // Set hover action as stylus writable to assert it changes for kScroll.
+  input_router_->SetPanAction(blink::mojom::PanAction::kStylusWritable);
+  ASSERT_TRUE(mock_view_->hover_action_stylus_writable());
+  // Hover action is not stylus writable when pan action is scroll.
+  input_router_->SetPanAction(blink::mojom::PanAction::kScroll);
+  ASSERT_FALSE(mock_view_->hover_action_stylus_writable());
+}
+
 // Tests that stylus writing is not started when touch action is not writable.
 TEST_F(InputRouterImplStylusWritingTest,
        StylusWritingNotStartedForNotWritableTouchAction) {
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.mm b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
index 8a15dce..eadeaa46 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
@@ -263,8 +263,30 @@
       ui::IsKeyUpEvent(event) ? blink::WebInputEvent::Type::kKeyUp
                               : blink::WebInputEvent::Type::kRawKeyDown,
       modifiers, ui::EventTimeStampFromSeconds([event timestamp]));
-  result.windows_key_code =
-      ui::LocatedToNonLocatedKeyboardCode(ui::KeyboardCodeFromNSEvent(event));
+
+  // Some keys have the same meaning but different locations on the keyboard:
+  // the left and right shift keys; the numeric keypad keys and their
+  // counterparts in the number row; etc. A "located" keyboard code lets us
+  // distinguish between keys with the same meaning. For example, VKEY_LSHIFT
+  // and VKEY_RSHIFT are located keyboard codes and VKEY_SHIFT is their non-
+  // located representation.
+  //
+  // When determining the windows_key_code, we want to use the non-located code
+  // for some keys (Shift, etc.). We call ui::LocatedToNonLocatedKeyboardCode()
+  // to perform this conversion. However, ui::LocatedToNonLocatedKeyboardCode()
+  // converts more keys than we'd like. In particular, it returns the
+  // non-located representations of number pad key codes. If we use these as
+  // windows key codes, key presses in the number row and the number pad will be
+  // indistinguishable (see https://crbug.com/1282730). To avoid this, when we
+  // encounter a number pad key, we'll use the located key_code itself rather
+  // than its non-located counterpart.
+  ui::KeyboardCode key_code = ui::KeyboardCodeFromNSEvent(event);
+  bool is_numeric_keypad_keycode =
+      key_code >= ui::VKEY_NUMPAD0 && key_code <= ui::VKEY_NUMPAD9;
+  result.windows_key_code = is_numeric_keypad_keycode
+                                ? key_code
+                                : ui::LocatedToNonLocatedKeyboardCode(key_code);
+
   result.native_key_code = [event keyCode];
   result.dom_code = static_cast<int>(dom_code);
   result.dom_key = DomKeyFromEvent(event);
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
index fe28ffd..8b8cbbca 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm
@@ -168,25 +168,25 @@
        ui::DomKey::FromCharacter('-')},
       {81, '=', ui::VKEY_OEM_PLUS, ui::DomCode::NUMPAD_EQUAL,
        ui::DomKey::FromCharacter('=')},
-      {82, '0', ui::VKEY_0, ui::DomCode::NUMPAD0,
+      {82, '0', ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0,
        ui::DomKey::FromCharacter('0')},
-      {83, '1', ui::VKEY_1, ui::DomCode::NUMPAD1,
+      {83, '1', ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1,
        ui::DomKey::FromCharacter('1')},
-      {84, '2', ui::VKEY_2, ui::DomCode::NUMPAD2,
+      {84, '2', ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2,
        ui::DomKey::FromCharacter('2')},
-      {85, '3', ui::VKEY_3, ui::DomCode::NUMPAD3,
+      {85, '3', ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3,
        ui::DomKey::FromCharacter('3')},
-      {86, '4', ui::VKEY_4, ui::DomCode::NUMPAD4,
+      {86, '4', ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4,
        ui::DomKey::FromCharacter('4')},
-      {87, '5', ui::VKEY_5, ui::DomCode::NUMPAD5,
+      {87, '5', ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5,
        ui::DomKey::FromCharacter('5')},
-      {88, '6', ui::VKEY_6, ui::DomCode::NUMPAD6,
+      {88, '6', ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6,
        ui::DomKey::FromCharacter('6')},
-      {89, '7', ui::VKEY_7, ui::DomCode::NUMPAD7,
+      {89, '7', ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7,
        ui::DomKey::FromCharacter('7')},
-      {91, '8', ui::VKEY_8, ui::DomCode::NUMPAD8,
+      {91, '8', ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8,
        ui::DomKey::FromCharacter('8')},
-      {92, '9', ui::VKEY_9, ui::DomCode::NUMPAD9,
+      {92, '9', ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9,
        ui::DomKey::FromCharacter('9')},
   };
 
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 353418f..bca58e9 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1107,6 +1107,11 @@
          ime_adapter_android_->RequestStartStylusWriting();
 }
 
+void RenderWidgetHostViewAndroid::SetHoverActionStylusWritable(
+    bool stylus_writable) {
+  view_.SetHoverActionStylusWritable(stylus_writable);
+}
+
 void RenderWidgetHostViewAndroid::OnEditElementFocusedForStylusWriting(
     const gfx::Rect& focused_edit_bounds,
     const gfx::Rect& caret_bounds) {
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index b17e7e4a..8cbaa47f 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -143,6 +143,7 @@
   void FocusedNodeChanged(bool is_editable_node,
                           const gfx::Rect& node_bounds_in_screen) override;
   bool RequestStartStylusWriting() override;
+  void SetHoverActionStylusWritable(bool stylus_writable) override;
   void OnEditElementFocusedForStylusWriting(
       const gfx::Rect& focused_edit_bounds,
       const gfx::Rect& caret_bounds) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index 4174581..763c624e 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -249,6 +249,9 @@
   // Requests to start stylus writing and returns true if successful.
   virtual bool RequestStartStylusWriting();
 
+  // Sets whether the hovered element action is stylus writable or not.
+  virtual void SetHoverActionStylusWritable(bool stylus_writable) {}
+
   // This message is received when the stylus writable element is focused.
   // It receives the focused edit element bounds and the current caret bounds
   // needed for stylus writing service. These bounds would be empty when the
diff --git a/content/browser/service_worker/service_worker_installed_script_loader.h b/content/browser/service_worker/service_worker_installed_script_loader.h
index cd919b2..b4be050 100644
--- a/content/browser/service_worker/service_worker_installed_script_loader.h
+++ b/content/browser/service_worker/service_worker_installed_script_loader.h
@@ -7,6 +7,7 @@
 
 #include "base/time/time.h"
 #include "content/browser/service_worker/service_worker_installed_script_reader.h"
+#include "content/browser/service_worker/url_loader_client_checker.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/data_pipe.h"
@@ -71,7 +72,7 @@
   void OnDataAvailable(const void* data, size_t num_bytes) override {}
   void OnDataComplete() override {}
 
-  mojo::Remote<network::mojom::URLLoaderClient> client_;
+  URLLoaderClientCheckedRemote client_;
   scoped_refptr<ServiceWorkerVersion>
       version_for_main_script_http_response_info_;
   base::TimeTicks request_start_;
diff --git a/content/browser/service_worker/service_worker_new_script_loader.h b/content/browser/service_worker/service_worker_new_script_loader.h
index 4d84a4b..62bbf1a 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.h
+++ b/content/browser/service_worker/service_worker_new_script_loader.h
@@ -6,6 +6,7 @@
 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_NEW_SCRIPT_LOADER_H_
 
 #include "content/browser/service_worker/service_worker_cache_writer.h"
+#include "content/browser/service_worker/url_loader_client_checker.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/global_routing_id.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -206,7 +207,7 @@
   scoped_refptr<network::SharedURLLoaderFactory> loader_factory_;
 
   // Used for responding with the fetched script to this loader's client.
-  mojo::Remote<network::mojom::URLLoaderClient> client_;
+  URLLoaderClientCheckedRemote client_;
   mojo::ScopedDataPipeProducerHandle client_producer_;
 
   // Represents the state of |network_loader_|.
diff --git a/content/browser/service_worker/service_worker_updated_script_loader.h b/content/browser/service_worker/service_worker_updated_script_loader.h
index 1bce300..81e7e24 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader.h
+++ b/content/browser/service_worker/service_worker_updated_script_loader.h
@@ -7,6 +7,7 @@
 
 #include "base/time/time.h"
 #include "content/browser/service_worker/service_worker_cache_writer.h"
+#include "content/browser/service_worker/url_loader_client_checker.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_thread.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -184,7 +185,7 @@
   mojo::SimpleWatcher network_watcher_;
 
   // Used for responding with the fetched script to this loader's client.
-  mojo::Remote<network::mojom::URLLoaderClient> client_;
+  URLLoaderClientCheckedRemote client_;
   mojo::ScopedDataPipeProducerHandle client_producer_;
 
   // Represents the state of |network_loader_|.
diff --git a/content/browser/service_worker/url_loader_client_checker.cc b/content/browser/service_worker/url_loader_client_checker.cc
new file mode 100644
index 0000000..9f7f82c
--- /dev/null
+++ b/content/browser/service_worker/url_loader_client_checker.cc
@@ -0,0 +1,19 @@
+// Copyright 2022 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/service_worker/url_loader_client_checker.h"
+
+namespace content {
+
+URLLoaderClientCheckedRemote::URLLoaderClientCheckedRemote(
+    mojo::PendingRemote<network::mojom::URLLoaderClient> client)
+    : proxy_(std::move(client)) {}
+
+URLLoaderClientCheckedRemote::Proxy::Proxy(
+    mojo::PendingRemote<network::mojom::URLLoaderClient> client)
+    : client_(std::move(client)) {}
+
+URLLoaderClientCheckedRemote::Proxy::~Proxy() = default;
+
+}  // namespace content
diff --git a/content/browser/service_worker/url_loader_client_checker.h b/content/browser/service_worker/url_loader_client_checker.h
new file mode 100644
index 0000000..e9e1fcc
--- /dev/null
+++ b/content/browser/service_worker/url_loader_client_checker.h
@@ -0,0 +1,85 @@
+// Copyright 2022 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 CONTENT_BROWSER_SERVICE_WORKER_URL_LOADER_CLIENT_CHECKER_H_
+#define CONTENT_BROWSER_SERVICE_WORKER_URL_LOADER_CLIENT_CHECKER_H_
+
+#include "base/debug/dump_without_crashing.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "services/network/public/mojom/early_hints.mojom.h"
+#include "services/network/public/mojom/url_loader.mojom.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+
+namespace content {
+
+// When used as replacement of a
+// `mojo::Remote<network::mojom::URLLoaderClient>`, this checks the calling
+// order of `network::mojom::URLLoaderClient` methods.
+//
+// Currently this only implements the assertions and interfaces needed for the
+// investigation of https://crbug.com/1346074, and this can be only used to call
+// `network::mojom::URLLoaderClient` methods.
+class URLLoaderClientCheckedRemote final {
+ public:
+  // `URLLoaderClient` methods shouldn't have been called previously via
+  // `client`.
+  explicit URLLoaderClientCheckedRemote(
+      mojo::PendingRemote<network::mojom::URLLoaderClient> client);
+
+  class Proxy final {
+   public:
+    explicit Proxy(mojo::PendingRemote<network::mojom::URLLoaderClient> client);
+    ~Proxy();
+
+    void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) {
+      client_->OnReceiveEarlyHints(std::move(early_hints));
+    }
+    void OnReceiveResponse(network::mojom::URLResponseHeadPtr head,
+                           mojo::ScopedDataPipeConsumerHandle body) {
+      on_receive_response_called_ = true;
+      client_->OnReceiveResponse(std::move(head), std::move(body));
+    }
+    void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
+                           network::mojom::URLResponseHeadPtr head) {
+      client_->OnReceiveRedirect(redirect_info, std::move(head));
+    }
+    void OnUploadProgress(
+        int64_t current_position,
+        int64_t total_size,
+        network::mojom::URLLoaderClient::OnUploadProgressCallback callback) {
+      client_->OnUploadProgress(current_position, total_size,
+                                std::move(callback));
+    }
+    void OnReceiveCachedMetadata(mojo_base::BigBuffer data) {
+      client_->OnReceiveCachedMetadata(std::move(data));
+    }
+    void OnTransferSizeUpdated(int32_t transfer_size_diff) {
+      client_->OnTransferSizeUpdated(transfer_size_diff);
+    }
+    NOINLINE void OnComplete(const network::URLLoaderCompletionStatus& status) {
+      if (status.error_code == net::OK && !on_receive_response_called_) {
+        NOTREACHED();
+        base::debug::DumpWithoutCrashing();
+        NO_CODE_FOLDING();
+      }
+      client_->OnComplete(status);
+    }
+
+    explicit operator bool() const { return static_cast<bool>(client_); }
+
+   private:
+    mojo::Remote<network::mojom::URLLoaderClient> client_;
+    bool on_receive_response_called_ = false;
+  };
+
+  Proxy* operator->() { return &proxy_; }
+  explicit operator bool() const { return static_cast<bool>(proxy_); }
+
+ private:
+  Proxy proxy_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_SERVICE_WORKER_URL_LOADER_CLIENT_CHECKER_H_
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index b2ff2f7c..8c093ed 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -852,6 +852,11 @@
 
   SitePerProcessHighDPIHitTestBrowserTest() {}
 
+// TODO(crbug.com/1350913): Re-enable when fixed.
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  void SetUp() override { GTEST_SKIP(); }
+#endif
+
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     SitePerProcessHitTestBrowserTest::SetUpCommandLine(command_line);
diff --git a/content/public/test/fake_render_widget_host.cc b/content/public/test/fake_render_widget_host.cc
index df6293f..862c1cf2 100644
--- a/content/public/test/fake_render_widget_host.cc
+++ b/content/public/test/fake_render_widget_host.cc
@@ -94,6 +94,8 @@
 void FakeRenderWidgetHost::SetTouchActionFromMain(
     cc::TouchAction touch_action) {}
 
+void FakeRenderWidgetHost::SetPanAction(blink::mojom::PanAction pan_action) {}
+
 void FakeRenderWidgetHost::DidOverscroll(
     blink::mojom::DidOverscrollParamsPtr params) {}
 
diff --git a/content/public/test/fake_render_widget_host.h b/content/public/test/fake_render_widget_host.h
index 8ff430a..fa48e124 100644
--- a/content/public/test/fake_render_widget_host.h
+++ b/content/public/test/fake_render_widget_host.h
@@ -93,6 +93,7 @@
 
   // blink::mojom::WidgetInputHandlerHost overrides.
   void SetTouchActionFromMain(cc::TouchAction touch_action) override;
+  void SetPanAction(blink::mojom::PanAction pan_action) override;
   void DidOverscroll(blink::mojom::DidOverscrollParamsPtr params) override;
   void DidStartScrollingViewport() override;
   void ImeCancelComposition() override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index a6a2254..09182058 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2298,6 +2298,7 @@
     "../browser/renderer_host/back_forward_cache_metrics_unittest.cc",
     "../browser/renderer_host/clipboard_host_impl_unittest.cc",
     "../browser/renderer_host/commit_deferring_condition_runner_unittest.cc",
+    "../browser/renderer_host/cross_origin_opener_policy_status_unittest.cc",
     "../browser/renderer_host/cursor_manager_unittest.cc",
     "../browser/renderer_host/document_service_unittest.cc",
     "../browser/renderer_host/embedded_frame_sink_provider_impl_unittest.cc",
diff --git a/extensions/browser/api/automation_internal/automation_internal_api.cc b/extensions/browser/api/automation_internal/automation_internal_api.cc
index a808f511..f0705b6 100644
--- a/extensions/browser/api/automation_internal/automation_internal_api.cc
+++ b/extensions/browser/api/automation_internal/automation_internal_api.cc
@@ -270,6 +270,18 @@
           "Accessibility.ModeFlag",
           ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_HTML,
           ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_MAX);
+      UMA_HISTOGRAM_ENUMERATION(
+          "Accessibility.ModeFlag",
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_HTML_METADATA,
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_MAX);
+      UMA_HISTOGRAM_ENUMERATION(
+          "Accessibility.ModeFlag",
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_LABEL_IMAGES,
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_MAX);
+      UMA_HISTOGRAM_ENUMERATION(
+          "Accessibility.ModeFlag",
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_PDF,
+          ui::AXMode::ModeFlagHistogramValue::UMA_AX_MODE_MAX);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
     }
   }
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index e95fcd4..bd3a93c 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1754,7 +1754,7 @@
   AUTOTESTPRIVATE_GETDESKCOUNT = 1691,
   METRICSPRIVATE_RECORDSPARSEVALUEWITHPERSISTENTHASH = 1692,
   METRICSPRIVATE_RECORDSPARSEVALUEWITHHASHMETRICNAME = 1693,
-  FILEMANAGERPRIVATE_SHOWDLPRESTRICTIONDETAILS = 1694,
+  FILEMANAGERPRIVATE_GETDLPRESTRICTIONDETAILS = 1694,
   ACCESSIBILITY_PRIVATE_SILENCESPOKENFEEDBACK = 1695,
   AUTOTESTPRIVATE_SETALLOWEDPREF = 1696,
   PASSWORDSPRIVATE_REQUESTCREDENTIALDETAILS = 1697,
diff --git a/extensions/common/api/declarative_web_request.json b/extensions/common/api/declarative_web_request.json
index 53357045..bcc94e90 100644
--- a/extensions/common/api/declarative_web_request.json
+++ b/extensions/common/api/declarative_web_request.json
@@ -701,8 +701,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "optional": true, "description": "A UUID of the document that made the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "A UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the navigation occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the navigation occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "webRequest.ResourceType",
                        "description": "How the requested resource will be used."},
diff --git a/extensions/common/api/web_request.json b/extensions/common/api/web_request.json
index 1ff4e3d..77414673 100644
--- a/extensions/common/api/web_request.json
+++ b/extensions/common/api/web_request.json
@@ -198,8 +198,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "optional": true, "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "optional": true, "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "optional": true, "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "optional": true, "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "optional": true, "description": "The type of frame the request occurred in.","nodoc": true},
               "requestBody": {
                 "type": "object",
                 "optional": true,
@@ -270,8 +270,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
@@ -319,8 +319,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -363,8 +363,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -414,8 +414,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -478,8 +478,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -526,8 +526,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -575,8 +575,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
@@ -622,8 +622,8 @@
               "parentFrameId": {"type": "integer", "description": "ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists."},
               "documentId": {"type": "string", "description": "The UUID of the document making the request. This value is not present if the request is a navigation of a frame.", "nodoc": true},
               "parentDocumentId": {"type": "string", "optional": true, "description": "The UUID of the parent document owning this frame. This is not set if there is no parent.", "nodoc": true},
-              "documentLifecycle": {"type": "string", "description": "The lifecycle the document is in.","nodoc": true},
-              "frameType": {"type": "string", "description": "The type of frame the request occurred in.","nodoc": true},
+              "documentLifecycle": {"$ref": "extensionTypes.DocumentLifecycle", "description": "The lifecycle the document is in.","nodoc": true},
+              "frameType": {"$ref": "extensionTypes.FrameType", "description": "The type of frame the request occurred in.","nodoc": true},
               "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab."},
               "type": {"$ref": "ResourceType", "description": "How the requested resource will be used."},
               "initiator": {"type": "string", "optional": true, "description": "The origin where the request was initiated. This does not change through redirects. If this is an opaque origin, the string 'null' will be used."},
diff --git a/fuchsia_web/runners/cast/cast_runner_integration_test.shard.test-cml b/fuchsia_web/runners/cast/cast_runner_integration_test.shard.test-cml
index 42a41e6f..02c8fa3 100644
--- a/fuchsia_web/runners/cast/cast_runner_integration_test.shard.test-cml
+++ b/fuchsia_web/runners/cast/cast_runner_integration_test.shard.test-cml
@@ -7,18 +7,17 @@
     },
     {
       protocol: [
-        "fuchsia.fonts.Provider",
         "fuchsia.media.AudioDeviceEnumerator",
         "fuchsia.media.ProfileProvider",
         "fuchsia.memorypressure.Provider",
         "fuchsia.net.interfaces.State",
         "fuchsia.posix.socket.Provider",
+        "fuchsia.scheduler.ProfileProvider",
         "fuchsia.settings.Display",
         "fuchsia.sys.Environment",
         "fuchsia.sys.Loader",
         "fuchsia.sysmem.Allocator",
-        "fuchsia.ui.composition.Allocator",
-        "fuchsia.ui.scenic.Scenic",
+        "fuchsia.tracing.provider.Registry",
         "fuchsia.vulkan.loader.Loader",
       ],
       from: "parent",
diff --git a/fuchsia_web/runners/cast/fidl/api_bindings.fidl b/fuchsia_web/runners/cast/fidl/api_bindings.fidl
index 62d3a59..fbb7326 100644
--- a/fuchsia_web/runners/cast/fidl/api_bindings.fidl
+++ b/fuchsia_web/runners/cast/fidl/api_bindings.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 using fuchsia.mem;
diff --git a/fuchsia_web/runners/cast/fidl/application_config.fidl b/fuchsia_web/runners/cast/fidl/application_config.fidl
index 8667be21..84362d82 100644
--- a/fuchsia_web/runners/cast/fidl/application_config.fidl
+++ b/fuchsia_web/runners/cast/fidl/application_config.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 using fuchsia.diagnostics;
diff --git a/fuchsia_web/runners/cast/fidl/application_context.fidl b/fuchsia_web/runners/cast/fidl/application_context.fidl
index c5de66fe..8091419b 100644
--- a/fuchsia_web/runners/cast/fidl/application_context.fidl
+++ b/fuchsia_web/runners/cast/fidl/application_context.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 @discoverable
diff --git a/fuchsia_web/runners/cast/fidl/application_controller.fidl b/fuchsia_web/runners/cast/fidl/application_controller.fidl
index a6cc7db..2fb5c3e 100644
--- a/fuchsia_web/runners/cast/fidl/application_controller.fidl
+++ b/fuchsia_web/runners/cast/fidl/application_controller.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 using fuchsia.media.sessions2;
diff --git a/fuchsia_web/runners/cast/fidl/cors_exempt_headers.fidl b/fuchsia_web/runners/cast/fidl/cors_exempt_headers.fidl
index a975eba..24d1d4c5 100644
--- a/fuchsia_web/runners/cast/fidl/cors_exempt_headers.fidl
+++ b/fuchsia_web/runners/cast/fidl/cors_exempt_headers.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 using fuchsia.web;
diff --git a/fuchsia_web/runners/cast/fidl/data_reset.fidl b/fuchsia_web/runners/cast/fidl/data_reset.fidl
index eb852fa6..276df5c 100644
--- a/fuchsia_web/runners/cast/fidl/data_reset.fidl
+++ b/fuchsia_web/runners/cast/fidl/data_reset.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 // Used to request that persistent data for components hosted by the Runner is
diff --git a/fuchsia_web/runners/cast/fidl/url_request_rewriter.fidl b/fuchsia_web/runners/cast/fidl/url_request_rewriter.fidl
index 18f3bc8..a934684 100644
--- a/fuchsia_web/runners/cast/fidl/url_request_rewriter.fidl
+++ b/fuchsia_web/runners/cast/fidl/url_request_rewriter.fidl
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(crbug.com/1227712): Migrate syntax and remove this.
 library chromium.cast;
 
 using fuchsia.web;
diff --git a/fuchsia_web/runners/cast/test/BUILD.gn b/fuchsia_web/runners/cast/test/BUILD.gn
index fa3e2a8..518a224 100644
--- a/fuchsia_web/runners/cast/test/BUILD.gn
+++ b/fuchsia_web/runners/cast/test/BUILD.gn
@@ -43,6 +43,7 @@
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.memorypressure",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.net.interfaces",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.sysmem",
+    "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.tracing.provider",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.composition",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.scenic",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web",
diff --git a/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.cc b/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.cc
index 1e8b793..bea6567 100644
--- a/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.cc
+++ b/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.cc
@@ -15,6 +15,7 @@
 #include <fuchsia/settings/cpp/fidl.h>
 #include <fuchsia/sys/cpp/fidl.h>
 #include <fuchsia/sysmem/cpp/fidl.h>
+#include <fuchsia/tracing/provider/cpp/fidl.h>
 #include <fuchsia/ui/composition/cpp/fidl.h>
 #include <fuchsia/ui/scenic/cpp/fidl.h>
 #include <fuchsia/web/cpp/fidl.h>
@@ -86,15 +87,22 @@
       .source = component_testing::ChildRef{kFeedbackService},
       .targets = {component_testing::ChildRef{kCastRunnerService}}});
 
+  AddSyslogRoutesFromParent(realm_builder, kCastRunnerService);
+  AddVulkanRoutesFromParent(realm_builder, kCastRunnerService);
+
+  // Run an isolated font service for cast_runner.
+  AddFontService(realm_builder, kCastRunnerService);
+
+  // Run the test-ui-stack and route the protocols needed by cast_runner to it.
+  AddTestUiStack(realm_builder, kCastRunnerService);
+
   realm_builder.AddRoute(component_testing::Route{
       .capabilities =
           {
               component_testing::Directory{.name = "config-data"},
               component_testing::Protocol{fuchsia::buildinfo::Provider::Name_},
-              component_testing::Protocol{fuchsia::fonts::Provider::Name_},
               component_testing::Protocol{
                   fuchsia::intl::PropertyProvider::Name_},
-              component_testing::Protocol{fuchsia::logger::LogSink::Name_},
               component_testing::Protocol{
                   fuchsia::media::ProfileProvider::Name_},
               component_testing::Protocol{
@@ -105,11 +113,6 @@
               component_testing::Protocol{fuchsia::settings::Display::Name_},
               component_testing::Protocol{fuchsia::sys::Environment::Name_},
               component_testing::Protocol{fuchsia::sys::Loader::Name_},
-              component_testing::Protocol{fuchsia::sysmem::Allocator::Name_},
-              component_testing::Protocol{
-                  fuchsia::ui::composition::Allocator::Name_},
-              component_testing::Protocol{fuchsia::ui::scenic::Scenic::Name_},
-              component_testing::Protocol{"fuchsia.vulkan.loader.Loader"},
               component_testing::Storage{.name = "cache", .path = "/cache"},
           },
       .source = component_testing::ParentRef(),
@@ -157,4 +160,87 @@
   return std::make_unique<sys::ServiceDirectory>(realm_root_->CloneRoot());
 }
 
+// static
+component_testing::RealmBuilder&
+CastRunnerLauncherV2::AddSyslogRoutesFromParent(
+    component_testing::RealmBuilder& realm_builder,
+    std::string_view child_name) {
+  return realm_builder.AddRoute(component_testing::Route{
+      .capabilities = {component_testing::Protocol{
+          fuchsia::logger::LogSink::Name_}},
+      .source = component_testing::ParentRef{},
+      .targets = {component_testing::ChildRef{child_name}}});
+}
+
+// static
+component_testing::RealmBuilder&
+CastRunnerLauncherV2::AddVulkanRoutesFromParent(
+    component_testing::RealmBuilder& realm_builder,
+    std::string_view child_name) {
+  return realm_builder.AddRoute(component_testing::Route{
+      .capabilities =
+          {component_testing::Protocol{fuchsia::sysmem::Allocator::Name_},
+           component_testing::Protocol{
+               fuchsia::tracing::provider::Registry::Name_},
+           component_testing::Protocol{"fuchsia.vulkan.loader.Loader"}},
+      .source = component_testing::ParentRef{},
+      .targets = {component_testing::ChildRef{child_name}}});
+}
+
+// static
+component_testing::RealmBuilder& CastRunnerLauncherV2::AddFontService(
+    component_testing::RealmBuilder& realm_builder,
+    std::string_view child_name) {
+  static constexpr char kFontsService[] = "isolated_fonts";
+  static constexpr char kFontsUrl[] =
+      "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cm";
+  realm_builder.AddChild(kFontsService, kFontsUrl);
+  return AddSyslogRoutesFromParent(realm_builder, kFontsService)
+      .AddRoute(component_testing::Route{
+          .capabilities =
+              {
+                  component_testing::Directory{.name = "config-data",
+                                               .subdir = "fonts"},
+              },
+          .source = component_testing::ParentRef{},
+          .targets = {component_testing::ChildRef{kFontsService}}})
+      .AddRoute(component_testing::Route{
+          .capabilities =
+              {
+                  component_testing::Protocol{fuchsia::fonts::Provider::Name_},
+              },
+          .source = component_testing::ChildRef{kFontsService},
+          .targets = {component_testing::ChildRef{child_name}}});
+}
+
+// static
+component_testing::RealmBuilder& CastRunnerLauncherV2::AddTestUiStack(
+    component_testing::RealmBuilder& realm_builder,
+    std::string_view child_name) {
+  static constexpr char kTestUiStackService[] = "test_ui_stack";
+  static constexpr char kTestUiStackUrl[] =
+      "fuchsia-pkg://fuchsia.com/test-ui-stack#meta/test-ui-stack.cm";
+  realm_builder.AddChild(kTestUiStackService, kTestUiStackUrl);
+  AddSyslogRoutesFromParent(realm_builder, kTestUiStackService);
+  return AddVulkanRoutesFromParent(realm_builder, kTestUiStackService)
+      .AddRoute(component_testing::Route{
+          .capabilities =
+              {
+                  component_testing::Protocol{
+                      "fuchsia.scheduler.ProfileProvider"},
+              },
+          .source = component_testing::ParentRef(),
+          .targets = {component_testing::ChildRef{kTestUiStackService}}})
+      .AddRoute(component_testing::Route{
+          .capabilities =
+              {
+                  component_testing::Protocol{
+                      fuchsia::ui::composition::Allocator::Name_},
+                  component_testing::Protocol{
+                      fuchsia::ui::scenic::Scenic::Name_},
+              },
+          .source = component_testing::ChildRef{kTestUiStackService},
+          .targets = {component_testing::ChildRef{child_name}}});
+}
+
 }  // namespace test
diff --git a/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.h b/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.h
index 08431ef..bb1d65d 100644
--- a/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.h
+++ b/fuchsia_web/runners/cast/test/cast_runner_launcher_v2.h
@@ -9,6 +9,7 @@
 #include <lib/sys/cpp/service_directory.h>
 
 #include <memory>
+#include <string_view>
 
 #include "fuchsia_web/runners/cast/test/cast_runner_features.h"
 #include "fuchsia_web/runners/cast/test/fake_feedback_service.h"
@@ -30,6 +31,34 @@
   std::unique_ptr<sys::ServiceDirectory> StartCastRunner();
 
  private:
+  // Adds routes to the child component named `child_name` to satisfy that
+  // child's use of syslog/client.shard.cml.
+  static component_testing::RealmBuilder& AddSyslogRoutesFromParent(
+      component_testing::RealmBuilder& realm_builder,
+      std::string_view child_name);
+
+  // Adds routes to the child component named `child_name` to satisfy that
+  // child's use of vulkan/client.shard.cml.
+  static component_testing::RealmBuilder& AddVulkanRoutesFromParent(
+      component_testing::RealmBuilder& realm_builder,
+      std::string_view child_name);
+
+  // Adds fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cm as a child in the realm,
+  // routes all of its required capabilities from parent, and routes its
+  // fuchsia.fonts.Provider protocol to the child component named `child_name`
+  // in the realm.
+  static component_testing::RealmBuilder& AddFontService(
+      component_testing::RealmBuilder& realm_builder,
+      std::string_view child_name);
+
+  // Adds fuchsia-pkg://fuchsia.com/test-ui-stack#meta/test-ui-stack.cm as a
+  // child in the realm, routes all of its required capabilities from parent,
+  // and routes various of its protocols to the child component named
+  // `child_name` in the realm.
+  static component_testing::RealmBuilder& AddTestUiStack(
+      component_testing::RealmBuilder& realm_builder,
+      std::string_view child_name);
+
   const CastRunnerFeatures runner_features_;
   absl::optional<FakeFeedbackService> fake_feedback_service_;
   absl::optional<media::FakeAudioDeviceEnumeratorLocalComponent>
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index ef9b89dd..79f2d310 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -1808,11 +1808,6 @@
     short_name: "builder-perf"
   }
   builders {
-    name: "buildbucket/luci.chrome.ci/fuchsia-builder-perf-x64"
-    category: "fuchsia ci"
-    short_name: "builder-perf-x64"
-  }
-  builders {
     name: "buildbucket/luci.chrome.ci/fuchsia-x64"
     category: "fuchsia ci"
     short_name: "x64-chrome"
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index cdb0f56..05906bf 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -121,7 +121,6 @@
     ("fuchsia-fyi-atlas", "hardware", "atl"),
     ("fuchsia-fyi-sherlock", "hardware", "slk"),
     ("fuchsia-builder-perf-fyi", "fuchsia ci", "builder-perf"),
-    ("fuchsia-builder-perf-x64", "fuchsia ci", "builder-perf-x64"),
     ("fuchsia-perf-fyi", "hardware", "ast-perf"),
     ("fuchsia-perf-atlas-fyi", "hardware", "atl-perf"),
     ("fuchsia-perf-sherlock-fyi", "hardware", "slk-perf"),
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 9ce585e..c5a249c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -440,6 +440,7 @@
 <translation id="473775607612524610">আপডেট করুন</translation>
 <translation id="4747097190499141774">পাসফ্রেজ এনক্রিপশনে Google Pay-এর পেমেন্ট পদ্ধতি ও ঠিকানা অন্তর্ভুক্ত থাকে না। আপনার পাসফ্রেজ আছে এমন কেউই শুধু আপনার এনক্রিপ্ট করা ডেটা পড়তে পারবেন। পাসফ্রেজ Google-এ পাঠানো হয় না বা Google তা সংরক্ষণ করে না। আপনার পাসফ্রেজ ভুলে গেলে বা এই সেটিং পরিবর্তন করতে চাইলে, আপনাকে সিঙ্ক রিসেট করতে হবে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
 <translation id="4751645464639803239">নতুন ছদ্মবেশী ট্যাব খুলুন</translation>
+<translation id="4766112107778026136">ডিসকভার ও ফলো</translation>
 <translation id="4775879719735953715">ডিফল্ট ব্রাউজার</translation>
 <translation id="4778644898150334464">অন্য পাসওয়ার্ড ব্যবহার করুন</translation>
 <translation id="478808905805139173">ছদ্মবেশী ট্যাবে খুলবেন?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index 433c4064..956bce8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -440,6 +440,7 @@
 <translation id="473775607612524610">განახლება</translation>
 <translation id="4747097190499141774">საიდუმლო ფრაზით დაშიფვრა არ მოიცავს Google Pay-ში შენახულ გადახდის მეთოდებსა და მისამართებს. თქვენი დაშიფრული მონაცემების წაკითხვა შეუძლია მხოლოდ მას, ვინც იცის თქვენი საიდუმლო ფრაზა. საიდუმლო ფრაზა არ იგზავნება Google-ში და არ ინახება მის მიერ. საიდუმლო ფრაზის დავიწყების ან ამ პარამეტრის შეცვლის შემთხვევაში, სინქრონიზაციის გადაყენება მოგიწევთ. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
 <translation id="4751645464639803239">ახალი ინკოგნიტო ჩანართი</translation>
+<translation id="4766112107778026136">Discover და თვალმიდევნებული</translation>
 <translation id="4775879719735953715">ნაგულისხმევი ბრაუზერი</translation>
 <translation id="4778644898150334464">სხვა პაროლის გამოყენება</translation>
 <translation id="478808905805139173">გსურთ ინკოგნიტო ფანჯარაში გახსნა?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index b17d84a..0ab1d03 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -440,6 +440,7 @@
 <translation id="473775607612524610">Actualizează</translation>
 <translation id="4747097190499141774">Criptarea expresiei de acces nu include metodele de plată și adresele din Google Pay. Numai un utilizator care are expresia de acces poate citi datele tale criptate. Google nu primește și nu stochează expresia ta de acces. Dacă uiți expresia de acces sau vrei să modifici această setare, va trebui să resetezi sincronizarea. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="4751645464639803239">Filă incognito nouă</translation>
+<translation id="4766112107778026136">Descoperă și urmărește</translation>
 <translation id="4775879719735953715">Browser prestabilit</translation>
 <translation id="4778644898150334464">Folosește altă parolă</translation>
 <translation id="478808905805139173">Deschizi în modul incognito?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 1caf463b..fa8041a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -440,6 +440,7 @@
 <translation id="473775607612524610">Aktualizovať</translation>
 <translation id="4747097190499141774">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. Šifrované údaje si môže prečítať iba používateľ s prístupovou frázou. Prístupová fráza sa neodosiela do Googlu ani sa v ňom neuchováva. Ak ju zabudnete, budete musieť resetovať synchronizáciu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
 <translation id="4751645464639803239">Nová karta inkognito</translation>
+<translation id="4766112107778026136">Objaviť a sledovanie</translation>
 <translation id="4775879719735953715">Predvolený prehliadač</translation>
 <translation id="4778644898150334464">Použiť iné heslo</translation>
 <translation id="478808905805139173">Chcete otvoriť v režime inkognito?</translation>
diff --git a/ios/chrome/browser/application_context_impl.mm b/ios/chrome/browser/application_context_impl.mm
index 0b655c8..16419492 100644
--- a/ios/chrome/browser/application_context_impl.mm
+++ b/ios/chrome/browser/application_context_impl.mm
@@ -464,7 +464,7 @@
 PromosManager* ApplicationContextImpl::GetPromosManager() {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (IsFullscreenPromosManagerEnabled() && !promos_manager_) {
-    promos_manager_ = std::make_unique<PromosManager>();
+    promos_manager_ = std::make_unique<PromosManager>(GetLocalState());
   }
   return promos_manager_.get();
 }
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm
index 012704f..c91fb75 100644
--- a/ios/chrome/browser/autofill/automation/automation_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -25,7 +25,6 @@
 namespace {
 
 static const char kAutofillAutomationSwitch[] = "autofillautomation";
-static const int kRecipeRetryLimit = 5;
 
 // Private helper method for accessing app interface method.
 NSError* SetAutofillAutomationProfile(const std::string& profile_json_string) {
@@ -136,58 +135,13 @@
   }
 }
 
-// Override the XCTestCase method that records a failure due to an exception.
-// This way it can be chosen whether to report failures during multiple runs of
-// a recipe, and only fail the test if all the runs of the recipe fail.
-// Will still print the failure even when it is not reported.
-- (void)recordFailureWithDescription:(NSString*)description
-                              inFile:(NSString*)filePath
-                              atLine:(NSUInteger)lineNumber
-                            expected:(BOOL)expected {
-  if (self->_shouldRecordException) {
-    [super recordFailureWithDescription:description
-                                 inFile:filePath
-                                 atLine:lineNumber
-                               expected:expected];
-  } else {
-    NSLog(@"%@", description);
-  }
-}
-
-// Runs the recipe provided multiple times.
-// If any of the runs succeed, the test will be reported as a success.
+// Runs the recipe provided.
 - (void)testActions {
-  for (int i = 0; i < kRecipeRetryLimit; i++) {
-    // Only actually report the exception on the last run.
-    // This is because any exception reporting will fail the test.
-    NSLog(@"================================================================");
-    NSLog(@"RECIPE ATTEMPT %d of %d for %@", (i + 1), kRecipeRetryLimit,
-          base::SysUTF8ToNSString(_startURL.GetContent()));
+  [ChromeEarlGrey loadURL:_startURL];
 
-    self->_shouldRecordException = (i == (kRecipeRetryLimit - 1));
-
-    if ([self runActionsOnce]) {
-      return;
-    }
+  for (AutomationAction* action in _actions) {
+    [action execute];
   }
 }
 
-// Tries running the recipe against the target website once.
-// Returns true if the entire recipe succeeds.
-// Returns false if an assertion is raised due to a failure.
-- (bool)runActionsOnce {
-  @try {
-    // Load the initial page of the recipe.
-    [ChromeEarlGrey loadURL:_startURL];
-
-    for (AutomationAction* action in _actions) {
-      [action execute];
-    }
-  } @catch (NSException* e) {
-    return false;
-  }
-
-  return true;
-}
-
 @end
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index f36aebf..987be084 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -906,6 +906,10 @@
      flag_descriptions::kEnableUnicornAccountSupportDescription,
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(signin::kEnableUnicornAccountSupport)},
+    {"ios-webpage-intent-annotations",
+     flag_descriptions::kEnableWebPageAnnotationsName,
+     flag_descriptions::kEnableWebPageAnnotationsDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(web::features::kEnableWebPageAnnotations)},
     {"leak-detection-unauthenticated",
      flag_descriptions::kLeakDetectionUnauthenticatedName,
      flag_descriptions::kLeakDetectionUnauthenticatedDescription,
@@ -1087,9 +1091,9 @@
                                     kTrendingQueriesModuleVariations,
                                     "TrendingQueriesModule")},
     {"autofill-parse-iban-fields",
-     flag_descriptions::kAutofillParseIbanFieldsName,
-     flag_descriptions::kAutofillParseIbanFieldsDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(autofill::features::kAutofillParseIbanFields)},
+     flag_descriptions::kAutofillParseIBANFieldsName,
+     flag_descriptions::kAutofillParseIBANFieldsDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillParseIBANFields)},
     {"autofill-enable-new-card-unmask-prompt-view",
      flag_descriptions::kAutofillEnableNewCardUnmaskPromptViewName,
      flag_descriptions::kAutofillEnableNewCardUnmaskPromptViewDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index d587ce2..e1e487c 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -76,8 +76,8 @@
     "Delay between the different fields of a form being autofilled. In "
     "milliseconds.";
 
-const char kAutofillParseIbanFieldsName[] = "Parse IBAN fields in forms";
-const char kAutofillParseIbanFieldsDescription[] =
+const char kAutofillParseIBANFieldsName[] = "Parse IBAN fields in forms";
+const char kAutofillParseIBANFieldsDescription[] =
     "When enabled, Autofill will attempt to find International Bank Account "
     "Number (IBAN) fields when parsing forms.";
 
@@ -315,6 +315,11 @@
 const char kEnableUnicornAccountSupportDescription[] =
     "Allows users to sign-in with their Unicorn account.";
 
+const char kEnableWebPageAnnotationsName[] = "Enable Web Page Intent Detection";
+const char kEnableWebPageAnnotationsDescription[] =
+    "Prototype to detect and highlight data with possible intent in a web "
+    "page.";
+
 const char kEnableShortenedPasswordAutoFillInstructionName[] =
     "Enable shortened instructions to turn on Password AutoFill for Chrome";
 const char kEnableShortenedPasswordAutoFillInstructionDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index a67b8f7..8e0fb0f 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -66,8 +66,8 @@
 extern const char kAutofillIOSDelayBetweenFieldsDescription[];
 
 // Title and description for the flag to parse IBAN fields in Autofill.
-extern const char kAutofillParseIbanFieldsName[];
-extern const char kAutofillParseIbanFieldsDescription[];
+extern const char kAutofillParseIBANFieldsName[];
+extern const char kAutofillParseIBANFieldsDescription[];
 
 // Title and description for the flag to parse promo code fields in Autofill.
 extern const char kAutofillParseMerchantPromoCodeFieldsName[];
@@ -330,6 +330,11 @@
 extern const char kFullscreenPromosManagerName[];
 extern const char kFullscreenPromosManagerDescription[];
 
+// Title and description for the flag to enable web page detected intents
+// annotations.
+extern const char kEnableWebPageAnnotationsName[];
+extern const char kEnableWebPageAnnotationsDescription[];
+
 // Title and description for the command line switch used to determine the
 // active fullscreen viewport adjustment mode.
 extern const char kFullscreenSmoothScrollingName[];
diff --git a/ios/chrome/browser/follow/BUILD.gn b/ios/chrome/browser/follow/BUILD.gn
index 78670e4..0431fa52 100644
--- a/ios/chrome/browser/follow/BUILD.gn
+++ b/ios/chrome/browser/follow/BUILD.gn
@@ -70,6 +70,25 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("service") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "follow_configuration.h",
+    "follow_configuration.mm",
+    "follow_service.h",
+    "follow_service_observer.h",
+    "follow_service_observer.mm",
+    "followed_web_site.h",
+    "followed_web_site.mm",
+    "web_page_urls.h",
+    "web_page_urls.mm",
+  ]
+  deps = [
+    "//base",
+    "//components/keyed_service/core",
+  ]
+}
+
 source_set("unit_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
diff --git a/ios/chrome/browser/follow/follow_configuration.h b/ios/chrome/browser/follow/follow_configuration.h
new file mode 100644
index 0000000..0710f76a
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_configuration.h
@@ -0,0 +1,20 @@
+// Copyright 2022 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_FOLLOW_FOLLOW_CONFIGURATION_H_
+#define IOS_CHROME_BROWSER_FOLLOW_FOLLOW_CONFIGURATION_H_
+
+#import <Foundation/Foundation.h>
+
+class DiscoverFeedService;
+
+// Configuration object used by the FollowService.
+@interface FollowConfiguration : NSObject
+
+// DiscoverFeedService used by FollowService.
+@property(nonatomic, assign) DiscoverFeedService* feedService;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_CONFIGURATION_H_
diff --git a/ios/chrome/browser/follow/follow_configuration.mm b/ios/chrome/browser/follow/follow_configuration.mm
new file mode 100644
index 0000000..f997512
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_configuration.mm
@@ -0,0 +1,13 @@
+// Copyright 2022 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/follow/follow_configuration.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation FollowConfiguration
+
+@end
diff --git a/ios/chrome/browser/follow/follow_service.h b/ios/chrome/browser/follow/follow_service.h
new file mode 100644
index 0000000..0d0633c
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_service.h
@@ -0,0 +1,70 @@
+// Copyright 2022 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_FOLLOW_FOLLOW_SERVICE_H_
+#define IOS_CHROME_BROWSER_FOLLOW_FOLLOW_SERVICE_H_
+
+#import <Foundation/Foundation.h>
+
+#include "base/callback_forward.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "ios/chrome/browser/follow/followed_web_site.h"
+#include "ios/chrome/browser/follow/web_page_urls.h"
+
+class FollowServiceObserver;
+
+// Represents the result of an operation (follow or unfollow).
+enum class FollowResult {
+  Success,
+  Failure,
+};
+
+// Represents the source of the follow request.
+enum class FollowSource {
+  OverflowMenu,
+  PopupMenu,
+  Management,
+  Retry,
+  Undo,
+};
+
+// FollowService allows interaction with websites. It allows querying for
+// the channels that are followed, follow new channels, unfollow channels and
+// to register observer to be notified of change to the list of channels.
+class FollowService : public KeyedService {
+ public:
+  // Callbacks invoked when an operation completes.
+  using ResultCallback =
+      base::OnceCallback<void(FollowResult result, FollowedWebSite* web_site)>;
+
+  // Returns if a followed website corresponds to `web_page_urls`.
+  virtual bool IsWebSiteFollowed(WebPageURLs* web_page_urls) = 0;
+
+  // If a recommended website corresponds to `web_page_urls`, returns
+  // the URL identifier for the website. Returns nil otherwise.
+  virtual NSURL* GetRecommendedSiteURL(WebPageURLs* web_page_urls) = 0;
+
+  // Returns a list of all followed websites.
+  virtual NSArray<FollowedWebSite*>* GetFollowedWebSites() = 0;
+
+  // Follows the website associated with `web_page_urls` and invokes
+  // `callback` with the operation result. The callback will not be
+  // invoked if the website is already followed.
+  virtual void FollowWebSite(WebPageURLs* web_page_urls,
+                             FollowSource source,
+                             ResultCallback callback) = 0;
+
+  // Unfollows the website associated with `web_page_urls` and invokes
+  // `callback` with the operation result. The callback will not be
+  // invoked if the website is not yet followed.
+  virtual void UnfollowWebSite(WebPageURLs* web_page_urls,
+                               FollowSource source,
+                               ResultCallback callback) = 0;
+
+  // Adds/Removes `observer`.
+  virtual void AddObserver(FollowServiceObserver* observer) = 0;
+  virtual void RemoveObserver(FollowServiceObserver* observer) = 0;
+};
+
+#endif  // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_SERVICE_H_
diff --git a/ios/chrome/browser/follow/follow_service_observer.h b/ios/chrome/browser/follow/follow_service_observer.h
new file mode 100644
index 0000000..c954a5c
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_service_observer.h
@@ -0,0 +1,28 @@
+// Copyright 2022 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_FOLLOW_FOLLOW_SERVICE_OBSERVER_H_
+#define IOS_CHROME_BROWSER_FOLLOW_FOLLOW_SERVICE_OBSERVER_H_
+
+#include "base/observer_list_types.h"
+#include "ios/chrome/browser/follow/followed_web_site.h"
+
+// Observer class notified about FollowService changes.
+class FollowServiceObserver : public base::CheckedObserver {
+ public:
+  FollowServiceObserver();
+
+  FollowServiceObserver(const FollowServiceObserver&) = delete;
+  FollowServiceObserver& operator=(const FollowServiceObserver&) = delete;
+
+  ~FollowServiceObserver() override;
+
+  // Invoked when a website is followed.
+  virtual void OnWebSiteFollowed(FollowedWebSite* web_site) = 0;
+
+  // Invoked when a website is unfollowed.
+  virtual void OnWebSiteUnfollowed(FollowedWebSite* web_site) = 0;
+};
+
+#endif  // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_SERVICE_OBSERVER_H_
diff --git a/ios/chrome/browser/follow/follow_service_observer.mm b/ios/chrome/browser/follow/follow_service_observer.mm
new file mode 100644
index 0000000..ed196df
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_service_observer.mm
@@ -0,0 +1,20 @@
+// Copyright 2022 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/follow/follow_service_observer.h"
+
+#import <ostream>
+
+#import "base/check.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+FollowServiceObserver::FollowServiceObserver() = default;
+
+FollowServiceObserver::~FollowServiceObserver() {
+  DCHECK(!IsInObserverList())
+      << "FollowServiceObserver needs to be unregistered before destruction!";
+}
diff --git a/ios/chrome/browser/follow/followed_web_site.h b/ios/chrome/browser/follow/followed_web_site.h
new file mode 100644
index 0000000..8f0f697
--- /dev/null
+++ b/ios/chrome/browser/follow/followed_web_site.h
@@ -0,0 +1,37 @@
+// Copyright 2022 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_FOLLOW_FOLLOWED_WEB_SITE_H_
+#define IOS_CHROME_BROWSER_FOLLOW_FOLLOWED_WEB_SITE_H_
+
+#import <Foundation/Foundation.h>
+
+// Represents a followed website.
+@interface FollowedWebSite : NSObject
+
+// Convenience initializer that initializes all properties.
+- (instancetype)initWithTitle:(NSString*)title
+                   webPageURL:(NSURL*)webPageURL
+                   faviconURL:(NSURL*)faviconURL
+                       RSSURL:(NSURL*)RSSURL
+                    available:(BOOL)available;
+
+// Title of the website.
+@property(nonatomic, copy) NSString* title;
+
+// URL of the website page.
+@property(nonatomic, strong) NSURL* webPageURL;
+
+// URL of the website favicon.
+@property(nonatomic, strong) NSURL* faviconURL;
+
+// URL of the website rss link.
+@property(nonatomic, strong) NSURL* RSSURL;
+
+// YES if the website is available.
+@property(nonatomic, assign) BOOL available;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_FOLLOW_FOLLOWED_WEB_SITE_H_
diff --git a/ios/chrome/browser/follow/followed_web_site.mm b/ios/chrome/browser/follow/followed_web_site.mm
new file mode 100644
index 0000000..2f1e853
--- /dev/null
+++ b/ios/chrome/browser/follow/followed_web_site.mm
@@ -0,0 +1,57 @@
+// Copyright 2022 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/follow/followed_web_site.h"
+
+#import "base/check.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation FollowedWebSite
+
+- (instancetype)initWithTitle:(NSString*)title
+                   webPageURL:(NSURL*)webPageURL
+                   faviconURL:(NSURL*)faviconURL
+                       RSSURL:(NSURL*)RSSURL
+                    available:(BOOL)available {
+  if ((self = [super init])) {
+    _title = [title copy];
+    _webPageURL = webPageURL;
+    _faviconURL = faviconURL;
+    _RSSURL = RSSURL;
+    _available = available;
+  }
+  return self;
+}
+
+#pragma mark - NSObject
+
+- (BOOL)isEqual:(id)object {
+  if (self == object)
+    return YES;
+
+  if (![object isMemberOfClass:[FollowedWebSite class]])
+    return NO;
+
+  return [self isEqualToFollowedWebSite:object];
+}
+
+- (NSUInteger)hash {
+  return [self.title hash] ^ [self.webPageURL hash] ^ [self.faviconURL hash] ^
+         [self.RSSURL hash];
+}
+
+#pragma mark - Private
+
+- (BOOL)isEqualToFollowedWebSite:(FollowedWebSite*)channel {
+  DCHECK(channel);
+  return [self.title isEqualToString:channel.title] &&
+         [self.webPageURL isEqual:channel.webPageURL] &&
+         [self.faviconURL isEqual:channel.faviconURL] &&
+         [self.RSSURL isEqual:channel.RSSURL];
+}
+
+@end
diff --git a/ios/chrome/browser/follow/web_page_urls.h b/ios/chrome/browser/follow/web_page_urls.h
new file mode 100644
index 0000000..0fc21e0
--- /dev/null
+++ b/ios/chrome/browser/follow/web_page_urls.h
@@ -0,0 +1,28 @@
+// Copyright 2022 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_FOLLOW_WEB_PAGE_URLS_H_
+#define IOS_CHROME_BROWSER_FOLLOW_WEB_PAGE_URLS_H_
+
+#import <Foundation/Foundation.h>
+
+// Stores the URL and RSS URLs that are used to identify a website.
+@interface WebPageURLs : NSObject
+
+// Designated initializer with `URL` and `RSSURLs` (can be empty).
+- (instancetype)initWithURL:(NSURL*)URL
+                    RSSURLs:(NSArray<NSURL*>*)RSSURLs NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+// The URL of the web page.
+@property(nonatomic, strong, readonly) NSURL* URL;
+
+// The list of RSS links obtained from the web page. If available, they
+// are usually listed inside the HEAD html tag.
+@property(nonatomic, strong, readonly) NSArray<NSURL*>* RSSURLs;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_FOLLOW_WEB_PAGE_URLS_H_
diff --git a/ios/chrome/browser/follow/web_page_urls.mm b/ios/chrome/browser/follow/web_page_urls.mm
new file mode 100644
index 0000000..1bd046ef5
--- /dev/null
+++ b/ios/chrome/browser/follow/web_page_urls.mm
@@ -0,0 +1,21 @@
+// Copyright 2022 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/follow/web_page_urls.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation WebPageURLs
+
+- (instancetype)initWithURL:(NSURL*)URL RSSURLs:(NSArray<NSURL*>*)RSSURLs {
+  if ((self = [super init])) {
+    _URL = URL;
+    _RSSURLs = [RSSURLs copy];
+  }
+  return self;
+}
+
+@end
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm
index 1dd30f5..ba8516f0 100644
--- a/ios/chrome/browser/passwords/password_controller_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -1339,28 +1339,6 @@
   EXPECT_FALSE(form_manager->IsPasswordUpdate());
 }
 
-// Check that if the PasswordController is told (by the PasswordManagerClient)
-// that this is Incognito, it won't enable password generation.
-TEST_F(PasswordControllerTestSimple, IncognitoPasswordGenerationDisabled) {
-  PasswordFormManager::set_wait_for_server_predictions_for_filling(false);
-
-  auto client =
-      std::make_unique<NiceMock<MockPasswordManagerClient>>(store_.get());
-  weak_client_ = client.get();
-
-  EXPECT_CALL(*weak_client_->GetPasswordFeatureManager(), IsGenerationEnabled)
-      .WillRepeatedly(Return(true));
-  EXPECT_CALL(*weak_client_, IsIncognito).WillRepeatedly(Return(true));
-
-  UniqueIDDataTabHelper::CreateForWebState(&web_state_);
-  passwordController_ =
-      [[PasswordController alloc] initWithWebState:&web_state_
-                                            client:std::move(client)];
-
-  EXPECT_FALSE(
-      passwordController_.passwordManagerDriver->GetPasswordGenerationHelper());
-}
-
 // Checks that when the user set a focus on a field of a password form which was
 // not sent to the store then the request the the store is sent.
 TEST_F(PasswordControllerTest, SendingToStoreDynamicallyAddedFormsOnFocus) {
diff --git a/ios/chrome/browser/promos_manager/BUILD.gn b/ios/chrome/browser/promos_manager/BUILD.gn
index 1133434..258c3fc8 100644
--- a/ios/chrome/browser/promos_manager/BUILD.gn
+++ b/ios/chrome/browser/promos_manager/BUILD.gn
@@ -8,7 +8,12 @@
     "promos_manager.mm",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
-  deps = [ ":features" ]
+  deps = [
+    ":features",
+    "//base",
+    "//components/prefs",
+    "//ios/chrome/browser:pref_names",
+  ]
 }
 
 source_set("features") {
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h
index 0e9c73a..9c75eeb 100644
--- a/ios/chrome/browser/promos_manager/promos_manager.h
+++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -5,13 +5,30 @@
 #ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
 #define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
 
+#import "base/values.h"
+#import "components/prefs/pref_service.h"
+
 // Centralized promos manager for coordinating and scheduling the display of
 // app-wide promos. Feature teams interested in displaying promos should
 // leverage this manager.
 class PromosManager {
  public:
-  PromosManager();
+  explicit PromosManager(PrefService* local_state);
   ~PromosManager();
+
+  // Initialize the Promos Manager by restoring state from Prefs. Must be called
+  // after creation and before any other operation.
+  void Init();
+
+ private:
+  // Weak pointer to the local state prefs store.
+  const raw_ptr<PrefService> local_state_;
+
+  // base::Value::List of active promos.
+  base::Value::List active_promos_;
+
+  // base::Value::Dict of the promo impression history.
+  base::Value::Dict impression_history_;
 };
 
 #endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm
index dd2d97a..e67ecc6 100644
--- a/ios/chrome/browser/promos_manager/promos_manager.mm
+++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -4,10 +4,37 @@
 
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
 
+#import <iostream>  // TODO(crbug.com/1347825): Remove import
+
+#import "base/json/json_writer.h"  // TODO(crbug.com/1347825): Remove import
+#import "base/values.h"
+#import "components/prefs/pref_service.h"
+#import "ios/chrome/browser/pref_names.h"
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
 #pragma mark - PromosManager
-PromosManager::PromosManager() = default;
+
+#pragma mark - Constructor/Destructor
+
+PromosManager::PromosManager(PrefService* local_state)
+    : local_state_(local_state) {
+  DCHECK(local_state_);
+}
 PromosManager::~PromosManager() = default;
+
+#pragma mark - Public methods
+
+void PromosManager::Init() {
+  DCHECK(local_state_);
+
+  const base::Value::List& stored_active_promos =
+      local_state_->GetValueList(prefs::kIosPromosManagerActivePromos);
+  const base::Value::Dict& stored_impression_history =
+      local_state_->GetValueDict(prefs::kIosPromosManagerImpressionHistory);
+
+  active_promos_ = stored_active_promos.Clone();
+  impression_history_ = stored_impression_history.Clone();
+}
diff --git a/ios/chrome/browser/providers/BUILD.gn b/ios/chrome/browser/providers/BUILD.gn
index 53ab3c52..c3f00b8 100644
--- a/ios/chrome/browser/providers/BUILD.gn
+++ b/ios/chrome/browser/providers/BUILD.gn
@@ -41,6 +41,7 @@
     "//ios/chrome/browser/providers/branded_images:chromium_branded_images",
     "//ios/chrome/browser/providers/context_menu:chromium_context_menu",
     "//ios/chrome/browser/providers/discover_feed:chromium_discover_feed",
+    "//ios/chrome/browser/providers/follow:chromium_follow",
     "//ios/chrome/browser/providers/lens:chromium_lens",
     "//ios/chrome/browser/providers/mailto_handler:chromium_mailto_handler",
     "//ios/chrome/browser/providers/modals:chromium_modals",
diff --git a/ios/chrome/browser/providers/follow/BUILD.gn b/ios/chrome/browser/providers/follow/BUILD.gn
new file mode 100644
index 0000000..958ea7ce
--- /dev/null
+++ b/ios/chrome/browser/providers/follow/BUILD.gn
@@ -0,0 +1,12 @@
+# Copyright 2022 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.
+
+source_set("chromium_follow") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [ "chromium_follow.mm" ]
+  deps = [
+    "//base",
+    "//ios/public/provider/chrome/browser/follow:follow_api",
+  ]
+}
diff --git a/ios/chrome/browser/providers/follow/chromium_follow.mm b/ios/chrome/browser/providers/follow/chromium_follow.mm
new file mode 100644
index 0000000..7d41a12c
--- /dev/null
+++ b/ios/chrome/browser/providers/follow/chromium_follow.mm
@@ -0,0 +1,93 @@
+// Copyright 2022 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/public/provider/chrome/browser/follow/follow_api.h"
+
+#import "base/threading/sequenced_task_runner_handle.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace ios {
+namespace provider {
+namespace {
+
+// Null FollowService used in Chromium.
+class ChromiumFollowService final : public FollowService {
+ public:
+  // FollowService implementation.
+  bool IsWebSiteFollowed(WebPageURLs* web_page_urls) final;
+  NSURL* GetRecommendedSiteURL(WebPageURLs* web_page_urls) final;
+  NSArray<FollowedWebSite*>* GetFollowedWebSites() final;
+  void FollowWebSite(WebPageURLs* web_page_urls,
+                     FollowSource source,
+                     ResultCallback callback) final;
+  void UnfollowWebSite(WebPageURLs* web_page_urls,
+                       FollowSource source,
+                       ResultCallback callback) final;
+  void AddObserver(FollowServiceObserver* observer) final;
+  void RemoveObserver(FollowServiceObserver* observer) final;
+};
+
+bool ChromiumFollowService::IsWebSiteFollowed(WebPageURLs* web_page_urls) {
+  return false;
+}
+
+NSURL* ChromiumFollowService::GetRecommendedSiteURL(
+    WebPageURLs* web_page_urls) {
+  return nil;
+}
+
+NSArray<FollowedWebSite*>* ChromiumFollowService::GetFollowedWebSites() {
+  return @[];
+}
+
+void ChromiumFollowService::FollowWebSite(WebPageURLs* web_page_urls,
+                                          FollowSource source,
+                                          ResultCallback callback) {
+  FollowedWebSite* web_channel =
+      [[FollowedWebSite alloc] initWithTitle:@""
+                                  webPageURL:web_page_urls.URL
+                                  faviconURL:nil
+                                      RSSURL:[web_page_urls.RSSURLs firstObject]
+                                   available:NO];
+
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), FollowResult::Failure, web_channel));
+}
+
+void ChromiumFollowService::UnfollowWebSite(WebPageURLs* web_page_urls,
+                                            FollowSource source,
+                                            ResultCallback callback) {
+  FollowedWebSite* web_channel =
+      [[FollowedWebSite alloc] initWithTitle:@""
+                                  webPageURL:web_page_urls.URL
+                                  faviconURL:nil
+                                      RSSURL:[web_page_urls.RSSURLs firstObject]
+                                   available:NO];
+
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), FollowResult::Failure, web_channel));
+}
+
+void ChromiumFollowService::AddObserver(FollowServiceObserver* observer) {
+  // Do nothing.
+}
+
+void ChromiumFollowService::RemoveObserver(FollowServiceObserver* observer) {
+  // Do nothing.
+}
+
+}  // anonymous namespace
+
+std::unique_ptr<FollowService> CreateFollowService(
+    FollowConfiguration* configuration) {
+  return std::make_unique<ChromiumFollowService>();
+}
+
+}  // namespace provider
+}  // namespace ios
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h
index bf45917..45d0a07 100644
--- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h
+++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h
@@ -10,6 +10,10 @@
 #import "ios/chrome/browser/signin/constants.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 
+namespace signin_metrics {
+enum ProfileSignout : int;
+}  // namespace signin_metrics
+
 class Browser;
 @class SignoutActionSheetCoordinator;
 
@@ -43,6 +47,8 @@
                                    browser:(Browser*)browser
                                       rect:(CGRect)rect
                                       view:(UIView*)view
+                                withSource:(signin_metrics::ProfileSignout)
+                                               signout_source_metric
     NS_DESIGNATED_INITIALIZER;
 
 // The delegate.
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm
index ab6baae0..14ae5a00b 100644
--- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm
@@ -46,6 +46,8 @@
   CGRect _rect;
   // View for the popovert alert.
   __weak UIView* _view;
+  // Source of the sign-out action. For histogram if the sign-out occurs.
+  signin_metrics::ProfileSignout _signout_source_metric;
 }
 
 // Service for managing identity authentication.
@@ -63,11 +65,14 @@
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
                                    browser:(Browser*)browser
                                       rect:(CGRect)rect
-                                      view:(UIView*)view {
+                                      view:(UIView*)view
+                                withSource:(signin_metrics::ProfileSignout)
+                                               signout_source_metric {
   self = [super initWithBaseViewController:viewController browser:browser];
   if (self) {
     _rect = rect;
     _view = view;
+    _signout_source_metric = signout_source_metric;
   }
   return self;
 }
@@ -288,12 +293,13 @@
   __weak SignoutActionSheetCoordinator* weakSelf = self;
   self.authenticationService->SignOut(
       signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, forceClearData, ^{
-        if (!weakSelf) {
+        __strong SignoutActionSheetCoordinator* strongSelf = weakSelf;
+        if (!strongSelf) {
           return;
         }
-        [weakSelf.delegate
-            signoutActionSheetCoordinatorAllowUserInteraction:weakSelf];
-        weakSelf.completion(YES);
+        [strongSelf.delegate
+            signoutActionSheetCoordinatorAllowUserInteraction:strongSelf];
+        strongSelf.completion(YES);
       });
   // Get UMA metrics on the usage of different options for signout available
   // for users with non-managed accounts.
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm
index ce0b078..1659c408 100644
--- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm
@@ -89,7 +89,9 @@
         initWithBaseViewController:view_controller_
                            browser:browser_.get()
                               rect:view_controller_.view.frame
-                              view:view_controller_.view];
+                              view:view_controller_.view
+                        withSource:signin_metrics::
+                                       USER_CLICKED_SIGNOUT_SETTINGS];
     signout_coordinator_.completion = ^(BOOL success) {
     };
     return signout_coordinator_;
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index cb0ff5a..1cf0de09 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -132,6 +132,7 @@
 #import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
+#import "ios/chrome/browser/ui/util/page_animation_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller.h"
 #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller_factory.h"
@@ -593,13 +594,14 @@
   _keyCommandsProvider =
       [[KeyCommandsProvider alloc] initWithBrowser:self.browser];
   _keyCommandsProvider.dispatcher =
-      static_cast<id<ApplicationCommands, BrowserCommands,
-                     BrowserCoordinatorCommands, FindInPageCommands>>(
+      static_cast<id<ApplicationCommands, BrowserCommands, FindInPageCommands>>(
           _dispatcher);
   _keyCommandsProvider.omniboxHandler =
       static_cast<id<OmniboxCommands>>(_dispatcher);
   _keyCommandsProvider.bookmarksCommandsHandler =
       static_cast<id<BookmarksCommands>>(_dispatcher);
+  _keyCommandsProvider.browserCoordinatorCommandsHandler =
+      HandlerForProtocol(_dispatcher, BrowserCoordinatorCommands);
 
   _prerenderService = PrerenderServiceFactory::GetForBrowserState(browserState);
   if (!browserState->IsOffTheRecord()) {
@@ -1286,6 +1288,36 @@
   }
 }
 
+// TODO(crbug.com/1272498): Refactor this command away, and add a mediator to
+// observe the active web state closing and push updates into the BVC for UI
+// work.
+- (void)closeCurrentTab {
+  WebStateList* webStateList = self.browser->GetWebStateList();
+
+  int active_index = webStateList->active_index();
+  if (active_index == WebStateList::kInvalidIndex)
+    return;
+
+  BOOL canShowTabStrip = IsRegularXRegularSizeClass(self.viewController);
+
+  UIView* contentArea = self.browserContainerCoordinator.viewController.view;
+  UIView* snapshotView = nil;
+
+  if (!canShowTabStrip) {
+    snapshotView = [contentArea snapshotViewAfterScreenUpdates:NO];
+    snapshotView.frame = contentArea.frame;
+  }
+
+  webStateList->CloseWebStateAt(active_index, WebStateList::CLOSE_USER_ACTION);
+
+  if (!canShowTabStrip) {
+    [contentArea addSubview:snapshotView];
+    page_animation_util::AnimateOutWithCompletion(snapshotView, ^{
+      [snapshotView removeFromSuperview];
+    });
+  }
+}
+
 #pragma mark - DefaultPromoCommands
 
 - (void)showTailoredPromoStaySafe {
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index bccf914..fe01851 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -111,7 +111,6 @@
 #import "ios/chrome/browser/ui/util/keyboard_observer_helper.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/named_guide_util.h"
-#import "ios/chrome/browser/ui/util/page_animation_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/url_with_title.h"
 #import "ios/chrome/browser/upgrade/upgrade_center.h"
@@ -3153,31 +3152,6 @@
   [_voiceSearchController prepareToAppear];
 }
 
-// TODO(crbug.com/1272498): Refactor this command away, and add a mediator to
-// observe the active web state closing and push updates into the BVC for UI
-// work.
-- (void)closeCurrentTab {
-  WebStateList* webStateList = self.browser->GetWebStateList();
-  if (!webStateList)
-    return;
-
-  int active_index = webStateList->active_index();
-  if (active_index == WebStateList::kInvalidIndex)
-    return;
-
-  UIView* snapshotView = [self.contentArea snapshotViewAfterScreenUpdates:NO];
-  snapshotView.frame = self.contentArea.frame;
-
-  webStateList->CloseWebStateAt(active_index, WebStateList::CLOSE_USER_ACTION);
-
-  if (![self canShowTabStrip]) {
-    [self.contentArea addSubview:snapshotView];
-    page_animation_util::AnimateOutWithCompletion(snapshotView, ^{
-      [snapshotView removeFromSuperview];
-    });
-  }
-}
-
 - (void)prepareForPopupMenuPresentation:(PopupMenuCommandType)type {
   DCHECK(self.browserState);
   DCHECK(self.visible || self.dismissingModal);
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
index 126dfe1..ce4308a 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
@@ -258,6 +258,7 @@
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config = [super appConfigurationForTestCase];
   config.features_disabled.push_back(kTrendingQueriesModule);
+  config.features_enabled.push_back(kIOS3PIntentsInIncognito);
   return config;
 }
 
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.h b/ios/chrome/browser/ui/browser_view/key_commands_provider.h
index 3988a5a1..3de22915 100644
--- a/ios/chrome/browser/ui/browser_view/key_commands_provider.h
+++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.h
@@ -21,13 +21,13 @@
 @interface KeyCommandsProvider : NSObject
 
 @property(nonatomic, weak) UIViewController* baseViewController;
-@property(nonatomic, weak) id<ApplicationCommands,
-                              BrowserCommands,
-                              BrowserCoordinatorCommands,
-                              FindInPageCommands>
-    dispatcher;
+@property(nonatomic, weak)
+    id<ApplicationCommands, BrowserCommands, FindInPageCommands>
+        dispatcher;
 
 @property(nonatomic, weak) id<BookmarksCommands> bookmarksCommandsHandler;
+@property(nonatomic, weak) id<BrowserCoordinatorCommands>
+    browserCoordinatorCommandsHandler;
 @property(nonatomic, weak) id<OmniboxCommands> omniboxHandler;
 
 // Set this flag to YES when the key shortcut bound to Escape key that dismisses
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
index a06d2a8..be0ac16e 100644
--- a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
+++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
@@ -206,7 +206,9 @@
                                       if ([weakSelf.dispatcher
                                               respondsToSelector:@selector
                                               (closeCurrentTab)]) {
-                                        [weakSelf.dispatcher closeCurrentTab];
+                                        [weakSelf
+                                                .browserCoordinatorCommandsHandler
+                                                    closeCurrentTab];
                                       }
                                     }],
     ]];
@@ -351,18 +353,21 @@
                                     action:^{
                                       weakSelf.navigationAgent->StopLoading();
                                     }],
-      [UIKeyCommand cr_keyCommandWithInput:@"?"
-                             modifierFlags:UIKeyModifierCommand
-                                     title:nil
-                                    action:^{
-                                      [weakSelf.dispatcher showHelpPage];
-                                    }],
+      [UIKeyCommand
+          cr_keyCommandWithInput:@"?"
+                   modifierFlags:UIKeyModifierCommand
+                           title:nil
+                          action:^{
+                            [weakSelf.browserCoordinatorCommandsHandler
+                                    showHelpPage];
+                          }],
       [UIKeyCommand
           cr_keyCommandWithInput:@"l"
                    modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate
                            title:nil
                           action:^{
-                            [weakSelf.dispatcher showDownloadsFolder];
+                            [weakSelf.browserCoordinatorCommandsHandler
+                                    showDownloadsFolder];
                           }],
       [UIKeyCommand cr_keyCommandWithInput:@"1"
                              modifierFlags:UIKeyModifierCommand
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h
index 67dcccd..1bb2a567 100644
--- a/ios/chrome/browser/ui/commands/browser_commands.h
+++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -16,11 +16,6 @@
 // which in practice is the BrowserViewController instance displaying the tab.
 @protocol BrowserCommands <NSObject>
 
-// Closes the current tab.
-// TODO(crbug.com/1272498): Refactor this command away; call sites should close
-// via the WebStateList.
-- (void)closeCurrentTab;
-
 // Adds a page to the reading list using data in `command`.
 // TODO(crbug.com/1272540): Remove this command.
 - (void)addToReadingList:(ReadingListAddCommand*)command;
diff --git a/ios/chrome/browser/ui/commands/browser_coordinator_commands.h b/ios/chrome/browser/ui/commands/browser_coordinator_commands.h
index ad263a0..427c3d5 100644
--- a/ios/chrome/browser/ui/commands/browser_coordinator_commands.h
+++ b/ios/chrome/browser/ui/commands/browser_coordinator_commands.h
@@ -87,6 +87,11 @@
 // omnibox.
 - (void)focusFakebox;
 
+// Closes the current tab.
+// TODO(crbug.com/1272498): Refactor this command away; call sites should close
+// via the WebStateList.
+- (void)closeCurrentTab;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_COMMANDS_BROWSER_COORDINATOR_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn b/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
index 25cb4aa..7d110f9 100644
--- a/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
+++ b/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
@@ -40,6 +40,7 @@
     "incognito_interstitial_coordinator_delegate.h",
   ]
   deps = [
+    ":constants",
     ":incognito_interstitial_ui",
     "//base:base",
     "//ios/chrome/app:mode",
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h
index e9085b7..9978d98 100644
--- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h
+++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h
@@ -15,4 +15,30 @@
 extern NSString* const
     kIncognitoInterstitialCancelButtonAccessibilityIdentifier;
 
+// UMA histogram names.
+extern const char kIncognitoInterstitialActionsHistogram[];
+extern const char kIncognitoInterstitialSettingsActionsHistogram[];
+
+// Enum for the IOS.IncognitoInterstitial histogram.
+// Keep in sync with "IncognitoInterstitialActionType"
+// in src/tools/metrics/histograms/enums.xml.
+enum class IncognitoInterstitialActions {
+  kUnknown = 0,  // Never logged.
+  kOpenInChromeIncognito = 1,
+  // The user chose to open link in a "normal" tab.
+  kOpenInChrome = 2,
+  kCancel = 3,
+  kMaxValue = kCancel,
+};
+
+// Enum for the IOS.IncognitoInterstitial.Settings histogram.
+// Keep in sync with "IncognitoInterstitialSettingsActionType"
+// in src/tools/metrics/histograms/enums.xml.
+enum class IncognitoInterstitialSettingsActions {
+  kUnknown = 0,  // Never logged.
+  kEnabled = 1,
+  kDisabled = 2,
+  kMaxValue = kDisabled,
+};
+
 #endif  // IOS_CHROME_BROWSER_UI_INCOGNITO_INTERSTITIAL_INCOGNITO_INTERSTITIAL_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.mm b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.mm
index 4453057..05e13b4 100644
--- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.mm
+++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.mm
@@ -15,3 +15,8 @@
 
 NSString* const kIncognitoInterstitialCancelButtonAccessibilityIdentifier =
     @"incognitoInterstitialCancelButtonAccessibilityIdentifier";
+
+const char kIncognitoInterstitialActionsHistogram[] =
+    "IOS.IncognitoInterstitial";
+const char kIncognitoInterstitialSettingsActionsHistogram[] =
+    "IOS.IncognitoInterstitial.Settings";
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm
index 310b247..5c84646 100644
--- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm
+++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.mm
@@ -3,8 +3,10 @@
 // found in the LICENSE file.
 
 #import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator.h"
+#import "base/metrics/histogram_macros.h"
 #import "base/strings/sys_string_conversions.h"
 #import "ios/chrome/app/application_delegate/tab_opening.h"
+#import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h"
 #import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.h"
 #import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller_delegate.h"
@@ -24,6 +26,9 @@
 @property(nonatomic, strong)
     IncognitoInterstitialViewController* incognitoInterstitialViewController;
 
+@property(nonatomic, assign)
+    IncognitoInterstitialActions incognitoInterstitialAction;
+
 @end
 
 @implementation IncognitoInterstitialCoordinator
@@ -40,6 +45,11 @@
       presentViewController:self.incognitoInterstitialViewController
                    animated:YES
                  completion:completion];
+
+  // The default recorded action is "Cancel".
+  // This value is changed right before the "Open in Chrome Incognito" or
+  // "Open in Chrome" action buttons trigger the dismissal of the interstitial.
+  self.incognitoInterstitialAction = IncognitoInterstitialActions::kCancel;
 }
 
 - (void)stopWithCompletion:(ProceduralBlock)completion {
@@ -50,6 +60,9 @@
                            weakSelf.incognitoInterstitialViewController = nil;
                            completion();
                          }];
+
+  UMA_HISTOGRAM_ENUMERATION(kIncognitoInterstitialActionsHistogram,
+                            self.incognitoInterstitialAction);
 }
 
 - (void)start {
@@ -67,7 +80,10 @@
   __weak __typeof(self) weakSelf = self;
   UrlLoadParams copyOfUrlLoadParams = self.urlLoadParams;
   void (^dismissModalsAndOpenTab)() = ^{
-    [weakSelf.tabOpener
+    __typeof(self) strongSelf = weakSelf;
+    strongSelf.incognitoInterstitialAction =
+        IncognitoInterstitialActions::kOpenInChromeIncognito;
+    [strongSelf.tabOpener
         dismissModalsAndMaybeOpenSelectedTabInMode:
             ApplicationModeForTabOpening::INCOGNITO
                                  withUrlLoadParams:copyOfUrlLoadParams
@@ -93,6 +109,8 @@
 
 - (void)didTapSecondaryActionButton {
   // Dismiss modals (including interstitial) and open link in regular tab.
+  self.incognitoInterstitialAction =
+      IncognitoInterstitialActions::kOpenInChrome;
   [self.tabOpener dismissModalsAndMaybeOpenSelectedTabInMode:
                       ApplicationModeForTabOpening::NORMAL
                                            withUrlLoadParams:self.urlLoadParams
diff --git a/ios/chrome/browser/ui/menu/browser_action_factory.mm b/ios/chrome/browser/ui/menu/browser_action_factory.mm
index 8d82bb8..5db0db6 100644
--- a/ios/chrome/browser/ui/menu/browser_action_factory.mm
+++ b/ios/chrome/browser/ui/menu/browser_action_factory.mm
@@ -13,7 +13,7 @@
 #include "ios/chrome/browser/pref_names.h"
 #import "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/load_query_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
@@ -224,8 +224,8 @@
 }
 
 - (UIAction*)actionToCloseCurrentTab {
-  __weak id<BrowserCommands> handler =
-      static_cast<id<BrowserCommands>>(self.browser->GetCommandDispatcher());
+  __weak id<BrowserCoordinatorCommands> handler = HandlerForProtocol(
+      self.browser->GetCommandDispatcher(), BrowserCoordinatorCommands);
   UIAction* action =
       [self actionWithTitle:l10n_util::GetNSString(IDS_IOS_TOOLS_MENU_CLOSE_TAB)
                       image:DefaultSymbolWithPointSize(kXMarkSymbol,
diff --git a/ios/chrome/browser/ui/menu/browser_action_factory_unittest.mm b/ios/chrome/browser/ui/menu/browser_action_factory_unittest.mm
index 6d2c550f..befef8b 100644
--- a/ios/chrome/browser/ui/menu/browser_action_factory_unittest.mm
+++ b/ios/chrome/browser/ui/menu/browser_action_factory_unittest.mm
@@ -14,6 +14,7 @@
 #include "ios/chrome/browser/pref_names.h"
 #import "ios/chrome/browser/sessions/test_session_service.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/load_query_commands.h"
 #import "ios/chrome/browser/ui/commands/qr_scanner_commands.h"
@@ -74,6 +75,12 @@
         startDispatchingToTarget:mock_application_settings_commands_handler_
                      forProtocol:@protocol(ApplicationSettingsCommands)];
 
+    mock_browser_coordinator_commands_handler_ =
+        OCMStrictProtocolMock(@protocol(BrowserCoordinatorCommands));
+    [test_browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mock_browser_coordinator_commands_handler_
+                     forProtocol:@protocol(BrowserCoordinatorCommands)];
+
     mock_qr_scanner_commands_handler_ =
         OCMStrictProtocolMock(@protocol(QRScannerCommands));
     [test_browser_->GetCommandDispatcher()
@@ -95,6 +102,7 @@
   std::unique_ptr<TestBrowser> test_browser_;
   id mock_application_commands_handler_;
   id mock_application_settings_commands_handler_;
+  id mock_browser_coordinator_commands_handler_;
   id mock_qr_scanner_commands_handler_;
   id mock_load_query_commands_handler_;
   SceneState* scene_state_;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
index af3da7f..2d2b22b8 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -36,7 +36,7 @@
 #import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/omnibox_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
@@ -352,6 +352,12 @@
 - (void)stop {
   if (!self.started)
     return;
+
+  if (self.browser->GetBrowserState()->IsOffTheRecord()) {
+    self.incognitoViewController = nil;
+    self.started = NO;
+    return;
+  }
   self.viewPresented = NO;
   [self updateVisible];
 
@@ -365,7 +371,6 @@
   self.contentSuggestionsCoordinator = nil;
   self.headerSynchronizer = nil;
   self.headerController = nil;
-  self.incognitoViewController = nil;
   // Remove before nil to ensure View Hierarchy doesn't hold last strong
   // reference.
   [self.containedViewController willMoveToParentViewController:nil];
@@ -374,6 +379,7 @@
   self.containedViewController = nil;
   self.ntpViewController.feedHeaderViewController = nil;
   self.ntpViewController = nil;
+  self.feedHeaderViewController.ntpDelegate = nil;
   self.feedHeaderViewController = nil;
   self.alertCoordinator = nil;
   self.authService = nil;
@@ -883,18 +889,18 @@
 
 - (void)overscrollActionsController:(OverscrollActionsController*)controller
                    didTriggerAction:(OverscrollAction)action {
-  // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
-  // clean up.
-  id<ApplicationCommands, BrowserCommands, OmniboxCommands, SnackbarCommands>
-      handler = static_cast<id<ApplicationCommands, BrowserCommands,
-                               OmniboxCommands, SnackbarCommands>>(
-          self.browser->GetCommandDispatcher());
+  id<ApplicationCommands> applicationCommandsHandler = HandlerForProtocol(
+      self.browser->GetCommandDispatcher(), ApplicationCommands);
+  id<BrowserCoordinatorCommands> browserCoordinatorCommandsHandler =
+      HandlerForProtocol(self.browser->GetCommandDispatcher(),
+                         BrowserCoordinatorCommands);
+
   switch (action) {
     case OverscrollAction::NEW_TAB: {
-      [handler openURLInNewTab:[OpenNewTabCommand command]];
+      [applicationCommandsHandler openURLInNewTab:[OpenNewTabCommand command]];
     } break;
     case OverscrollAction::CLOSE_TAB: {
-      [handler closeCurrentTab];
+      [browserCoordinatorCommandsHandler closeCurrentTab];
       base::RecordAction(base::UserMetricsAction("OverscrollActionCloseTab"));
     } break;
     case OverscrollAction::REFRESH:
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
index d711ef99..c6c6948 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -195,11 +195,6 @@
     self.highlightedIndexPath = nil;
   }
 
-  // This view controller does not support multiple sections yet. Multi-section
-  // support only exists in the Swift version of the popup.
-  DCHECK(result.count == 1)
-      << "OmniboxPopupRow assumes there's only one suggestion group.";
-
   self.currentResult = result;
 
   [self.tableView reloadData];
@@ -238,25 +233,38 @@
     return;
   }
 
-  if (path.row == 0) {
-    // Can't move up from first row. Call the delegate again so that the inline
-    // autocomplete text is set again (in case the user exited the inline
-    // autocomplete).
-    [self.delegate autocompleteResultConsumer:self
-                              didHighlightRow:self.highlightedIndexPath.row
-                                    inSection:0];
-    return;
+  BOOL isCurrentHighlightedRowFirstInSection = (path.row == 0);
+  if (isCurrentHighlightedRowFirstInSection) {
+    NSInteger previousSection = path.section - 1;
+    NSInteger previousSectionCount =
+        (previousSection >= 0)
+            ? [self.tableView numberOfRowsInSection:previousSection]
+            : 0;
+    BOOL prevSectionHasItems = previousSectionCount > 0;
+    if (prevSectionHasItems) {
+      path = [NSIndexPath indexPathForRow:previousSectionCount - 1
+                                inSection:previousSection];
+    } else {
+      // Can't move up from first row. Call the delegate again so that the
+      // inline autocomplete text is set again (in case the user exited the
+      // inline autocomplete).
+      [self.delegate
+          autocompleteResultConsumer:self
+                     didHighlightRow:self.highlightedIndexPath.row
+                           inSection:self.highlightedIndexPath.section];
+      return;
+    }
+  } else {
+    path = [NSIndexPath indexPathForRow:path.row - 1 inSection:path.section];
   }
 
   [self unhighlightRowAtIndexPath:self.highlightedIndexPath];
-  self.highlightedIndexPath =
-      [NSIndexPath indexPathForRow:self.highlightedIndexPath.row - 1
-                         inSection:0];
+  self.highlightedIndexPath = path;
   [self highlightRowAtIndexPath:self.highlightedIndexPath];
 
   [self.delegate autocompleteResultConsumer:self
                             didHighlightRow:self.highlightedIndexPath.row
-                                  inSection:0];
+                                  inSection:self.highlightedIndexPath.section];
 }
 
 - (void)highlightPreviousSuggestion {
@@ -267,27 +275,38 @@
   }
 
   NSIndexPath* path = self.highlightedIndexPath;
+  BOOL isCurrentHighlightedRowLastInSection =
+      path.row == [self.tableView numberOfRowsInSection:path.section] - 1;
+  if (isCurrentHighlightedRowLastInSection) {
+    NSInteger nextSection = path.section + 1;
+    BOOL nextSectionHasItems =
+        [self.tableView numberOfSections] > nextSection &&
+        [self.tableView numberOfRowsInSection:nextSection] > 0;
 
-  if (path.row == [self.tableView numberOfRowsInSection:0] - 1) {
-    // Can't go below last row. Call the delegate again so that the inline
-    // autocomplete text is set again (in case the user exited the inline
-    // autocomplete).
-    [self.delegate autocompleteResultConsumer:self
-                              didHighlightRow:self.highlightedIndexPath.row
-                                    inSection:0];
-    return;
+    if (nextSectionHasItems) {
+      path = [NSIndexPath indexPathForRow:0 inSection:nextSection];
+    } else {
+      // Can't go below last row. Call the delegate again so that the inline
+      // autocomplete text is set again (in case the user exited the inline
+      // autocomplete).
+      [self.delegate
+          autocompleteResultConsumer:self
+                     didHighlightRow:self.highlightedIndexPath.row
+                           inSection:self.highlightedIndexPath.section];
+      return;
+    }
+  } else {
+    path = [NSIndexPath indexPathForRow:path.row + 1 inSection:path.section];
   }
 
   // There is a row below, move highlight there.
   [self unhighlightRowAtIndexPath:self.highlightedIndexPath];
-  self.highlightedIndexPath =
-      [NSIndexPath indexPathForRow:self.highlightedIndexPath.row + 1
-                         inSection:0];
+  self.highlightedIndexPath = path;
   [self highlightRowAtIndexPath:self.highlightedIndexPath];
 
   [self.delegate autocompleteResultConsumer:self
                             didHighlightRow:self.highlightedIndexPath.row
-                                  inSection:0];
+                                  inSection:self.highlightedIndexPath.section];
 }
 
 - (void)keyCommandReturn {
@@ -321,7 +340,6 @@
 
 - (void)tableView:(UITableView*)tableView
     didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
-  DCHECK_EQ(0U, (NSUInteger)indexPath.section);
   DCHECK_LT((NSUInteger)indexPath.row,
             self.currentResult[indexPath.section].suggestions.count);
   NSUInteger row = indexPath.row;
@@ -339,20 +357,16 @@
 #pragma mark - Table view data source
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
-  DCHECK_EQ(1U, (NSUInteger)self.currentResult.count);
   return self.currentResult.count;
 }
 
 - (NSInteger)tableView:(UITableView*)tableView
     numberOfRowsInSection:(NSInteger)section {
-  DCHECK_EQ(0U, (NSUInteger)section);
   return self.currentResult[section].suggestions.count;
 }
 
 - (BOOL)tableView:(UITableView*)tableView
     canEditRowAtIndexPath:(NSIndexPath*)indexPath {
-  DCHECK_EQ(0U, (NSUInteger)indexPath.section);
-
   // iOS doesn't check -numberOfRowsInSection before checking
   // -canEditRowAtIndexPath in a reload call. If `indexPath.row` is too large,
   // simple return `NO`.
@@ -367,7 +381,6 @@
 - (void)tableView:(UITableView*)tableView
     commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
      forRowAtIndexPath:(NSIndexPath*)indexPath {
-  DCHECK_EQ(0U, (NSUInteger)indexPath.section);
   DCHECK_LT((NSUInteger)indexPath.row,
             self.currentResult[indexPath.section].suggestions.count);
   if (editingStyle == UITableViewCellEditingStyleDelete) {
@@ -411,14 +424,6 @@
 
 #pragma mark Action for append UIButton
 
-// Action handler for when the button is tapped.
-- (void)trailingButtonTapped:(id)sender {
-  NSUInteger row = [sender tag];
-  [self.delegate autocompleteResultConsumer:self
-                 didTapTrailingButtonForRow:row
-                                  inSection:0];
-}
-
 - (void)setSemanticContentAttribute:
     (UISemanticContentAttribute)semanticContentAttribute {
   _semanticContentAttribute = semanticContentAttribute;
@@ -464,8 +469,6 @@
 // Customize the appearance of table view cells.
 - (UITableViewCell*)tableView:(UITableView*)tableView
         cellForRowAtIndexPath:(NSIndexPath*)indexPath {
-  DCHECK_EQ(0U, (NSUInteger)indexPath.section);
-
   DCHECK_LT((NSUInteger)indexPath.row,
             self.currentResult[indexPath.section].suggestions.count);
   OmniboxPopupRowCell* cell = [self.tableView
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h
index cd1b533d..c346fe3 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h
@@ -35,13 +35,14 @@
 // Dispatcher.
 @property(nonatomic, weak) id<ApplicationCommands,
                               BrowserCommands,
-                              BrowserCoordinatorCommands,
                               FindInPageCommands,
                               LoadQueryCommands,
                               TextZoomCommands>
     dispatcher;
 
 @property(nonatomic, weak) id<BookmarksCommands> bookmarksCommandsHandler;
+@property(nonatomic, weak) id<BrowserCoordinatorCommands>
+    browserCoordinatorCommandsHandler;
 @property(nonatomic, weak) id<PageInfoCommands> pageInfoCommandsHandler;
 @property(nonatomic, weak) id<PopupMenuCommands> popupMenuCommandsHandler;
 @property(nonatomic, weak) id<QRScannerCommands> qrScannerCommandsHandler;
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
index 0ad520cf..8012fc7 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -82,7 +82,7 @@
       break;
     case PopupMenuActionTranslate:
       base::RecordAction(UserMetricsAction("MobileMenuTranslate"));
-      [self.dispatcher showTranslate];
+      [self.browserCoordinatorCommandsHandler showTranslate];
       break;
     case PopupMenuActionFindInPage:
       RecordAction(UserMetricsAction("MobileMenuFindInPage"));
@@ -91,7 +91,7 @@
     case PopupMenuActionRequestDesktop:
       RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite"));
       self.navigationAgent->RequestDesktopSite();
-      [self.dispatcher showDefaultSiteViewIPH];
+      [self.browserCoordinatorCommandsHandler showDefaultSiteViewIPH];
       break;
     case PopupMenuActionRequestMobile:
       RecordAction(UserMetricsAction("MobileMenuRequestMobileSite"));
@@ -112,15 +112,13 @@
       break;
     case PopupMenuActionHelp:
       RecordAction(UserMetricsAction("MobileMenuHelp"));
-      [self.dispatcher showHelpPage];
+      [self.browserCoordinatorCommandsHandler showHelpPage];
       break;
     case PopupMenuActionOpenDownloads:
       RecordAction(
           UserMetricsAction("MobileDownloadFolderUIShownFromToolsMenu"));
       [self.delegate recordDownloadsMetricsPerProfile];
-      // TODO(crbug.com/906662): This will need to be called on the
-      // BrowserCoordinatorCommands handler.
-      [self.dispatcher showDownloadsFolder];
+      [self.browserCoordinatorCommandsHandler showDownloadsFolder];
       break;
     case PopupMenuActionTextZoom:
       RecordAction(UserMetricsAction("MobileMenuTextZoom"));
@@ -128,9 +126,7 @@
       break;
 #if !defined(NDEBUG)
     case PopupMenuActionViewSource:
-      // TODO(crbug.com/906662): This will need to be called on the
-      // BrowserCoordinatorCommands handler.
-      [self.dispatcher viewSource];
+      [self.browserCoordinatorCommandsHandler viewSource];
       break;
 #endif  // !defined(NDEBUG)
     case PopupMenuActionOpenNewWindow:
@@ -145,19 +141,15 @@
     case PopupMenuActionBookmarks:
       RecordAction(UserMetricsAction("MobileMenuAllBookmarks"));
       LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeAllTabs);
-      [self.dispatcher showBookmarksManager];
+      [self.browserCoordinatorCommandsHandler showBookmarksManager];
       break;
     case PopupMenuActionReadingList:
       RecordAction(UserMetricsAction("MobileMenuReadingList"));
-      // TODO(crbug.com/906662): This will need to be called on the
-      // BrowserCoordinatorCommands handler.
-      [self.dispatcher showReadingList];
+      [self.browserCoordinatorCommandsHandler showReadingList];
       break;
     case PopupMenuActionRecentTabs:
       RecordAction(UserMetricsAction("MobileMenuRecentTabs"));
-      // TODO(crbug.com/906662): This will need to be called on the
-      // BrowserCoordinatorCommands handler.
-      [self.dispatcher showRecentTabs];
+      [self.browserCoordinatorCommandsHandler showRecentTabs];
       break;
     case PopupMenuActionHistory:
       RecordAction(UserMetricsAction("MobileMenuHistory"));
@@ -170,7 +162,7 @@
       break;
     case PopupMenuActionCloseTab:
       RecordAction(UserMetricsAction("MobileMenuCloseTab"));
-      [self.dispatcher closeCurrentTab];
+      [self.browserCoordinatorCommandsHandler closeCurrentTab];
       break;
     case PopupMenuActionNavigate:
       // No metrics for this item.
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
index 5ae36a4..26327d3 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -26,6 +26,7 @@
 #import "ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h"
 #import "ios/chrome/browser/ui/commands/bookmarks_commands.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/find_in_page_commands.h"
 #import "ios/chrome/browser/ui/commands/page_info_commands.h"
@@ -502,12 +503,14 @@
 
   self.actionHandler = [[PopupMenuActionHandler alloc] init];
   self.actionHandler.baseViewController = self.baseViewController;
-  self.actionHandler.dispatcher = static_cast<
-      id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
-         FindInPageCommands, LoadQueryCommands, TextZoomCommands>>(
-      self.browser->GetCommandDispatcher());
+  self.actionHandler.dispatcher =
+      static_cast<id<ApplicationCommands, BrowserCommands, FindInPageCommands,
+                     LoadQueryCommands, TextZoomCommands>>(
+          self.browser->GetCommandDispatcher());
   self.actionHandler.bookmarksCommandsHandler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), BookmarksCommands);
+  self.actionHandler.browserCoordinatorCommandsHandler = HandlerForProtocol(
+      self.browser->GetCommandDispatcher(), BrowserCoordinatorCommands);
   self.actionHandler.pageInfoCommandsHandler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), PageInfoCommands);
   self.actionHandler.popupMenuCommandsHandler = HandlerForProtocol(
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index a9d32d36..dbc415b 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -10,6 +10,7 @@
 #include "base/metrics/user_metrics_action.h"
 #include "components/browsing_data/core/pref_names.h"
 #include "components/prefs/pref_service.h"
+#import "components/signin/public/base/signin_metrics.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
@@ -515,11 +516,14 @@
     // An action is already in progress, ignore user's request.
     return;
   }
+  signin_metrics::ProfileSignout signout_source_metric =
+      signin_metrics::USER_CLICKED_SIGNOUT_FROM_CLEAR_BROWSING_DATA_PAGE;
   _signoutCoordinator = [[SignoutActionSheetCoordinator alloc]
       initWithBaseViewController:self
                          browser:_browser
                             rect:itemView.frame
-                            view:itemView];
+                            view:itemView
+                      withSource:signout_source_metric];
   __weak ClearBrowsingDataTableViewController* weakSelf = self;
   _signoutCoordinator.completion = ^(BOOL success) {
     [weakSelf handleAuthenticationOperationDidFinish];
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
index a80f1408..dcec73dd 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -604,7 +604,8 @@
       initWithBaseViewController:self
                          browser:_browser
                             rect:itemView.frame
-                            view:itemView];
+                            view:itemView
+                      withSource:signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS];
   __weak AccountsTableViewController* weakSelf = self;
   self.signoutCoordinator.completion = ^(BOOL success) {
     [weakSelf.signoutCoordinator stop];
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
index dd30c4f75..2c51e68 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -207,7 +207,8 @@
       initWithBaseViewController:self.viewController
                          browser:self.browser
                             rect:targetRect
-                            view:self.viewController.view];
+                            view:self.viewController.view
+                      withSource:signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS];
   __weak GoogleServicesSettingsCoordinator* weakSelf = self;
   self.signoutActionSheetCoordinator.delegate = self;
   self.signoutActionSheetCoordinator.completion = ^(BOOL success) {
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
index d9e7a5e..bd31f12 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -200,7 +200,8 @@
       initWithBaseViewController:self.viewController
                          browser:self.browser
                             rect:targetRect
-                            view:self.viewController.view];
+                            view:self.viewController.view
+                      withSource:signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS];
   self.signoutActionSheetCoordinator.delegate = self;
   __weak ManageSyncSettingsCoordinator* weakSelf = self;
   self.signoutActionSheetCoordinator.completion = ^(BOOL success) {
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
index bae6663b..98a129e 100644
--- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -46,6 +46,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/icons:symbols",
+    "//ios/chrome/browser/ui/incognito_interstitial:constants",
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/settings:constants",
     "//ios/chrome/browser/ui/settings:settings_root",
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
index 2ac5c395..83d5104 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -8,6 +8,7 @@
 
 #include "base/check.h"
 #import "base/mac/foundation_util.h"
+#import "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "components/content_settings/core/common/features.h"
@@ -28,6 +29,7 @@
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/sync/sync_service_factory.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
+#import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h"
 #import "ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h"
 #import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h"
 #import "ios/chrome/browser/ui/settings/privacy/privacy_constants.h"
@@ -638,6 +640,10 @@
 // switchView.on is YES.
 - (void)incognitoInterstitialSwitchTapped:(UISwitch*)switchView {
   self.incognitoInterstitialPref.value = switchView.on;
+  UMA_HISTOGRAM_ENUMERATION(
+      kIncognitoInterstitialSettingsActionsHistogram,
+      switchView.on ? IncognitoInterstitialSettingsActions::kEnabled
+                    : IncognitoInterstitialSettingsActions::kDisabled);
 }
 
 // Called from the reauthentication setting's UIControlEventTouchUpInside.
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
index 54be771..3203afe 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/browser/main/test_browser.h"
 #import "ios/chrome/browser/policy/policy_util.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/load_query_commands.h"
 #import "ios/chrome/browser/ui/commands/qr_scanner_commands.h"
@@ -97,6 +98,12 @@
         startDispatchingToTarget:mock_application_settings_commands_handler_
                      forProtocol:@protocol(ApplicationSettingsCommands)];
 
+    mock_browser_coordinator_commands_handler_ =
+        OCMStrictProtocolMock(@protocol(BrowserCoordinatorCommands));
+    [test_browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mock_browser_coordinator_commands_handler_
+                     forProtocol:@protocol(BrowserCoordinatorCommands)];
+
     mock_qr_scanner_commands_handler_ =
         OCMStrictProtocolMock(@protocol(QRScannerCommands));
     [test_browser_->GetCommandDispatcher()
@@ -159,6 +166,7 @@
   id strict_consumer_;
   id mock_application_commands_handler_;
   id mock_application_settings_commands_handler_;
+  id mock_browser_coordinator_commands_handler_;
   id mock_qr_scanner_commands_handler_;
   id mock_load_query_commands_handler_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
diff --git a/ios/chrome/test/providers/BUILD.gn b/ios/chrome/test/providers/BUILD.gn
index d97568fc..414767e 100644
--- a/ios/chrome/test/providers/BUILD.gn
+++ b/ios/chrome/test/providers/BUILD.gn
@@ -14,6 +14,7 @@
     "//ios/chrome/test/providers/branded_images",
     "//ios/chrome/test/providers/context_menu",
     "//ios/chrome/test/providers/discover_feed",
+    "//ios/chrome/test/providers/follow",
     "//ios/chrome/test/providers/lens",
     "//ios/chrome/test/providers/mailto_handler",
     "//ios/chrome/test/providers/modals",
diff --git a/ios/chrome/test/providers/follow/BUILD.gn b/ios/chrome/test/providers/follow/BUILD.gn
new file mode 100644
index 0000000..b40bb2c
--- /dev/null
+++ b/ios/chrome/test/providers/follow/BUILD.gn
@@ -0,0 +1,13 @@
+# Copyright 2022 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.
+
+source_set("follow") {
+  testonly = true
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [ "test_follow.mm" ]
+  deps = [
+    "//base",
+    "//ios/public/provider/chrome/browser/follow:follow_api",
+  ]
+}
diff --git a/ios/chrome/test/providers/follow/test_follow.mm b/ios/chrome/test/providers/follow/test_follow.mm
new file mode 100644
index 0000000..6cb9cc1
--- /dev/null
+++ b/ios/chrome/test/providers/follow/test_follow.mm
@@ -0,0 +1,74 @@
+// Copyright 2022 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/public/provider/chrome/browser/follow/follow_api.h"
+
+#import "base/callback.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace ios {
+namespace provider {
+namespace {
+
+// FollowService implementation used in tests.
+class TestFollowService final : public FollowService {
+ public:
+  // FollowService implementation.
+  bool IsWebSiteFollowed(WebPageURLs* web_page_urls) final;
+  NSURL* GetRecommendedSiteURL(WebPageURLs* web_page_urls) final;
+  NSArray<FollowedWebSite*>* GetFollowedWebSites() final;
+  void FollowWebSite(WebPageURLs* web_page_urls,
+                     FollowSource source,
+                     ResultCallback callback) final;
+  void UnfollowWebSite(WebPageURLs* web_page_urls,
+                       FollowSource source,
+                       ResultCallback callback) final;
+  void AddObserver(FollowServiceObserver* observer) final;
+  void RemoveObserver(FollowServiceObserver* observer) final;
+};
+
+bool TestFollowService::IsWebSiteFollowed(WebPageURLs* web_page_urls) {
+  return false;
+}
+
+NSURL* TestFollowService::GetRecommendedSiteURL(WebPageURLs* web_page_urls) {
+  return nil;
+}
+
+NSArray<FollowedWebSite*>* TestFollowService::GetFollowedWebSites() {
+  return @[];
+}
+
+void TestFollowService::FollowWebSite(WebPageURLs* web_page_urls,
+                                      FollowSource source,
+                                      ResultCallback callback) {
+  // Do nothing.
+}
+
+void TestFollowService::UnfollowWebSite(WebPageURLs* web_page_urls,
+                                        FollowSource source,
+                                        ResultCallback callback) {
+  // Do nothing.
+}
+
+void TestFollowService::AddObserver(FollowServiceObserver* observer) {
+  // Do nothing.
+}
+
+void TestFollowService::RemoveObserver(FollowServiceObserver* observer) {
+  // Do nothing.
+}
+
+}  // anonymous namespace
+
+std::unique_ptr<FollowService> CreateFollowService(
+    FollowConfiguration* configuration) {
+  return std::make_unique<TestFollowService>();
+}
+
+}  // namespace provider
+}  // namespace ios
diff --git a/ios/public/provider/chrome/browser/follow/BUILD.gn b/ios/public/provider/chrome/browser/follow/BUILD.gn
index 24854ca..b48579bb 100644
--- a/ios/public/provider/chrome/browser/follow/BUILD.gn
+++ b/ios/public/provider/chrome/browser/follow/BUILD.gn
@@ -10,3 +10,9 @@
   ]
   deps = []
 }
+
+source_set("follow_api") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [ "follow_api.h" ]
+  deps = [ "//ios/chrome/browser/follow:service" ]
+}
diff --git a/ios/public/provider/chrome/browser/follow/DEPS b/ios/public/provider/chrome/browser/follow/DEPS
new file mode 100644
index 0000000..37447208
--- /dev/null
+++ b/ios/public/provider/chrome/browser/follow/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+ios/chrome/browser/follow/follow_configuration.h",
+  "+ios/chrome/browser/follow/follow_service.h",
+]
diff --git a/ios/public/provider/chrome/browser/follow/follow_api.h b/ios/public/provider/chrome/browser/follow/follow_api.h
new file mode 100644
index 0000000..297c2f36
--- /dev/null
+++ b/ios/public/provider/chrome/browser/follow/follow_api.h
@@ -0,0 +1,23 @@
+// Copyright 2022 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_PUBLIC_PROVIDER_CHROME_BROWSER_FOLLOW_FOLLOW_API_H_
+#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_FOLLOW_FOLLOW_API_H_
+
+#include <memory>
+
+#include "ios/chrome/browser/follow/follow_configuration.h"
+#include "ios/chrome/browser/follow/follow_service.h"
+
+namespace ios {
+namespace provider {
+
+// Creates a new instance of FollowService.
+std::unique_ptr<FollowService> CreateFollowService(
+    FollowConfiguration* configuration);
+
+}  // namespace provider
+}  // namespace ios
+
+#endif  // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_FOLLOW_FOLLOW_API_H_
diff --git a/ios/web/common/features.h b/ios/web/common/features.h
index 78b87a3..ce035c4 100644
--- a/ios/web/common/features.h
+++ b/ios/web/common/features.h
@@ -66,6 +66,9 @@
 // should be used instead of directly checking this feature.
 extern const base::Feature kUseLoadSimulatedRequestForOfflinePage;
 
+// Feature flag that enable web page detected intents annotations.
+extern const base::Feature kEnableWebPageAnnotations;
+
 // When true, the native context menu for the web content are used.
 bool UseWebViewNativeContextMenuWeb();
 
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm
index f2d41e9..0bcc4be 100644
--- a/ios/web/common/features.mm
+++ b/ios/web/common/features.mm
@@ -49,13 +49,16 @@
 const base::Feature kSynthesizedRestoreSession{
     "SynthesizedRestoreSession", base::FEATURE_ENABLED_BY_DEFAULT};
 
-extern const base::Feature kEnableFullscreenAPI{
-    "EnableFullscreenAPI", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kEnableFullscreenAPI{"EnableFullscreenAPI",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
-extern const base::Feature kUseLoadSimulatedRequestForOfflinePage{
+const base::Feature kUseLoadSimulatedRequestForOfflinePage{
     "UseLoadSimulatedRequestForErrorPageNavigation",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kEnableWebPageAnnotations{
+    "EnableWebPageAnnotations", base::FEATURE_DISABLED_BY_DEFAULT};
+
 bool UseWebViewNativeContextMenuWeb() {
   return base::FeatureList::IsEnabled(kDefaultWebViewContextMenu);
 }
diff --git a/ios/web/find_in_page/BUILD.gn b/ios/web/find_in_page/BUILD.gn
index bdc90e7..823df20 100644
--- a/ios/web/find_in_page/BUILD.gn
+++ b/ios/web/find_in_page/BUILD.gn
@@ -7,6 +7,7 @@
 
 source_set("find_in_page") {
   deps = [
+    ":compile_ts",
     ":find_in_page_event_listeners_js",
     ":find_in_page_js",
     "//base",
@@ -33,7 +34,11 @@
 }
 
 compile_ts("compile_ts") {
-  sources = [ "resources/find_in_page.ts" ]
+  sources = [
+    "resources/find_in_page.ts",
+    "resources/find_in_page_constants.ts",
+    "resources/find_in_page_utils.ts",
+  ]
 }
 
 optimize_js("find_in_page_js") {
diff --git a/ios/web/find_in_page/resources/find_in_page.ts b/ios/web/find_in_page/resources/find_in_page.ts
index 656c193d..8a6b30eb 100644
--- a/ios/web/find_in_page/resources/find_in_page.ts
+++ b/ios/web/find_in_page/resources/find_in_page.ts
@@ -2,11 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/**
- * Class name of CSS element that selects a highlighted match with orange.
- * @type {string}
- */
-const CSS_CLASS_NAME_SELECT = 'find_selected';
+import {CSS_CLASS_NAME_SELECT}
+    from '//ios/web/find_in_page/resources/find_in_page_constants.js';
 
 /**
  * Returns the width of the document.body.  Sometimes though the body lies to
@@ -272,4 +269,4 @@
   }
 }
 
-export {CSS_CLASS_NAME_SELECT, Match, PartialMatch, Replacement, Section, Timer}
+export {Match, PartialMatch, Replacement, Section, Timer}
diff --git a/ios/web/find_in_page/resources/find_in_page_constants.ts b/ios/web/find_in_page/resources/find_in_page_constants.ts
new file mode 100644
index 0000000..b4b0565b
--- /dev/null
+++ b/ios/web/find_in_page/resources/find_in_page_constants.ts
@@ -0,0 +1,51 @@
+// Copyright 2022 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.
+
+/**
+ * Class name of CSS element that highlights matches with yellow.
+ * @type {string}
+ */
+const CSS_CLASS_NAME = 'find_in_page';
+
+/**
+ * Class name of CSS element that selects a highlighted match with orange.
+ * @type {string}
+ */
+const CSS_CLASS_NAME_SELECT = 'find_selected';
+
+/**
+ * ID of CSS style.
+ * @type {string}
+ */
+const CSS_STYLE_ID = '__gCrWeb.findInPageStyle';
+
+/**
+ * Node names that are not going to be processed.
+ * @type {Object}
+ */
+const IGNORE_NODE_NAMES = new Set([
+  'SCRIPT', 'STYLE', 'EMBED', 'OBJECT', 'SELECT', 'TEXTAREA', 'IFRAME',
+  'NOSCRIPT'
+]);
+
+/**
+ * Maximum number of visible elements to count
+ * @type {number}
+ */
+const MAX_VISIBLE_ELEMENTS = 100;
+
+/**
+ * Result passed back to app to indicate pumpSearch has reached timeout.
+ * @type {number}
+ */
+const TIMEOUT = -1;
+
+export {
+  CSS_CLASS_NAME,
+  CSS_CLASS_NAME_SELECT,
+  CSS_STYLE_ID,
+  IGNORE_NODE_NAMES,
+  MAX_VISIBLE_ELEMENTS,
+  TIMEOUT
+}
diff --git a/ios/web/find_in_page/resources/find_in_page_native_api.js b/ios/web/find_in_page/resources/find_in_page_native_api.js
index 9ebb70b5..910c2b1 100644
--- a/ios/web/find_in_page/resources/find_in_page_native_api.js
+++ b/ios/web/find_in_page/resources/find_in_page_native_api.js
@@ -2,7 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CSS_CLASS_NAME_SELECT, Match, PartialMatch, Replacement, Section, Timer} from '//ios/web/find_in_page/resources/find_in_page.js';
+import {
+  Match,
+  PartialMatch,
+  Replacement,
+  Section,
+  Timer
+} from '//ios/web/find_in_page/resources/find_in_page.js';
+
+import {
+  CSS_CLASS_NAME,
+  CSS_CLASS_NAME_SELECT,
+  CSS_STYLE_ID,
+  IGNORE_NODE_NAMES,
+  MAX_VISIBLE_ELEMENTS,
+  TIMEOUT
+} from '//ios/web/find_in_page/resources/find_in_page_constants.js';
+
+import {
+  createRegex,
+  escapeHTML
+} from '//ios/web/find_in_page/resources/find_in_page_utils.js';
 
 /**
  * Based on code from the Google iOS app.
@@ -121,7 +141,6 @@
  */
 let visibleMatchesCountIndexIterator_ = 0;
 
-
 /**
  * Process all PartialMatches inside current Section. For current Section's
  * node.textContent, all texts that are match results will be wrapped in
@@ -152,7 +171,7 @@
     // Create the <chrome_find> Node for matching text.
     let newNode = oldNode.ownerDocument.createElement('chrome_find');
     newNode.setAttribute('class', CSS_CLASS_NAME);
-    newNode.innerHTML = escapeHTML_(oldNode.textContent.substring(
+    newNode.innerHTML = escapeHTML(oldNode.textContent.substring(
         partialMatch.begin - section.begin, partialMatch.end - section.begin));
     newNodes.push(newNode);
     previousEnd = partialMatch.end;
@@ -180,12 +199,6 @@
 let styleElement_ = null;
 
 /**
- * Maximum number of visible elements to count
- * @type {number}
- */
-const MAX_VISIBLE_ELEMENTS = 100;
-
-/**
  * A search is in progress.
  * @type {boolean}
  */
@@ -199,39 +212,6 @@
 let searchStateIsClean_ = true;
 
 /**
- * Node names that are not going to be processed.
- * @type {Object}
- */
-const IGNORE_NODE_NAMES = new Set([
-  'SCRIPT', 'STYLE', 'EMBED', 'OBJECT', 'SELECT', 'TEXTAREA', 'IFRAME',
-  'NOSCRIPT'
-]);
-
-/**
- * Class name of CSS element that highlights matches with yellow.
- * @type {string}
- */
-const CSS_CLASS_NAME = 'find_in_page';
-
-/**
- * ID of CSS style.
- * @type {string}
- */
-const CSS_STYLE_ID = '__gCrWeb.findInPageStyle';
-
-/**
- * Result passed back to app to indicate pumpSearch has reached timeout.
- * @type {number}
- */
-const TIMEOUT = -1;
-
-/**
- * Regex to escape regex special characters in a string.
- * @type {RegExp}
- */
-const REGEX_ESCAPER = /([.?*+^$[\]\\(){}|-])/g;
-
-/**
  * @return {Match} The currently selected Match. Returns null if no
  * currently selected match.
  */
@@ -243,16 +223,6 @@
 };
 
 /**
- * Creates the regex needed to find the text.
- * @param {string} findText Phrase to look for.
- * @return {RegExp} regex needed to find the text.
- */
-function getRegex_(findText) {
-  let regexString = '(' + escapeRegex_(findText) + ')';
-  return new RegExp(regexString, 'ig');
-};
-
-/**
  * Looks for a phrase in the DOM.
  * @param {string} string Phrase to look for like "ben franklin".
  * @param {number} timeout Maximum time to run.
@@ -283,7 +253,7 @@
   // Index tracking variables so search can be broken up into multiple calls.
   visibleMatchesCountIndexIterator_ = 0;
 
-  __gCrWeb.findInPage.regex = getRegex_(string);
+  __gCrWeb.findInPage.regex = createRegex(string);
 
   searchInProgress_ = true;
 
@@ -630,35 +600,3 @@
   }
   __gCrWeb.findInPage.hasInitialized = false;
 };
-
-/**
- * Helper function to find the absolute position of an element on the page.
- * @param {Element} elem Element to check.
- * @return {Array<number>} [x, y] positions.
- */
-function findAbsolutePosition_(elem) {
-  let boundingRect = elem.getBoundingClientRect();
-  return [
-    boundingRect.left + window.pageXOffset,
-    boundingRect.top + window.pageYOffset
-  ];
-};
-
-/**
- * @param {string} text Text to escape.
- * @return {string} escaped text.
- */
-function escapeHTML_(text) {
-  let unusedDiv = document.createElement('div');
-  unusedDiv.innerText = text;
-  return unusedDiv.innerHTML;
-};
-
-/**
- * Escapes regexp special characters.
- * @param {string} text Text to escape.
- * @return {string} escaped text.
- */
-function escapeRegex_(text) {
-  return text.replace(REGEX_ESCAPER, '\\$1');
-};
diff --git a/ios/web/find_in_page/resources/find_in_page_utils.ts b/ios/web/find_in_page/resources/find_in_page_utils.ts
new file mode 100644
index 0000000..fb51589
--- /dev/null
+++ b/ios/web/find_in_page/resources/find_in_page_utils.ts
@@ -0,0 +1,32 @@
+// Copyright 2022 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.
+
+/**
+ * Regex to escape regex special characters in a string.
+ * @type {RegExp}
+ */
+const REGEX_ESCAPER = /([.?*+^$[\]\\(){}|-])/g;
+
+/**
+ * Creates the regex needed to find the text.
+ * @param {string} findText Phrase to look for.
+ * @return {RegExp} regex needed to find the text.
+ */
+function createRegex(findText: string): RegExp {
+  const escapedText = findText.replace(REGEX_ESCAPER, '\\$1');
+  const regexString = '(' + escapedText + ')';
+  return new RegExp(regexString, 'ig');
+};
+
+/**
+ * @param {string} text Text to escape.
+ * @return {string} escaped text.
+ */
+function escapeHTML(text: string): string {
+  let unusedDiv = document.createElement('div');
+  unusedDiv.innerText = text;
+  return unusedDiv.innerHTML;
+};
+
+export {createRegex, escapeHTML}
diff --git a/ppapi/PRESUBMIT.py b/ppapi/PRESUBMIT.py
index 61e78a77..6138cc37 100644
--- a/ppapi/PRESUBMIT.py
+++ b/ppapi/PRESUBMIT.py
@@ -6,16 +6,26 @@
 import os
 import re
 import subprocess
+import sys
+
+
+# In this file `sys.executable` is used instead of
+# `input_api.python3_executable` because on Windows
+# `input_api.python3_executable` is `vpython3.bat` whereas `sys.executable` is
+# `python.exe`. If `input_api.python3_executable` is used, we need to explicitly
+# pass `shell=True` to `subprocess.Popen()`, which is a security risk
+# (https://docs.python.org/3/library/subprocess.html#security-considerations).
+#
+# TODO: Investigate the incompatibility of `input_api.python3_executable` on
+# Windows, for this particular PRESUBMIT script.
 
 
 USE_PYTHON3 = True
 
 
-def RunCmdAndCheck(cmd, err_string, output_api, cwd=None, warning=False,
-                   shell=False):
+def RunCmdAndCheck(cmd, err_string, output_api, cwd=None, warning=False):
   results = []
   p = subprocess.Popen(cmd, cwd=cwd,
-                       shell=shell,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
   (_, p_stderr) = p.communicate()
@@ -40,16 +50,12 @@
     if name_parts[0:2] == ['ppapi', 'generators']:
       generator_files.append(filename)
   if generator_files != []:
-    # TODO(crbug.com/1222512): Use sys.executable instead of
-    # input_api.python_executable once idl_tests.py is py3 compatible, drop
-    # shell=True in RunCmdAndCheck.
-    cmd = [input_api.python_executable, 'idl_tests.py']
+    cmd = [sys.executable, 'idl_tests.py']
     ppapi_dir = input_api.PresubmitLocalPath()
     results.extend(RunCmdAndCheck(cmd,
                                   'PPAPI IDL unittests failed.',
                                   output_api,
-                                  os.path.join(ppapi_dir, 'generators'),
-                                  shell=input_api.is_windows))
+                                  os.path.join(ppapi_dir, 'generators')))
   return results
 
 
@@ -162,11 +168,8 @@
   #     The command line is too long.
   files_per_command = 25 if input_api.is_windows else 1000
   results = []
-  for i in range(0, len(nacl_sdk_files), files_per_command):
-    # TODO(crbug.com/1222512): Use sys.executable instead of
-    # input_api.python_executable once idl_tests.py is py3 compatible, drop
-    # shell=True.
-    cmd = [input_api.python3_executable, verify_ppapi_py
+  for i in range(len(nacl_sdk_files), files_per_command):
+    cmd = [sys.executable, verify_ppapi_py
            ] + nacl_sdk_files[i:i + files_per_command]
     results.extend(
         RunCmdAndCheck(
@@ -176,8 +179,7 @@
                 'To ignore a file, add it to IGNORED_FILES in '
                 'native_client_sdk/src/build_tools/verify_ppapi.py)',
                 output_api,
-                warning=True,
-                shell=input_api.is_windows))
+                warning=True))
   return results
 
 # Verify that changes to ppapi/thunk/interfaces_* files have a corresponding
@@ -346,10 +348,7 @@
   #   --diff to generate a unified diff
   #   --out to pick which files to examine (only the ones in the CL)
   ppapi_dir = input_api.PresubmitLocalPath()
-  # TODO(crbug.com/1222512): Use sys.executable instead of
-  # input_api.python_executable once idl_tests.py is py3 compatible, drop
-  # shell=True in RunCmdAndCheck.
-  cmd = [input_api.python_executable, 'generator.py',
+  cmd = [sys.executable, 'generator.py',
          '--wnone', '--diff', '--test','--cgen', '--range=start,end']
 
   # Only generate output for IDL files references (as *.h or *.idl) in this CL
@@ -357,8 +356,7 @@
   cmd_results = RunCmdAndCheck(cmd,
                                'PPAPI IDL Diff detected: Run the generator.',
                                output_api,
-                               os.path.join(ppapi_dir, 'generators'),
-                               shell=input_api.is_windows)
+                               os.path.join(ppapi_dir, 'generators'))
   if cmd_results:
     results.extend(cmd_results)
 
diff --git a/ppapi/generators/idl_node.py b/ppapi/generators/idl_node.py
index feeb430..76ecfa7c 100755
--- a/ppapi/generators/idl_node.py
+++ b/ppapi/generators/idl_node.py
@@ -277,8 +277,8 @@
         my_releases = set([my_min])
 
       r = self.GetRelease(self.GetProperty('version'))
-      if not r in my_releases:
-        my_releases |= set([r])
+      if r is not None and r not in my_releases:
+        my_releases.add(r)
 
       # Break cycle if we reference ourselves
       if self in visited:
@@ -315,7 +315,7 @@
 
       for rel in child_releases | type_releases:
         if rel >= my_min and rel <= my_max:
-          my_releases |= set([rel])
+          my_releases.add(rel)
 
       self.releases = sorted(my_releases)
     return self.releases
diff --git a/ppapi/generators/idl_outfile.py b/ppapi/generators/idl_outfile.py
index 9b830ad..95dbd2ac 100755
--- a/ppapi/generators/idl_outfile.py
+++ b/ppapi/generators/idl_outfile.py
@@ -112,11 +112,12 @@
 
     if not self.always_write:
       if os.path.isfile(filename):
-        oldtext = open(filename, 'rb').read()
-        if self.IsEquivalent_(oldtext):
-          if GetOption('verbose'):
-            InfoOut.Log('Output %s unchanged.' % self.filename)
-          return False
+        with open(filename, 'r', encoding='utf-8') as fin:
+          oldtext = fin.read()
+          if self.IsEquivalent_(oldtext):
+            if GetOption('verbose'):
+              InfoOut.Log('Output %s unchanged.' % self.filename)
+            return False
 
     if GetOption('diff'):
       for line in difflib.unified_diff(oldtext.split('\n'), outtext.split('\n'),
@@ -134,9 +135,8 @@
         os.makedirs(basepath)
 
       if not GetOption('test'):
-        outfile = open(filename, 'wb')
-        outfile.write(outtext)
-        outfile.close();
+        with open(filename, 'w', newline='\n', encoding='utf=8') as fout:
+          fout.write(outtext)
         InfoOut.Log('Output %s written.' % self.filename)
       return True
 
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index cff54c5..512e7de 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -1070,10 +1070,11 @@
 
   def get_test_type_remapper(self):
     return {
-      # These are a specialization of isolated_scripts with a bunch of
-      # boilerplate command line arguments added to each one.
-      'android_webview_gpu_telemetry_tests': 'isolated_scripts',
-      'gpu_telemetry_tests': 'isolated_scripts',
+        # These are a specialization of isolated_scripts with a bunch of
+        # boilerplate command line arguments added to each one.
+        'android_webview_gpu_telemetry_tests': 'isolated_scripts',
+        'cast_streaming_tests': 'isolated_scripts',
+        'gpu_telemetry_tests': 'isolated_scripts',
     }
 
   def check_composition_type_test_suites(self, test_type,
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py
index 46ff340..515094a 100755
--- a/testing/buildbot/generate_buildbot_json_unittest.py
+++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -1843,7 +1843,7 @@
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
   "Fake Tester": {
-    "cast_streaming_tests": [
+    "isolated_scripts": [
       {
         "args": [
           "foo",
diff --git a/testing/clusterfuzz/common/fuzzy_types.py b/testing/clusterfuzz/common/fuzzy_types.py
index 27a8617..f5dd520 100644
--- a/testing/clusterfuzz/common/fuzzy_types.py
+++ b/testing/clusterfuzz/common/fuzzy_types.py
@@ -13,8 +13,6 @@
 import textwrap
 
 from . import utils
-if sys.version_info.major == 3:
-  unichr = chr    # pylint: disable=redefined-builtin
 
 
 def FuzzyInt(n):
@@ -37,36 +35,33 @@
 def FuzzyString(s):
   """Returns a string derived from the input by one of several mutations."""
   # First try some mutations that try to recognize certain types of strings
-  try:
-    s.decode("utf-8")  # These mutations only make sense for textual data
-  except UnicodeDecodeError:
-    pass
-  else:
-    chained_mutations = [
-      FuzzIntsInString,
-      FuzzBase64InString,
-      FuzzListInString,
-    ]
-    original = s
-    for mutation in chained_mutations:
-      s = mutation(s)
-      # Stop if we've modified the string and our coin comes up heads
-      if s != original and random.getrandbits(1):
-        return s
+  assert isinstance(s, str)
+  chained_mutations = [
+    FuzzIntsInString,
+    FuzzBase64InString,
+    FuzzListInString,
+  ]
+  original = s
+  for mutation in chained_mutations:
+    s = mutation(s)
+    # Stop if we've modified the string and our coin comes up heads
+    if s != original and random.getrandbits(1):
+      return s
 
   # If we're still here, apply a more generic mutation
   mutations = [
-    lambda s: "".join(random.choice(string.printable) for i in
+    lambda _: "".join(random.choice(string.printable) for _ in
       range(utils.UniformExpoInteger(0, 14))),
-    lambda s: "".join(unichr(random.randint(0, sys.maxunicode)) for i in
-      range(utils.UniformExpoInteger(0, 14))).encode("utf-8"),
-    lambda s: os.urandom(utils.UniformExpoInteger(0, 14)),
+    # We let through the surrogate. The decode exception is handled at caller.
+    lambda _: "".join(chr(random.randint(0, sys.maxunicode)) for _ in
+      range(utils.UniformExpoInteger(0, 14))).encode('utf-8', 'surrogatepass'),
+    lambda _: os.urandom(utils.UniformExpoInteger(0, 14)),
     lambda s: s * utils.UniformExpoInteger(1, 5),
     lambda s: s + "A" * utils.UniformExpoInteger(0, 14),
     lambda s: "A" * utils.UniformExpoInteger(0, 14) + s,
     lambda s: s[:-random.randint(1, max(1, len(s) - 1))],
     lambda s: textwrap.fill(s, random.randint(1, max(1, len(s) - 1))),
-    lambda s: "",
+    lambda _: "",
   ]
   return random.choice(mutations)(s)
 
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 3821f15..97b77f0 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2172,29 +2172,6 @@
             ]
         }
     ],
-    "CPSS-OnDeviceNotificationPredictions": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20220221",
-                    "params": {
-                        "holdback_chance": "0.3"
-                    },
-                    "enable_features": [
-                        "PermissionOnDeviceNotificationPredictions"
-                    ]
-                }
-            ]
-        }
-    ],
     "CWPCollectsETM": [
         {
             "platforms": [
@@ -6674,6 +6651,21 @@
             ]
         }
     ],
+    "PageInfoAboutThisSiteMoreInfo": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "PageInfoAboutThisSiteMoreInfo"
+                    ]
+                }
+            ]
+        }
+    ],
     "PageInfoDiscoverabilityTimeout": [
         {
             "platforms": [
@@ -7693,6 +7685,28 @@
             ]
         }
     ],
+    "ReadWritePasswordNotesBackupField": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "chromeos",
+                "chromeos_lacros",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ReadWritePasswordNotesBackupField"
+                    ]
+                }
+            ]
+        }
+    ],
     "ReduceOpsTaskSplitting": [
         {
             "platforms": [
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 82663ce..9cd78531 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -709,6 +709,8 @@
       InvalidEligibleHeader
       TooManyConcurrentRequests
       SourceAndTriggerHeaders
+      SourceIgnored
+      TriggerIgnored
 
   # Details for issues around "Attribution Reporting API" usage.
   # Explainer: https://github.com/WICG/attribution-reporting-api
diff --git a/third_party/blink/public/mojom/input/input_handler.mojom b/third_party/blink/public/mojom/input/input_handler.mojom
index 3b5cedc..d50da9cc 100644
--- a/third_party/blink/public/mojom/input/input_handler.mojom
+++ b/third_party/blink/public/mojom/input/input_handler.mojom
@@ -214,12 +214,31 @@
   kSentence,
 };
 
+// An enumeration that describes the allowed non-directional pan action for the
+// element under pointer being considered.
+enum PanAction {
+  // No pan action allowed.
+  kNone,
+  // Pan action is scroll.
+  kScroll,
+  // Pan action moves cursor when initial touch move is in horizontal direction,
+  // or scrolls in the vertical direction.
+  kMoveCursorOrScroll,
+  // Pan action is stylus writable.
+  kStylusWritable,
+};
+
 // Interface exposed by the browser to the renderer.
 interface WidgetInputHandlerHost {
   // When the renderer's main thread computes the touch action, send this to the
   // browser.
   SetTouchActionFromMain(cc.mojom.TouchAction touch_action);
 
+  // Sets the pan action possible for the element under pointer which could be
+  // one of the actions described under enum PanAction. Note that this is
+  // different from TouchAction and does not contain directional pan info.
+  SetPanAction(PanAction pan_action);
+
   // Sent by the compositor when input scroll events are dropped due to bounds
   // restrictions on the root scroll offset.
   DidOverscroll(DidOverscrollParams params);
diff --git a/third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h b/third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h
index 253c784..0e6f172 100644
--- a/third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h
+++ b/third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h
@@ -32,6 +32,8 @@
                               mojom::MediaStreamRequestResult result,
                               const WebString& result_name)>;
 
+  using KeepDeviceAliveForTransferCallback = base::OnceCallback<void(bool)>;
+
   // Source constraints key for
   // https://dev.w3.org/2011/webrtc/editor/getusermedia.html.
   static const char kSourceId[];
@@ -47,6 +49,16 @@
   // JavaScript call to GetUserMedia, e.g., a camera or microphone.
   const MediaStreamDevice& device() const { return device_; }
 
+  // Keeps a MediaStreamDevice alive until the MediaStreamTrack transfer
+  // corresponding to |transfer_id| is complete.
+  virtual void KeepDeviceAliveForTransfer(
+      base::UnguessableToken session_id,
+      base::UnguessableToken transfer_id,
+      KeepDeviceAliveForTransferCallback keep_alive_cb) {
+    NOTREACHED() << "KeepDeviceAliveForTransfer is not implemented.";
+    std::move(keep_alive_cb).Run(/*device_found=*/false);
+  }
+
   // Stops the source (by calling DoStopSource()) and runs FinalizeStopSource().
   void StopSource();
 
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc
index 9360547..3469fab 100644
--- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc
@@ -613,6 +613,11 @@
 bool V8ScriptValueSerializerForModules::WriteMediaStreamTrack(
     MediaStreamTrack* track,
     ExceptionState& exception_state) {
+  if (track->Ended()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "MediaStreamTrack has ended.");
+    return false;
+  }
   if (!track->serializable_session_id()) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kDataCloneError,
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
index ffecec42..e38982e5 100644
--- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
@@ -1262,6 +1262,44 @@
 }
 
 TEST(V8ScriptValueSerializerForModulesTest,
+     TransferClosedMediaStreamTrackFails) {
+  V8TestingScope scope;
+  ScriptState* script_state = scope.GetScriptState();
+  ExceptionState exception_state(scope.GetIsolate(),
+                                 ExceptionState::kExecutionContext, "Window",
+                                 "postMessage");
+
+  std::unique_ptr<MockMediaStreamVideoSource> mock_source(
+      base::WrapUnique(new MockMediaStreamVideoSource()));
+  MediaStreamDevice device;
+  base::UnguessableToken token = base::UnguessableToken::Create();
+  device.set_session_id(token);
+  mock_source->SetDevice(device);
+  MediaStreamSource* source = MakeGarbageCollected<MediaStreamSource>(
+      "test_id", MediaStreamSource::StreamType::kTypeVideo, "test_name",
+      false /* remote */, std::move(mock_source));
+  MediaStreamComponent* component =
+      MakeGarbageCollected<MediaStreamComponentImpl>("component_id", source);
+  component->SetContentHint(
+      static_cast<WebMediaStreamTrack::ContentHintType>(666));
+  MediaStreamTrack* blink_track = MakeGarbageCollected<MediaStreamTrackImpl>(
+      scope.GetExecutionContext(), component);
+  blink_track->stopTrack(scope.GetExecutionContext());
+
+  // Transferring a closed MediaStreamTrack should throw an error.
+  Transferables transferables;
+  transferables.media_stream_tracks.push_back(blink_track);
+  v8::Local<v8::Value> wrapper = ToV8(blink_track, scope.GetScriptState());
+  V8ScriptValueSerializer::Options serialize_options;
+  serialize_options.transferables = &transferables;
+  EXPECT_FALSE(
+      V8ScriptValueSerializerForModules(script_state, serialize_options)
+          .Serialize(wrapper, exception_state));
+  EXPECT_TRUE(HadDOMExceptionInModulesTest("InvalidStateError", script_state,
+                                           exception_state));
+}
+
+TEST(V8ScriptValueSerializerForModulesTest,
      TransferMediaStreamTrackInvalidContentHintFails) {
   V8TestingScope scope;
   ExceptionState exception_state(scope.GetIsolate(),
diff --git a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.cc.tmpl b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.cc.tmpl
index 1ddbddb..65b1d9a 100644
--- a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.cc.tmpl
+++ b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.cc.tmpl
@@ -44,18 +44,12 @@
   }
 }
 
-const CSSUnresolvedProperty& GetNonAliasPropertyInternal(CSSPropertyID id) {
-  DCHECK_NE(id, CSSPropertyID::kInvalid);
-  DCHECK_NE(id, CSSPropertyID::kVariable);
-  DCHECK_LE(id, kLastCSSProperty);  // last property id
-  static constexpr const CSSUnresolvedProperty* const property_classes[] = {
-    {% for property_class_data in property_classes_by_property_id %}
-    &property_{{property_class_data.property_id.lower()}},  // {{property_class_data.property_id}}
-    {% endfor %}
-  };
-  // Subtract 2 because CSSPropertyID::kInvalid and CSSPropertyID::kVariable do not
-  // appear in the array.
-  return *property_classes[static_cast<int>(id) - 2];
-}
+const CSSUnresolvedProperty* const kPropertyClasses[] = {
+  nullptr,  // kInvalid.
+  nullptr,  // kVariable.
+  {% for property_class_data in property_classes_by_property_id %}
+  &property_{{property_class_data.property_id.lower()}},  // {{property_class_data.property_id}}
+  {% endfor %}
+};
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.h.tmpl b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.h.tmpl
index d9a6c572..7a0ca5b2 100644
--- a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_property_instances.h.tmpl
@@ -14,8 +14,9 @@
 class CSSUnresolvedProperty;
 class CSSProperty;
 
+extern const CSSUnresolvedProperty* const kPropertyClasses[];
+
 const CSSUnresolvedProperty* GetAliasPropertyInternal(CSSPropertyID);
-const CSSUnresolvedProperty& GetNonAliasPropertyInternal(CSSPropertyID);
 
 {% for property_class_data in property_classes_by_property_id %}
 CORE_EXPORT const CSSProperty& Get{{property_class_data.property_id}}();
diff --git a/third_party/blink/renderer/core/css/cascade_layer_map.cc b/third_party/blink/renderer/core/css/cascade_layer_map.cc
index 74c8e16b..aa55feb 100644
--- a/third_party/blink/renderer/core/css/cascade_layer_map.cc
+++ b/third_party/blink/renderer/core/css/cascade_layer_map.cc
@@ -7,10 +7,6 @@
 #include "third_party/blink/renderer/core/css/rule_set.h"
 
 namespace blink {
-
-const unsigned CascadeLayerMap::kImplicitOuterLayerOrder =
-    std::numeric_limits<unsigned>::max();
-
 namespace {
 
 using CanonicalLayerMap =
diff --git a/third_party/blink/renderer/core/css/cascade_layer_map.h b/third_party/blink/renderer/core/css/cascade_layer_map.h
index 62d3c1b8..4d41565 100644
--- a/third_party/blink/renderer/core/css/cascade_layer_map.h
+++ b/third_party/blink/renderer/core/css/cascade_layer_map.h
@@ -17,7 +17,8 @@
 // layers in each sheet to the sorted layer order number.
 class CORE_EXPORT CascadeLayerMap : public GarbageCollected<CascadeLayerMap> {
  public:
-  static const unsigned kImplicitOuterLayerOrder;
+  static constexpr unsigned kImplicitOuterLayerOrder =
+      std::numeric_limits<unsigned>::max();
 
   explicit CascadeLayerMap(const ActiveStyleSheetVector&);
 
diff --git a/third_party/blink/renderer/core/css/container_query.h b/third_party/blink/renderer/core/css/container_query.h
index abc31fd..7c548c6 100644
--- a/third_party/blink/renderer/core/css/container_query.h
+++ b/third_party/blink/renderer/core/css/container_query.h
@@ -24,6 +24,8 @@
   explicit ContainerSelector(AtomicString name) : name_(std::move(name)) {}
   explicit ContainerSelector(PhysicalAxes physical_axes)
       : physical_axes_(physical_axes) {}
+  ContainerSelector(AtomicString name, LogicalAxes physical_axes)
+      : name_(std::move(name)), logical_axes_(physical_axes) {}
   ContainerSelector(AtomicString name, const MediaQueryExpNode&);
 
   const AtomicString& Name() const { return name_; }
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 0e843a0d..3fcc632b 100644
--- a/third_party/blink/renderer/core/css/element_rule_collector.cc
+++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -351,14 +351,13 @@
       rule_set->ContainerQueryIntervals());
   Seeker<StyleScope> scope_seeker(rule_set->ScopeIntervals());
 
-  unsigned rejected = 0;
   unsigned fast_rejected = 0;
   unsigned matched = 0;
   SelectorStatisticsCollector selector_statistics_collector;
   if (perf_trace_enabled)
     selector_statistics_collector.ReserveCapacity(rules->size());
 
-  for (const auto& rule_data : *rules) {
+  for (const RuleData& rule_data : *rules) {
     if (perf_trace_enabled) {
       selector_statistics_collector.EndCollectionForCurrentRule();
       selector_statistics_collector.BeginCollectionForRule(&rule_data);
@@ -382,7 +381,6 @@
     if (UNLIKELY(part_request && part_request->for_shadow_pseudo)) {
       if (!selector.IsAllowedAfterPart()) {
         DCHECK_EQ(selector.GetPseudoType(), CSSSelector::kPseudoPart);
-        rejected++;
         continue;
       }
       DCHECK_EQ(selector.Relation(), CSSSelector::kUAShadow);
@@ -396,12 +394,10 @@
     DCHECK(!context.is_inside_visited_link ||
            inside_link_ != EInsideLink::kNotInsideLink);
     if (!checker.Match(context, result)) {
-      rejected++;
       continue;
     }
     if (pseudo_style_request_.pseudo_id != kPseudoIdNone &&
         pseudo_style_request_.pseudo_id != result.dynamic_pseudo) {
-      rejected++;
       continue;
     }
     const ContainerQuery* container_query =
@@ -421,7 +417,6 @@
           result.dynamic_pseudo == kPseudoIdNone) {
         if (!EvaluateAndAddContainerQueries(*container_query,
                                             style_recalc_context_, result_)) {
-          rejected++;
           if (AffectsAnimations(rule_data))
             result_.SetConditionallyAffectsAnimations();
           continue;
@@ -447,6 +442,7 @@
   if (!style_engine.Stats())
     return;
 
+  unsigned rejected = rules->size() - fast_rejected - matched;
   INCREMENT_STYLE_STATS_COUNTER(style_engine, rules_rejected, rejected);
   INCREMENT_STYLE_STATS_COUNTER(style_engine, rules_fast_rejected,
                                 fast_rejected);
@@ -881,7 +877,8 @@
 
       if (dynamic_pseudo == kPseudoIdHighlight) {
         DCHECK(result.custom_highlight_name);
-        style_->SetHasCustomHighlightName(result.custom_highlight_name);
+        style_->SetHasCustomHighlightName(
+            AtomicString(result.custom_highlight_name));
       }
     } else if (dynamic_pseudo == kPseudoIdFirstLine && container_query) {
       style_->SetFirstLineDependsOnSizeContainerQueries(true);
diff --git a/third_party/blink/renderer/core/css/properties/css_unresolved_property.cc b/third_party/blink/renderer/core/css/properties/css_unresolved_property.cc
index 904443d3..2093af1 100644
--- a/third_party/blink/renderer/core/css/properties/css_unresolved_property.cc
+++ b/third_party/blink/renderer/core/css/properties/css_unresolved_property.cc
@@ -18,13 +18,6 @@
   return GetAliasPropertyInternal(id);
 }
 
-const CSSUnresolvedProperty& CSSUnresolvedProperty::GetNonAliasProperty(
-    CSSPropertyID id) {
-  if (id == CSSPropertyID::kVariable)
-    return GetCSSPropertyVariableInternal();
-  return GetNonAliasPropertyInternal(id);
-}
-
 const CSSUnresolvedProperty& CSSUnresolvedProperty::Get(CSSPropertyID id) {
   DCHECK_NE(id, CSSPropertyID::kInvalid);
   DCHECK_LE(id, kLastUnresolvedCSSProperty);
diff --git a/third_party/blink/renderer/core/css/properties/css_unresolved_property.h b/third_party/blink/renderer/core/css/properties/css_unresolved_property.h
index 772326c..c610cc86 100644
--- a/third_party/blink/renderer/core/css/properties/css_unresolved_property.h
+++ b/third_party/blink/renderer/core/css/properties/css_unresolved_property.h
@@ -14,6 +14,7 @@
 namespace blink {
 
 class ExecutionContext;
+const CSSUnresolvedProperty& GetCSSPropertyVariableInternal();
 
 // TODO(crbug.com/793288): audit and consider redesigning how aliases are
 // handled once more of project Ribbon is done and all use of aliases can be
@@ -57,13 +58,15 @@
   }
 
  protected:
-  static const CSSUnresolvedProperty& GetNonAliasProperty(CSSPropertyID);
+  static const CSSUnresolvedProperty& GetNonAliasProperty(CSSPropertyID id) {
+    if (id == CSSPropertyID::kVariable)
+      return GetCSSPropertyVariableInternal();
+    return *kPropertyClasses[static_cast<int>(id)];
+  }
 
-  constexpr CSSUnresolvedProperty() {}
+  constexpr CSSUnresolvedProperty() = default;
 };
 
-const CSSUnresolvedProperty& GetCSSPropertyVariableInternal();
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_UNRESOLVED_PROPERTY_H_
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
index 994f7a1..c9743297 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -1433,7 +1433,7 @@
   ASSERT_EQ(properties.size(), 3u);
 
   const uint16_t kImplicitOuterLayerOrder =
-      CascadeLayerMap::kImplicitOuterLayerOrder;
+      ClampTo<uint16_t>(CascadeLayerMap::kImplicitOuterLayerOrder);
 
   // div { display: block; }
   EXPECT_TRUE(properties[0].properties->HasProperty(CSSPropertyID::kDisplay));
@@ -1480,7 +1480,7 @@
   ASSERT_EQ(properties.size(), 4u);
 
   const uint16_t kImplicitOuterLayerOrder =
-      CascadeLayerMap::kImplicitOuterLayerOrder;
+      ClampTo<uint16_t>(CascadeLayerMap::kImplicitOuterLayerOrder);
 
   // div { display: block; }
   EXPECT_TRUE(properties[0].properties->HasProperty(CSSPropertyID::kDisplay));
@@ -1539,7 +1539,7 @@
   ASSERT_EQ(properties.size(), 3u);
 
   const uint16_t kImplicitOuterLayerOrder =
-      CascadeLayerMap::kImplicitOuterLayerOrder;
+      ClampTo<uint16_t>(CascadeLayerMap::kImplicitOuterLayerOrder);
 
   // div { display: block }
   EXPECT_TRUE(properties[0].properties->HasProperty(CSSPropertyID::kDisplay));
@@ -1593,7 +1593,7 @@
   ASSERT_EQ(properties.size(), 2u);
 
   const uint16_t kImplicitOuterLayerOrder =
-      CascadeLayerMap::kImplicitOuterLayerOrder;
+      ClampTo<uint16_t>(CascadeLayerMap::kImplicitOuterLayerOrder);
 
   // @layer { target { color: red } }"
   EXPECT_TRUE(properties[0].properties->HasProperty(CSSPropertyID::kColor));
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc
index 1d08215..de18ddd 100644
--- a/third_party/blink/renderer/core/css/selector_checker.cc
+++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -1661,7 +1661,7 @@
       // elements we have a single flag for tracking whether an element may
       // match _any_ ::highlight() element (kPseudoIdHighlight).
       if (!pseudo_argument_ || pseudo_argument_ == selector.Argument()) {
-        result.custom_highlight_name = selector.Argument();
+        result.custom_highlight_name = selector.Argument().Impl();
         return true;
       }
       return false;
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h
index 99bd1be..0ceb4a8b 100644
--- a/third_party/blink/renderer/core/css/selector_checker.h
+++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -191,7 +191,11 @@
 
    public:
     PseudoId dynamic_pseudo{kPseudoIdNone};
-    AtomicString custom_highlight_name;
+
+    // Comes from an AtomicString, but not stored as one to avoid
+    // the cost of checking the refcount on cleaning up from every
+    // Match() call. Owned by the CSS selector it came from.
+    StringImpl* custom_highlight_name{nullptr};
 
     // From the :has() argument selector checking, we need to get the element
     // that matches the leftmost compound selector to mark all possible :has()
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 02770e7360..f15da2c 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -6561,10 +6561,6 @@
   return nullptr;
 }
 
-void Element::SetContainerQueryEvaluator(ContainerQueryEvaluator* evaluator) {
-  EnsureElementRareData().SetContainerQueryEvaluator(evaluator);
-}
-
 bool Element::SkippedContainerStyleRecalc() const {
   if (!RuntimeEnabledFeatures::CSSContainerSkipStyleRecalcEnabled())
     return false;
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 533b83d..1be5ed6 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -1137,7 +1137,6 @@
   bool ActivateDisplayLockIfNeeded(DisplayLockActivationReason reason);
 
   ContainerQueryData* GetContainerQueryData() const;
-  void SetContainerQueryEvaluator(ContainerQueryEvaluator*);
   ContainerQueryEvaluator* GetContainerQueryEvaluator() const;
   bool SkippedContainerStyleRecalc() const;
 
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
index 9a44f43..748add1 100644
--- a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
+++ b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
@@ -420,6 +420,37 @@
   EXPECT_EQ(PhysicalRect(50, 50, 1, 1), CaretLocalRect());
 }
 
+TEST_P(CaretDisplayItemClientTest, PlainTextRTLCaretPosition) {
+  // LayoutNG-only test
+  if (!RuntimeEnabledFeatures::LayoutNGEnabled())
+    return;
+
+  LoadNoto();
+  SetBodyInnerHTML(
+      "<style>"
+      "  div { width: 100px; padding: 5px; font: 20px NotoArabic }"
+      "  #plaintext { unicode-bidi: plaintext }"
+      "</style>"
+      "<div id='regular' dir='rtl'>&#1575;&#1582;&#1578;&#1576;&#1585;</div>"
+      "<div id='plaintext'>&#1575;&#1582;&#1578;&#1576;&#1585;</div>");
+
+  auto* regular = GetDocument().getElementById("regular");
+  auto* regular_text_node = regular->firstChild();
+  const Position& regular_position =
+      Position::FirstPositionInNode(*regular_text_node);
+  const PhysicalRect regular_caret_rect =
+      ComputeCaretRect(PositionWithAffinity(regular_position));
+
+  auto* plaintext = GetDocument().getElementById("plaintext");
+  auto* plaintext_text_node = plaintext->firstChild();
+  const Position& plaintext_position =
+      Position::FirstPositionInNode(*plaintext_text_node);
+  const PhysicalRect plaintext_caret_rect =
+      ComputeCaretRect(PositionWithAffinity(plaintext_position));
+
+  EXPECT_EQ(regular_caret_rect, plaintext_caret_rect);
+}
+
 // http://crbug.com/1278559
 TEST_P(CaretDisplayItemClientTest, InsertSpaceToWhiteSpacePreWrapRTL) {
   LoadNoto();
@@ -516,6 +547,24 @@
   EXPECT_EQ(PhysicalRect(70, 0, 1, 10), CaretLocalRect());
 }
 
+// http://crbug.com/1330093
+TEST_P(CaretDisplayItemClientTest, CaretAtStartInWhiteSpacePreWrapRTL) {
+  LoadNoto();
+  SetBodyInnerHTML(
+      "<style>"
+      "  body { margin: 0; padding: 0; }"
+      "  div { white-space: pre-wrap; width: 90px; margin: 0; padding: 5px; "
+      "  font: 20px NotoArabic }"
+      "</style>"
+      "<div dir=rtl contenteditable>&#1575;&#1582;&#1578;&#1576;&#1585; "
+      "</div>");
+
+  const Element& div = *GetDocument().QuerySelector("div");
+  const Position& position = Position::FirstPositionInNode(div);
+  const PhysicalRect& rect = ComputeCaretRect(PositionWithAffinity(position));
+  EXPECT_EQ(94, rect.X());
+}
+
 class ParameterizedComputeCaretRectTest
     : public EditingTestBase,
       private ScopedLayoutNGForTest,
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
index cf79775..c31d5e5 100644
--- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc
+++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -78,6 +78,30 @@
                                       id_string, invalid_parameter);
 }
 
+void MaybeLogSourceIgnored(ExecutionContext* execution_context,
+                           uint64_t request_id,
+                           const String& json) {
+  if (json.IsNull())
+    return;
+
+  LogAuditIssue(execution_context,
+                AttributionReportingIssueType::kSourceIgnored,
+                /*element=*/nullptr, request_id,
+                /*invalid_parameter=*/json);
+}
+
+void MaybeLogTriggerIgnored(ExecutionContext* execution_context,
+                            uint64_t request_id,
+                            const String& json) {
+  if (json.IsNull())
+    return;
+
+  LogAuditIssue(execution_context,
+                AttributionReportingIssueType::kTriggerIgnored,
+                /*element=*/nullptr, request_id,
+                /*invalid_parameter=*/json);
+}
+
 }  // namespace
 
 bool CanRegisterAttributionInContext(LocalFrame* frame,
@@ -379,13 +403,15 @@
     return false;
   }
 
+  const auto& response_headers = response.HttpHeaderFields();
+  const AtomicString& source_json =
+      response_headers.Get(http_names::kAttributionReportingRegisterSource);
+  const AtomicString& trigger_json =
+      response_headers.Get(http_names::kAttributionReportingRegisterTrigger);
+
   // Only handle requests which are attempting to invoke the API.
-  if (!response.HttpHeaderFields().Contains(
-          http_names::kAttributionReportingRegisterSource) &&
-      !response.HttpHeaderFields().Contains(
-          http_names::kAttributionReportingRegisterTrigger)) {
+  if (source_json.IsNull() && trigger_json.IsNull())
     return false;
-  }
 
   const uint64_t request_id = request.InspectorId();
 
@@ -400,23 +426,23 @@
   // for a resource (even if `response` is for a redirect). This indicates
   // whether the redirect chain was configured for eligibility.
   // https://github.com/WICG/attribution-reporting-api/blob/main/EVENT.md#registering-attribution-sources
-  const AtomicString& header_value =
+  const AtomicString& eligible_header =
       resource->GetResourceRequest().HttpHeaderField(
           http_names::kAttributionReportingEligible);
 
-  if (header_value.IsNull()) {
+  if (eligible_header.IsNull()) {
     // All subresources are eligible to register triggers if they do *not*
     // specify the header.
     src_type = SrcType::kTrigger;
   } else {
     absl::optional<net::structured_headers::Dictionary> dict =
         net::structured_headers::ParseDictionary(
-            StringUTF8Adaptor(header_value).AsStringPiece());
+            StringUTF8Adaptor(eligible_header).AsStringPiece());
     if (!dict || dict->contains(kAttributionEligibleNavigationSource)) {
       LogAuditIssue(local_frame_->DomWindow(),
                     AttributionReportingIssueType::kInvalidEligibleHeader,
                     /*element=*/nullptr, request_id,
-                    /*invalid_parameter=*/header_value);
+                    /*invalid_parameter=*/eligible_header);
       return false;
     }
 
@@ -424,7 +450,6 @@
         dict->contains(kAttributionEligibleEventSource);
     const bool allows_trigger = dict->contains(kAttributionEligibleTrigger);
 
-    // TODO(johnidel): Consider logging a devtools issue here for early exits.
     if (allows_event_source && allows_trigger) {
       // We use an undetermined SrcType which indicates either a source or
       // trigger may be registered.
@@ -434,6 +459,9 @@
     } else if (allows_trigger) {
       src_type = SrcType::kTrigger;
     } else {
+      MaybeLogSourceIgnored(local_frame_->DomWindow(), request_id, source_json);
+      MaybeLogTriggerIgnored(local_frame_->DomWindow(), request_id,
+                             trigger_json);
       return false;
     }
   }
@@ -504,23 +532,28 @@
   scoped_refptr<const SecurityOrigin> reporting_origin =
       SecurityOrigin::Create(response.CurrentRequestUrl());
 
+  // TODO(apaseltiner): Avoid redundantly retrieving these headers when this
+  // method is invoked from `MaybeRegisterAttributionHeaders()`.
   const auto& headers = response.HttpHeaderFields();
   const AtomicString& source_json =
       headers.Get(http_names::kAttributionReportingRegisterSource);
   const AtomicString& trigger_json =
       headers.Get(http_names::kAttributionReportingRegisterTrigger);
 
-  // TODO(apaseltiner): Report a DevTools issue when `type_` and `headers` do
-  // not correspond correctly.
-
   switch (type_) {
     case SrcType::kSource:
+      MaybeLogTriggerIgnored(loader_->local_frame_->DomWindow(), request_id,
+                             trigger_json);
+
       if (!source_json.IsNull()) {
         HandleSourceRegistration(source_json, std::move(reporting_origin),
                                  request_id);
       }
       break;
     case SrcType::kTrigger:
+      MaybeLogSourceIgnored(loader_->local_frame_->DomWindow(), request_id,
+                            source_json);
+
       if (!trigger_json.IsNull()) {
         HandleTriggerRegistration(trigger_json, std::move(reporting_origin),
                                   request_id);
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index c804cc9..3b205ea 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -1023,6 +1023,9 @@
 void TestWidgetInputHandlerHost::SetTouchActionFromMain(
     cc::TouchAction touch_action) {}
 
+void TestWidgetInputHandlerHost::SetPanAction(
+    mojom::blink::PanAction pan_action) {}
+
 void TestWidgetInputHandlerHost::DidOverscroll(
     mojom::blink::DidOverscrollParamsPtr params) {}
 
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index f44e3d89..19db32e 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -585,6 +585,7 @@
   mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> BindNewRemote();
 
   void SetTouchActionFromMain(cc::TouchAction touch_action) override;
+  void SetPanAction(mojom::blink::PanAction pan_action) override;
   void DidOverscroll(mojom::blink::DidOverscrollParamsPtr params) override;
   void DidStartScrollingViewport() override;
   void ImeCancelComposition() override;
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index ea5e502..e169c480 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -3488,6 +3488,16 @@
   widget_base_->ProcessTouchAction(touch_action);
 }
 
+void WebFrameWidgetImpl::SetPanAction(mojom::blink::PanAction pan_action) {
+  if (!widget_base_->widget_input_handler_manager())
+    return;
+  mojom::blink::WidgetInputHandlerHost* host =
+      widget_base_->widget_input_handler_manager()->GetWidgetInputHandlerHost();
+  if (!host)
+    return;
+  host->SetPanAction(pan_action);
+}
+
 void WebFrameWidgetImpl::DidHandleGestureEvent(const WebGestureEvent& event) {
 #if BUILDFLAG(IS_ANDROID) || defined(USE_AURA)
   if (event.GetType() == WebInputEvent::Type::kGestureTap) {
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index a63dcc8..5811d25 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -544,6 +544,7 @@
 
   void ShowVirtualKeyboardOnElementFocus();
   void ProcessTouchAction(WebTouchAction touch_action);
+  void SetPanAction(mojom::blink::PanAction pan_action);
 
   // Called to update whether low latency input mode is enabled or not.
   void SetNeedsLowLatencyInput(bool);
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index 2e6c90972..1f9d9bf 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -258,12 +258,12 @@
   SetBooleanAttribute(html_names::kOpenAttr, true);
 
   SetIsModal(true);
-  document.UpdateStyleAndLayout(DocumentUpdateReason::kJavaScript);
 
   // Throw away the AX cache first, so the subsequent steps don't have a chance
   // of queuing up AX events on objects that would be invalidated when the cache
   // is thrown away.
   InertSubtreesChanged(document, old_modal_dialog);
+  document.UpdateStyleAndLayout(DocumentUpdateReason::kJavaScript);
 
   if (RuntimeEnabledFeatures::CloseWatcherEnabled()) {
     if (LocalDOMWindow* window = GetDocument().domWindow()) {
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index c1ddef7..68924ff8 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -1130,6 +1130,13 @@
       // scrollbar hovering.
       scrollbar->MouseMoved(mev.Event());
     }
+
+    // Set Effective pan action before Pointer cursor is updated.
+    const WebPointerEvent web_pointer_event(WebInputEvent::Type::kPointerMove,
+                                            mev.Event());
+    pointer_event_manager_->SendEffectivePanActionAtPointer(web_pointer_event,
+                                                            mev.InnerNode());
+
     LocalFrameView* view = frame_->View();
     if ((!is_remote_frame || is_portal) && view) {
       absl::optional<ui::Cursor> optional_cursor =
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index c88ec07..cbfc68c 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -8,6 +8,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "third_party/blink/public/common/input/web_touch_event.h"
 #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
 #include "third_party/blink/renderer/core/dom/events/event_path.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
@@ -797,6 +798,38 @@
   return WebInputEventResult::kHandledSuppressed;
 }
 
+void PointerEventManager::SendEffectivePanActionAtPointer(
+    const WebPointerEvent& event,
+    const Node* node_at_pointer) {
+  if (IsAnyTouchActive())
+    return;
+
+  TouchAction effective_touch_action = TouchAction::kAuto;
+  if (node_at_pointer) {
+    effective_touch_action = touch_action_util::EffectiveTouchActionAtPointer(
+        event, node_at_pointer);
+  }
+
+  mojom::blink::PanAction effective_pan_action;
+  if ((effective_touch_action & TouchAction::kPan) == TouchAction::kNone) {
+    // Stylus writing or move cursor are applicable only when touch action
+    // allows panning in at least one direction.
+    effective_pan_action = mojom::blink::PanAction::kNone;
+  } else if ((effective_touch_action & TouchAction::kInternalNotWritable) !=
+             TouchAction::kInternalNotWritable) {
+    // kInternalNotWritable bit is re-enabled, if tool type is not stylus.
+    // Hence, if this bit is not set, stylus writing is possible.
+    effective_pan_action = mojom::blink::PanAction::kStylusWritable;
+  } else if ((effective_touch_action & TouchAction::kInternalPanXScrolls) !=
+             TouchAction::kInternalPanXScrolls) {
+    effective_pan_action = mojom::blink::PanAction::kMoveCursorOrScroll;
+  } else {
+    effective_pan_action = mojom::blink::PanAction::kScroll;
+  }
+
+  frame_->GetChromeClient().SetPanAction(frame_, effective_pan_action);
+}
+
 WebInputEventResult PointerEventManager::SendMousePointerEvent(
     Element* target,
     const WebInputEvent::Type event_type,
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.h b/third_party/blink/renderer/core/input/pointer_event_manager.h
index 438e465e..8bd04c4 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.h
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.h
@@ -66,6 +66,9 @@
       const Vector<WebMouseEvent>& coalesced_events,
       const Vector<WebMouseEvent>& predicted_events);
 
+  void SendEffectivePanActionAtPointer(const WebPointerEvent& event,
+                                       const Node* node_at_pointer);
+
   // Resets the internal state of this object.
   void Clear();
 
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
index 2f49ce09..abdf93a 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
@@ -7,6 +7,7 @@
 #include <limits>
 #include <memory>
 
+#include "base/test/scoped_feature_list.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -16,6 +17,8 @@
 #include "third_party/blink/renderer/core/testing/sim/sim_request.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -579,4 +582,218 @@
   ASSERT_EQ(callback->last_movement_y_, -321);
 }
 
+using PanAction = blink::mojom::PanAction;
+
+class PanActionWidgetInputHandlerHost
+    : public frame_test_helpers::TestWidgetInputHandlerHost {
+ public:
+  void SetPanAction(PanAction pan_action) override { pan_action_ = pan_action; }
+
+  void ResetPanAction() { pan_action_ = PanAction::kNone; }
+
+  PanAction pan_action() const { return pan_action_; }
+
+ private:
+  PanAction pan_action_ = PanAction::kNone;
+};
+
+class PanActionTrackingWebFrameWidget : public SimWebFrameWidget {
+ public:
+  template <typename... Args>
+  explicit PanActionTrackingWebFrameWidget(Args&&... args)
+      : SimWebFrameWidget(std::forward<Args>(args)...) {}
+
+  // frame_test_helpers::TestWebFrameWidget overrides.
+  frame_test_helpers::TestWidgetInputHandlerHost* GetInputHandlerHost()
+      override {
+    return &input_handler_host_;
+  }
+
+  void ResetPanAction() { input_handler_host_.ResetPanAction(); }
+
+  PanAction LastPanAction() { return input_handler_host_.pan_action(); }
+
+ private:
+  PanActionWidgetInputHandlerHost input_handler_host_;
+};
+
+class PanActionPointerEventTest : public PointerEventManagerTest {
+ public:
+  PanActionPointerEventTest() {
+    feature_list_.InitWithFeatures({blink::features::kStylusWritingToInput},
+                                   {});
+  }
+
+  SimWebFrameWidget* CreateSimWebFrameWidget(
+      base::PassKey<WebLocalFrame> pass_key,
+      CrossVariantMojoAssociatedRemote<
+          mojom::blink::FrameWidgetHostInterfaceBase> frame_widget_host,
+      CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase>
+          frame_widget,
+      CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase>
+          widget_host,
+      CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase>
+          widget,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      const viz::FrameSinkId& frame_sink_id,
+      bool hidden,
+      bool never_composited,
+      bool is_for_child_local_root,
+      bool is_for_nested_main_frame,
+      bool is_for_scalable_page,
+      SimCompositor* compositor) override {
+    return MakeGarbageCollected<PanActionTrackingWebFrameWidget>(
+        compositor, pass_key, std::move(frame_widget_host),
+        std::move(frame_widget), std::move(widget_host), std::move(widget),
+        std::move(task_runner), frame_sink_id, hidden, never_composited,
+        is_for_child_local_root, is_for_nested_main_frame,
+        is_for_scalable_page);
+  }
+
+ protected:
+  // Sets inner HTML and runs document lifecycle.
+  void SetBodyInnerHTML(const String& body_content) {
+    GetDocument().body()->setInnerHTML(body_content, ASSERT_NO_EXCEPTION);
+    WebView().MainFrameWidget()->UpdateLifecycle(WebLifecycleUpdate::kAll,
+                                                 DocumentUpdateReason::kTest);
+  }
+
+  PanActionTrackingWebFrameWidget* GetWidget() {
+    return static_cast<PanActionTrackingWebFrameWidget*>(
+        WebView().MainFrameWidget());
+  }
+
+  WebMouseEvent CreateTestMouseMoveEvent(
+      WebPointerProperties::PointerType pointer_type,
+      const gfx::PointF& coordinates) {
+    WebMouseEvent event(WebInputEvent::Type::kMouseMove, coordinates,
+                        coordinates, WebPointerProperties::Button::kNoButton,
+                        /* click_count */ 0, /* modifiers */ 0,
+                        WebInputEvent::GetStaticTimeStampForTests());
+    event.pointer_type = pointer_type;
+    return event;
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_F(PanActionPointerEventTest, PanActionStylusWritable) {
+  ScopedStylusHandwritingForTest stylus_handwriting(true);
+  GetDocument().SetBaseURLOverride(KURL("http://test.com"));
+  SetBodyInnerHTML(R"HTML(
+    <input type=text style='width: 100px; height: 100px;'>
+  )HTML");
+
+  PanActionTrackingWebFrameWidget* widget = GetWidget();
+
+  // Pan action to be stylus writable for contenteditable with pointer as kPen.
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kPen,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kStylusWritable);
+
+  // Pan action is not stylus writable when pointer type is kMouse.
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kMouse,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_NE(widget->LastPanAction(), PanAction::kStylusWritable);
+
+  // Pan action is stylus writable when pointer type is kEraser.
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kEraser,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kStylusWritable);
+}
+
+TEST_F(PanActionPointerEventTest, PanActionMoveCursor) {
+  ScopedStylusHandwritingForTest stylus_handwriting(true);
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeatures({::features::kSwipeToMoveCursor}, {});
+  if (!::features::IsSwipeToMoveCursorEnabled())
+    return;
+
+  GetDocument().SetBaseURLOverride(KURL("http://test.com"));
+  SetBodyInnerHTML(R"HTML(
+    <input type=password style='width: 100px; height: 100px;'>
+  )HTML");
+
+  // Pan action is expected to be kMoveCursorOrScroll for password inputs.
+  PanActionTrackingWebFrameWidget* widget = GetWidget();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kPen,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kMoveCursorOrScroll);
+}
+
+TEST_F(PanActionPointerEventTest, PanActionNoneAndScroll) {
+  ScopedStylusHandwritingForTest stylus_handwriting(true);
+  GetDocument().SetBaseURLOverride(KURL("http://test.com"));
+  SetBodyInnerHTML(R"HTML(
+    <div id='target' style='width: 100px; height: 100px; touch-action: none'/>
+  )HTML");
+
+  PanActionTrackingWebFrameWidget* widget = GetWidget();
+
+  // Pan action set to kNone when touch action does not allow panning.
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kPen,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+
+  // Pan action to be scroll when element under pointer allows panning but does
+  // not allow both swipe to move cursor and stylus writing.
+  Element* target = GetDocument().getElementById("target");
+  target->setAttribute(html_names::kStyleAttr, "touch-action: pan");
+  widget->UpdateLifecycle(WebLifecycleUpdate::kAll,
+                          DocumentUpdateReason::kTest);
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kPen,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kScroll);
+}
+
+TEST_F(PanActionPointerEventTest, PanActionNotSetWhenTouchActive) {
+  ScopedStylusHandwritingForTest stylus_handwriting(true);
+  GetDocument().SetBaseURLOverride(KURL("http://test.com"));
+  SetBodyInnerHTML(R"HTML(
+    <input type=text style='width: 100px; height: 100px;'>
+  )HTML");
+
+  std::unique_ptr<WebPointerEvent> event =
+      CreateTestPointerEvent(WebInputEvent::Type::kPointerDown,
+                             WebPointerProperties::PointerType::kPen,
+                             gfx::PointF(50, 50), gfx::PointF(50, 50), 1, 1);
+  PanActionTrackingWebFrameWidget* widget = GetWidget();
+
+  // Send pointer down before move.
+  widget->HandleInputEvent(
+      WebCoalescedInputEvent(std::move(event), {}, {}, ui::LatencyInfo()));
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+
+  // Pan action is not updated when touch is active.
+  GetEventHandler().HandleMouseMoveEvent(
+      CreateTestMouseMoveEvent(WebPointerProperties::PointerType::kPen,
+                               gfx::PointF(50, 50)),
+      Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
+  test::RunPendingTasks();
+  ASSERT_EQ(widget->LastPanAction(), PanAction::kNone);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/input/touch_action_util.cc b/third_party/blink/renderer/core/input/touch_action_util.cc
index 1fee90b..205fe44 100644
--- a/third_party/blink/renderer/core/input/touch_action_util.cc
+++ b/third_party/blink/renderer/core/input/touch_action_util.cc
@@ -21,16 +21,21 @@
 TouchAction EffectiveTouchActionAtPointerDown(const WebPointerEvent& event,
                                               const Node* pointerdown_node) {
   DCHECK(event.GetType() == WebInputEvent::Type::kPointerDown);
-  DCHECK(pointerdown_node);
+  return EffectiveTouchActionAtPointer(event, pointerdown_node);
+}
+
+TouchAction EffectiveTouchActionAtPointer(const WebPointerEvent& event,
+                                          const Node* node_at_pointer) {
+  DCHECK(node_at_pointer);
 
   TouchAction effective_touch_action =
-      ComputeEffectiveTouchAction(*pointerdown_node);
+      ComputeEffectiveTouchAction(*node_at_pointer);
 
   if ((effective_touch_action & TouchAction::kPanX) != TouchAction::kNone) {
     // Effective touch action is computed during style before we know whether
     // any ancestor supports horizontal scrolling, so we need to check it here.
     if (LayoutBox::HasHorizontallyScrollableAncestor(
-            pointerdown_node->GetLayoutObject())) {
+            node_at_pointer->GetLayoutObject())) {
       // If the node or its parent is horizontal scrollable, we need to disable
       // swipe to move cursor.
       effective_touch_action |= TouchAction::kInternalPanXScrolls;
diff --git a/third_party/blink/renderer/core/input/touch_action_util.h b/third_party/blink/renderer/core/input/touch_action_util.h
index 76120e0d0..a5c5934 100644
--- a/third_party/blink/renderer/core/input/touch_action_util.h
+++ b/third_party/blink/renderer/core/input/touch_action_util.h
@@ -19,6 +19,9 @@
 TouchAction EffectiveTouchActionAtPointerDown(const WebPointerEvent& event,
                                               const Node* pointerdown_node);
 
+TouchAction EffectiveTouchActionAtPointer(const WebPointerEvent& event,
+                                          const Node* node_at_pointer);
+
 }  // namespace touch_action_util
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
index 5cb5fa8..ed0f4a60 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
@@ -163,6 +163,11 @@
     case AttributionReportingIssueType::kSourceAndTriggerHeaders:
       return protocol::Audits::AttributionReportingIssueTypeEnum::
           SourceAndTriggerHeaders;
+    case AttributionReportingIssueType::kSourceIgnored:
+      return protocol::Audits::AttributionReportingIssueTypeEnum::SourceIgnored;
+    case AttributionReportingIssueType::kTriggerIgnored:
+      return protocol::Audits::AttributionReportingIssueTypeEnum::
+          TriggerIgnored;
   }
 }
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
index 961c6d52..95845c9 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
@@ -112,6 +112,8 @@
   kInvalidEligibleHeader,
   kTooManyConcurrentRequests,
   kSourceAndTriggerHeaders,
+  kSourceIgnored,
+  kTriggerIgnored,
 };
 
 enum class SharedArrayBufferIssueType {
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
index bc8297d4..b288bac 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -1631,7 +1631,8 @@
   StyleResolver& style_resolver = element->GetDocument().GetStyleResolver();
   Element* container = style_resolver.FindContainerForElement(
       element,
-      ContainerSelector(AtomicString(container_name.fromMaybe(g_null_atom))));
+      ContainerSelector(AtomicString(container_name.fromMaybe(g_null_atom)),
+                        kLogicalAxisInline));
   if (container)
     *container_node_id = PushNodePathToFrontend(container);
   return Response::Success();
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
index 2caf828..3a1474d 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
@@ -257,6 +257,8 @@
   protocol::Response getFileInfo(const String& object_id,
                                  String* path) override;
 
+  // Find the closest size query container ascendant for a node given an
+  // optional container-name.
   protocol::Response getContainerForNode(
       int node_id,
       protocol::Maybe<String> container_name,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
index 9d89c46..fadd9738 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
@@ -158,9 +158,7 @@
   const ComputedStyle& block_style = fragment.Style();
   bool should_align_caret_right =
       ShouldAlignCaretRight(block_style.GetTextAlign(is_last_line),
-                            line_box.Current().BaseDirection()) &&
-      (style.GetUnicodeBidi() != UnicodeBidi::kPlaintext ||
-       IsLtr(ResolvedDirection(cursor)));
+                            line_box.Current().BaseDirection());
 
   // For horizontal text, adjust the location in the x direction to ensure that
   // it completely falls in the union of line box and containing block, and
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index 1fe7f09..1b25f94 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -160,31 +160,21 @@
   if (IsLtr(line_info->BaseDirection()))
     return LayoutUnit();
 
-  // If the hang_width cause overflow, we don't want to adjust the line_offset
-  // so that it becomes negative, which causes some difficulties for the
-  // NGLayoutOverflowCalculator to apply its own adjustements in the
-  // AdjustOverflowForHanging function. Instead, we'll shift the line items so
-  // that we ignore the hanging width when the NGInlineLayoutStateStack computes
-  // their positions in ComputeInlinePositions function.
+  // If !line_info->ShouldHangTrailingSpaces(), the hang width is not considered
+  // in ApplyTextAlign, and so line_offset points to where the left edge of the
+  // hanging spaces should be. Since the line box rect has to start at the left
+  // edge of the text instead (needed for caret positioning), we increase
+  // line_offset.
   LayoutUnit hang_width = line_info->HangWidth();
-  if (line_offset < hang_width) {
-    // If we haven't considered the hang_width in ApplyTextAlign, we might end
-    // up with a negative line_offset, so shift the offset to ignore hanging
-    // spaces.
-    if (!line_info->ShouldHangTrailingSpaces())
-      line_offset += hang_width;
-    return -hang_width;
+  if (!line_info->ShouldHangTrailingSpaces()) {
+    line_offset += hang_width;
   }
 
-  // At this point we have a RTL line with hanging spaces that shouldn't be
-  // ignored based on the text-align property. Hence the final line_offset value
-  // should consider the hang_width. Note that this line_offset will be used
-  // later to compute the caret position in ComputeLocalCaretRectAtTextOffset,
-  // that's why we need to adjust the offset. Once we adjust the line_offset, we
-  // can use 0 as initial position for the line items, as we do in the case of a
-  // LTR line.
-  line_offset -= hang_width;
-  return LayoutUnit();
+  // Now line_offset always points to where the left edge of the text should be.
+  // If there are any hanging spaces, the starting position of the line must be
+  // offset by the width of the hanging spaces so that the text starts at
+  // line_offset.
+  return -hang_width;
 }
 
 void NGInlineLayoutAlgorithm::RebuildBoxStates(
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
index d387a63..cc65d09 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
@@ -7,6 +7,7 @@
 #include <sstream>
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/renderer/core/dom/tag_collection.h"
+#include "third_party/blink/renderer/core/html/forms/html_text_area_element.h"
 #include "third_party/blink/renderer/core/layout/layout_block_flow.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h"
@@ -729,6 +730,86 @@
                 *To<LayoutBlockFlow>(GetLayoutObjectByElementId("target"))));
 }
 
+TEST_F(NGInlineLayoutAlgorithmTest, LineBoxWithHangingWidthRTLRightAligned) {
+  LoadAhem();
+  InsertStyleElement(
+      "textarea {"
+      "  width: 100px;"
+      "  text-align: right;"
+      "  font: 10px/10px Ahem;"
+      "}");
+  SetBodyInnerHTML(R"HTML(
+    <!DOCTYPE html>
+    <textarea dir="rtl" id="hangingDoesntOverflow">abc  </textarea>
+    <textarea dir="rtl" id="hangingOverflows">abc        </textarea>
+  )HTML");
+
+  HTMLTextAreaElement* hanging_doesnt_overflow =
+      To<HTMLTextAreaElement>(GetElementById("hangingDoesntOverflow"));
+  NGInlineCursor hanging_doesnt_overflow_cursor(*To<LayoutBlockFlow>(
+      hanging_doesnt_overflow->InnerEditorElement()->GetLayoutObject()));
+  hanging_doesnt_overflow_cursor.MoveToFirstLine();
+  EXPECT_TRUE(hanging_doesnt_overflow_cursor.IsNotNull());
+  PhysicalRect hanging_doesnt_overflow_rect(
+      hanging_doesnt_overflow_cursor.Current().OffsetInContainerFragment(),
+      hanging_doesnt_overflow_cursor.Current().Size());
+  EXPECT_EQ(PhysicalRect(70, 0, 30, 10), hanging_doesnt_overflow_rect);
+
+  HTMLTextAreaElement* hanging_overflows =
+      To<HTMLTextAreaElement>(GetElementById("hangingOverflows"));
+  NGInlineCursor hanging_overflows_cursor(*To<LayoutBlockFlow>(
+      hanging_overflows->InnerEditorElement()->GetLayoutObject()));
+  hanging_overflows_cursor.MoveToFirstLine();
+  EXPECT_TRUE(hanging_overflows_cursor.IsNotNull());
+  PhysicalRect hanging_overflows_rect(
+      hanging_overflows_cursor.Current().OffsetInContainerFragment(),
+      hanging_overflows_cursor.Current().Size());
+  EXPECT_EQ(PhysicalRect(70, 0, 30, 10), hanging_overflows_rect);
+}
+
+TEST_F(NGInlineLayoutAlgorithmTest, LineBoxWithHangingWidthRTLCenterAligned) {
+  LoadAhem();
+  InsertStyleElement(
+      "textarea {"
+      "  width: 100px;"
+      "  text-align: center;"
+      "  font: 10px/10px Ahem;"
+      "}");
+  SetBodyInnerHTML(R"HTML(
+    <!DOCTYPE html>
+    <textarea dir="rtl" id="a">abc  </textarea>
+    <textarea dir="rtl" id="b">abc      </textarea>
+  )HTML");
+
+  HTMLTextAreaElement* a_textarea =
+      To<HTMLTextAreaElement>(GetElementById("a"));
+  NGInlineCursor a_cursor(*To<LayoutBlockFlow>(
+      a_textarea->InnerEditorElement()->GetLayoutObject()));
+  a_cursor.MoveToFirstLine();
+  EXPECT_TRUE(a_cursor.IsNotNull());
+  PhysicalRect a_rect(a_cursor.Current().OffsetInContainerFragment(),
+                      a_cursor.Current().Size());
+  // The line size is 30px and the hanging width is 20px. The rectangle
+  // containing the line and the hanging width is centered, so its right edge
+  // is at (100 + 30 + 20)/2 = 75px. Since the line's base direction is RTL, the
+  // text is at the right and its left edge is at 75px - 30 = 45px.
+  EXPECT_EQ(PhysicalRect(45, 0, 30, 10), a_rect);
+
+  HTMLTextAreaElement* b_textarea =
+      To<HTMLTextAreaElement>(GetElementById("b"));
+  NGInlineCursor b_cursor(*To<LayoutBlockFlow>(
+      b_textarea->InnerEditorElement()->GetLayoutObject()));
+  b_cursor.MoveToFirstLine();
+  EXPECT_TRUE(b_cursor.IsNotNull());
+  PhysicalRect b_rect(b_cursor.Current().OffsetInContainerFragment(),
+                      b_cursor.Current().Size());
+  // The line size is 30px and the hanging width is 60px. The rectangle
+  // containing the line and the hanging width is centered, so its right edge
+  // is at (100 + 30 + 60)/2 = 95px. Since the line's base direction is RTL, the
+  // text is at the right and its left edge is at 95px - 30 = 65px.
+  EXPECT_EQ(PhysicalRect(65, 0, 30, 10), b_rect);
+}
+
 #undef MAYBE_VerticalAlignBottomReplaced
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h
index d44adfd6..a2d7e979 100644
--- a/third_party/blink/renderer/core/loader/empty_clients.h
+++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -236,6 +236,7 @@
   void SetNeedsUnbufferedInputForDebugger(LocalFrame*, bool) override {}
   void RequestUnbufferedInputEvents(LocalFrame*) override {}
   void SetTouchAction(LocalFrame*, TouchAction) override {}
+  void SetPanAction(LocalFrame*, mojom::blink::PanAction pan_action) override {}
   void DidAssociateFormControlsAfterLoad(LocalFrame*) override {}
   String AcceptLanguages() override;
   void RegisterPopupOpeningObserver(PopupOpeningObserver*) override {}
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h
index 881412b7..d5ea1ee 100644
--- a/third_party/blink/renderer/core/page/chrome_client.h
+++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -40,6 +40,7 @@
 #include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h"
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/forms/external_date_time_chooser.h"
@@ -448,6 +449,8 @@
   virtual void SetNeedsUnbufferedInputForDebugger(LocalFrame*, bool) = 0;
   virtual void RequestUnbufferedInputEvents(LocalFrame*) = 0;
   virtual void SetTouchAction(LocalFrame*, TouchAction) = 0;
+  virtual void SetPanAction(LocalFrame*,
+                            mojom::blink::PanAction pan_action) = 0;
 
   // Checks if there is an opened popup, called by LayoutMenuList::showPopUp().
   virtual bool HasOpenedPopup() const = 0;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 06aed9b..00ce475f 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -1145,6 +1145,17 @@
   widget->ProcessTouchAction(touch_action);
 }
 
+void ChromeClientImpl::SetPanAction(LocalFrame* frame,
+                                    mojom::blink::PanAction pan_action) {
+  DCHECK(frame);
+  WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(frame);
+  WebFrameWidgetImpl* widget = web_frame->LocalRootFrameWidget();
+  if (!widget)
+    return;
+
+  widget->SetPanAction(pan_action);
+}
+
 void ChromeClientImpl::DidAssociateFormControlsAfterLoad(LocalFrame* frame) {
   if (auto* fill_client = AutofillClientFromFrame(frame))
     fill_client->DidAssociateFormControlsDynamically();
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h
index 6b8d68c..5c6d89f 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.h
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -197,6 +197,7 @@
   void SetNeedsUnbufferedInputForDebugger(LocalFrame*, bool immediate) override;
   void RequestUnbufferedInputEvents(LocalFrame*) override;
   void SetTouchAction(LocalFrame*, TouchAction) override;
+  void SetPanAction(LocalFrame*, mojom::blink::PanAction pan_action) override;
 
   void AttachRootLayer(scoped_refptr<cc::Layer>,
                        LocalFrame* local_root) override;
diff --git a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/PRESUBMIT.py b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/PRESUBMIT.py
index 8b5b6a4..e3ca170 100644
--- a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/PRESUBMIT.py
+++ b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/PRESUBMIT.py
@@ -3,18 +3,20 @@
 # found in the LICENSE file.
 """Script that runs tests before uploading a patch."""
 
+
 USE_PYTHON3 = True
 
 
 def _RunTests(input_api, output_api):
     """Runs all test files in the directory."""
-    cmd_name = 'all_python_tests'
-    cmd = ['python', '-m', 'unittest', 'discover', '-p', '*test.py']
-    test_cmd = input_api.Command(
-        name=cmd_name, cmd=cmd, kwargs={}, message=output_api.PresubmitError)
-    if input_api.verbose:
-        print('Running ' + cmd_name)
-    return input_api.RunTests([test_cmd])
+    return input_api.canned_checks.RunUnitTests(
+        input_api,
+        output_api, [
+            input_api.os_path.join(input_api.PresubmitLocalPath(),
+                                   'fuzz_integration_test.py')
+        ],
+        run_on_python2=not USE_PYTHON3,
+        skip_shebang_check=True)
 
 
 def CheckChangeOnUpload(input_api, output_api):
diff --git a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/constraints.py b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/constraints.py
index e4ed02a..34a6cfe 100644
--- a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/constraints.py
+++ b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/constraints.py
@@ -79,20 +79,29 @@
     Returns:
       A single line string surrounded by quotes.
     """
+
+    def _PostProcFuzzyStr(fuzzed):
+        # Escape 'escape' characters.
+        fuzzed = fuzzed.replace('\\', r'\\')
+        # Escape quote characters.
+        fuzzed = fuzzed.replace('\'', r'\'')
+        # Put everything in a single line.
+        fuzzed = '\\n'.join(fuzzed.split())
+        return _ToJsStr(fuzzed)
+
     while True:
         fuzzed_string = fuzzy_types.FuzzyString(s)
-        try:
-            fuzzed_string = fuzzed_string.decode('utf8')
-        except UnicodeDecodeError:
-            print 'Can\'t decode fuzzed string. Trying again.'
+        if isinstance(fuzzed_string, bytes):
+            try:
+                fuzzed_string = fuzzed_string.decode('utf-8')
+            except UnicodeDecodeError:
+                print("Can't decode fuzzed bytes. Trying again.")
+                continue
+            else:
+                return _PostProcFuzzyStr(fuzzed_string)
         else:
-            # Escape 'escape' characters.
-            fuzzed_string = fuzzed_string.replace('\\', r'\\')
-            # Escape quote characters.
-            fuzzed_string = fuzzed_string.replace('\'', r'\'')
-            # Put everything in a single line.
-            fuzzed_string = '\\n'.join(fuzzed_string.split())
-            return _ToJsStr(fuzzed_string)
+            assert isinstance(fuzzed_string, str)
+            return _PostProcFuzzyStr(fuzzed_string)
 
 
 def _get_array_of_random_ints(max_length, max_value):
@@ -101,7 +110,7 @@
     exp_max_value = math.log(max_value, 2)
     return '[{}]'.format(', '.join(
         str(utils.UniformExpoInteger(0, exp_max_value))
-        for _ in xrange(length)))
+        for _ in range(length)))
 
 
 def _get_typed_array():
@@ -389,7 +398,7 @@
         ' service = Array.isArray(services)'\
         ' ? services[{} % services.length]'\
         ' : services'
-    return string.format(random.randint(0, sys.maxint))
+    return string.format(random.randint(0, sys.maxsize))
 
 
 def get_pick_a_characteristic():
@@ -401,7 +410,7 @@
         ' characteristic = Array.isArray(characteristics)'\
         ' ? characteristics[{} % characteristics.length]'\
         ' : characteristics'
-    return string.format(random.randint(0, sys.maxint))
+    return string.format(random.randint(0, sys.maxsize))
 
 
 def get_reload_id():
diff --git a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
index d9b834f2..2e8b484 100644
--- a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
+++ b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
@@ -20,12 +20,11 @@
 import parameter_fuzzer
 import test_case_fuzzer
 
-JS_FILES_AND_PARAMETERS = ((u'testharness.js', u'INCLUDE_TESTHARNESS'),
-                           (u'testharnessreport.js',
-                            u'INCLUDE_REPORT'), (u'bluetooth-test.js',
-                                                 u'INCLUDE_BLUETOOTH_TEST'),
-                           (u'bluetooth-fake-devices.js',
-                            u'INCLUDE_BLUETOOTH_FAKE_DEVICES'))
+JS_FILES_AND_PARAMETERS = (('testharness.js', 'INCLUDE_TESTHARNESS'),
+                           ('testharnessreport.js', 'INCLUDE_REPORT'),
+                           ('bluetooth-test.js', 'INCLUDE_BLUETOOTH_TEST'),
+                           ('bluetooth-fake-devices.js',
+                            'INCLUDE_BLUETOOTH_FAKE_DEVICES'))
 
 SCRIPT_PREFIX = '<script type="text/javascript">\n'
 SCRIPT_SUFFIX = '\n</script>\n'
@@ -81,14 +80,13 @@
       resources_path: Path to the js files that need to be included.
 
     Returns:
-      A string containing the test case.
+      A binary string containing the test case.
     """
-    print 'Generating test file based on {}'.format(template_path)
+    print('Generating test file based on {}'.format(template_path))
 
     # Read the template.
-    template_file_handle = open(template_path)
-    template_file_data = template_file_handle.read().decode('utf-8')
-    template_file_handle.close()
+    with open(template_path, 'r', encoding='utf-8') as template_in:
+        template_file_data = template_in.read()
 
     # Generate a test file based on the template.
     generated_test = test_case_fuzzer.GenerateTestFile(template_file_data)
@@ -98,9 +96,9 @@
     # Add includes
     for (js_file_name, include_parameter) in JS_FILES_AND_PARAMETERS:
         # Read js file.
-        js_file_handle = open(os.path.join(resources_path, js_file_name))
-        js_file_data = js_file_handle.read().decode('utf-8')
-        js_file_handle.close()
+        js_file_path = os.path.join(resources_path, js_file_name)
+        with open(js_file_path, 'r', encoding='utf-8') as js_in:
+            js_file_data = js_in.read()
 
         js_file_data = (SCRIPT_PREFIX + js_file_data + SCRIPT_SUFFIX)
 
@@ -128,8 +126,8 @@
         prefix=test_file_prefix, suffix='.html', dir=output_dir)
 
     with os.fdopen(file_descriptor, 'wb') as output:
-        print 'Writing {} bytes to \'{}\''.format(
-            len(test_file_data), file_path)
+        print('Writing {} bytes to \'{}\''.format(len(test_file_data),
+                                                  file_path))
         output.write(test_file_data)
 
     return file_path
@@ -138,10 +136,10 @@
 def main():
     args = _GetArguments()
 
-    print 'Generating {} test file(s).'.format(args.no_of_files)
-    print 'Writing test files to: \'{}\''.format(args.output_dir)
+    print('Generating {} test file(s).'.format(args.no_of_files))
+    print('Writing test files to: \'{}\''.format(args.output_dir))
     if args.input_dir:
-        print 'Reading data bundle from: \'{}\''.format(args.input_dir)
+        print('Reading data bundle from: \'{}\''.format(args.input_dir))
 
     # Get Templates
     current_path = os.path.dirname(os.path.realpath(__file__))
@@ -165,8 +163,8 @@
                                        args.output_dir)
 
         if args.content_shell_dir:
-            print '{} --run-web-tests {}'.format(args.content_shell_dir,
-                                                 test_file_path)
+            print('{} --run-web-tests {}'.format(args.content_shell_dir,
+                                                 test_file_path))
 
 
 if __name__ == '__main__':
diff --git a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/test_case_fuzzer.py b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/test_case_fuzzer.py
index 8e6bb14..e2669fb9 100644
--- a/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/test_case_fuzzer.py
+++ b/third_party/blink/renderer/modules/bluetooth/testing/clusterfuzz/test_case_fuzzer.py
@@ -164,7 +164,7 @@
     """
     result = random.choice(BASE_TOKENS)
 
-    for _ in xrange(random.randint(1, MAX_NUM_OF_TOKENS)):
+    for _ in range(random.randint(1, MAX_NUM_OF_TOKENS)):
         # Get random token.
         token = random.choice(TOKENS)
 
diff --git a/third_party/blink/renderer/modules/mediastream/BUILD.gn b/third_party/blink/renderer/modules/mediastream/BUILD.gn
index b55cb27..49d3ba95 100644
--- a/third_party/blink/renderer/modules/mediastream/BUILD.gn
+++ b/third_party/blink/renderer/modules/mediastream/BUILD.gn
@@ -143,6 +143,7 @@
     "mock_media_stream_video_sink.h",
     "mock_media_stream_video_source.cc",
     "mock_media_stream_video_source.h",
+    "mock_video_capturer_source.h",
     "testing_platform_support_with_mock_audio_capture_source.cc",
     "testing_platform_support_with_mock_audio_capture_source.h",
   ]
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
index 0a7ebd28..86aa5c0 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
@@ -287,11 +287,9 @@
       MediaStreamVideoTrack::From(Component());
   if (video_track && component_->Source() &&
       component_->Source()->GetType() == MediaStreamSource::kTypeVideo) {
-    bool pan_tilt_zoom_allowed =
-        image_capture_ ? image_capture_->HasPanTiltZoomPermissionGranted()
-                       : video_track->pan_tilt_zoom_allowed();
     image_capture_ = MakeGarbageCollected<ImageCapture>(
-        context, this, pan_tilt_zoom_allowed, std::move(callback));
+        context, this, video_track->pan_tilt_zoom_allowed(),
+        std::move(callback));
   } else {
     if (execution_context_) {
       execution_context_->GetTaskRunner(TaskType::kInternalMedia)
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
index bc76a9c..9bbcd39 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.cc
@@ -69,6 +69,17 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
+void MediaStreamVideoCapturerSource::KeepDeviceAliveForTransfer(
+    base::UnguessableToken session_id,
+    base::UnguessableToken transfer_id,
+    KeepDeviceAliveForTransferCallback keep_alive_cb) {
+  if (!frame_)
+    std::move(keep_alive_cb).Run(/*device_found=*/false);
+
+  GetMediaStreamDispatcherHost()->KeepDeviceAliveForTransfer(
+      session_id, transfer_id, std::move(keep_alive_cb));
+}
+
 void MediaStreamVideoCapturerSource::SetDeviceCapturerFactoryCallbackForTesting(
     DeviceCapturerFactoryCallback testing_factory_callback) {
   device_capturer_factory_callback_ = std::move(testing_factory_callback);
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.h b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.h
index d0349d0..cd1f677 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.h
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source.h
@@ -55,6 +55,11 @@
 
   ~MediaStreamVideoCapturerSource() override;
 
+  void KeepDeviceAliveForTransfer(
+      base::UnguessableToken session_id,
+      base::UnguessableToken transfer_id,
+      KeepDeviceAliveForTransferCallback keep_alive_cb) override;
+
   void SetDeviceCapturerFactoryCallbackForTesting(
       DeviceCapturerFactoryCallback testing_factory_callback);
 
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
index b7d5fd2..0436d7b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
@@ -21,6 +21,7 @@
 #include "third_party/blink/public/web/web_heap.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
 #include "third_party/blink/renderer/modules/mediastream/mock_mojo_media_stream_dispatcher_host.h"
+#include "third_party/blink/renderer/modules/mediastream/mock_video_capturer_source.h"
 #include "third_party/blink/renderer/modules/mediastream/video_track_adapter_settings.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
@@ -37,41 +38,6 @@
 
 namespace {
 
-class MockVideoCapturerSource : public VideoCapturerSource {
- public:
-  MockVideoCapturerSource() {}
-
-  MOCK_METHOD0(RequestRefreshFrame, void());
-  MOCK_METHOD0(GetPreferredFormats, media::VideoCaptureFormats());
-  MOCK_METHOD3(MockStartCapture,
-               void(const media::VideoCaptureParams& params,
-                    const VideoCaptureDeliverFrameCB& new_frame_callback,
-                    const RunningCallback& running_callback));
-  MOCK_METHOD0(MockStopCapture, void());
-  void StartCapture(const media::VideoCaptureParams& params,
-                    const VideoCaptureDeliverFrameCB& new_frame_callback,
-                    const VideoCaptureCropVersionCB& crop_version_callback,
-                    const RunningCallback& running_callback) override {
-    running_cb_ = running_callback;
-    capture_params_ = params;
-    MockStartCapture(params, new_frame_callback, running_callback);
-    SetRunning(true);
-  }
-  void StopCapture() override { MockStopCapture(); }
-  void SetRunning(bool is_running) {
-    RunState run_state = is_running ? RunState::kRunning : RunState::kStopped;
-    PostCrossThreadTask(*scheduler::GetSingleThreadTaskRunnerForTesting(),
-                        FROM_HERE, CrossThreadBindOnce(running_cb_, run_state));
-  }
-  const media::VideoCaptureParams& capture_params() const {
-    return capture_params_;
-  }
-
- private:
-  RunningCallback running_cb_;
-  media::VideoCaptureParams capture_params_;
-};
-
 class FakeMediaStreamVideoSink : public MediaStreamVideoSink {
  public:
   FakeMediaStreamVideoSink(base::TimeTicks* capture_time,
diff --git a/third_party/blink/renderer/modules/mediastream/mock_video_capturer_source.h b/third_party/blink/renderer/modules/mediastream/mock_video_capturer_source.h
new file mode 100644
index 0000000..a4f7c11
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/mock_video_capturer_source.h
@@ -0,0 +1,53 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MOCK_VIDEO_CAPTURER_SOURCE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MOCK_VIDEO_CAPTURER_SOURCE_H_
+
+#include "third_party/blink/renderer/platform/video_capture/video_capturer_source.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
+
+namespace blink {
+
+class MockVideoCapturerSource : public VideoCapturerSource {
+ public:
+  MockVideoCapturerSource() = default;
+
+  MOCK_METHOD0(RequestRefreshFrame, void());
+  MOCK_METHOD0(GetPreferredFormats, media::VideoCaptureFormats());
+  MOCK_METHOD3(MockStartCapture,
+               void(const media::VideoCaptureParams& params,
+                    const VideoCaptureDeliverFrameCB& new_frame_callback,
+                    const RunningCallback& running_callback));
+  MOCK_METHOD0(MockStopCapture, void());
+  void StartCapture(const media::VideoCaptureParams& params,
+                    const VideoCaptureDeliverFrameCB& new_frame_callback,
+                    const VideoCaptureCropVersionCB& crop_version_callback,
+                    const RunningCallback& running_callback) override {
+    running_cb_ = running_callback;
+    capture_params_ = params;
+    MockStartCapture(params, new_frame_callback, running_callback);
+    SetRunning(true);
+  }
+  void StopCapture() override { MockStopCapture(); }
+  void SetRunning(bool is_running) {
+    RunState run_state = is_running ? RunState::kRunning : RunState::kStopped;
+    PostCrossThreadTask(*scheduler::GetSingleThreadTaskRunnerForTesting(),
+                        FROM_HERE, CrossThreadBindOnce(running_cb_, run_state));
+  }
+  const media::VideoCaptureParams& capture_params() const {
+    return capture_params_;
+  }
+
+ private:
+  RunningCallback running_cb_;
+  media::VideoCaptureParams capture_params_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MOCK_VIDEO_CAPTURER_SOURCE_H_
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
index f772ebb..2a20980 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -162,7 +162,14 @@
 GPUCanvasContext::GPUCanvasContext(
     CanvasRenderingContextHost* host,
     const CanvasContextCreationAttributesCore& attrs)
-    : CanvasRenderingContext(host, attrs, CanvasRenderingAPI::kWebgpu) {}
+    : CanvasRenderingContext(host, attrs, CanvasRenderingAPI::kWebgpu) {
+  // Set the default values of the member corresponding to
+  // GPUCanvasContext.[[texture_descriptor]] in the WebGPU spec.
+  texture_descriptor_ = {};
+  texture_descriptor_.dimension = WGPUTextureDimension_2D;
+  texture_descriptor_.mipLevelCount = 1;
+  texture_descriptor_.sampleCount = 1;
+}
 
 GPUCanvasContext::~GPUCanvasContext() {}
 
@@ -193,7 +200,7 @@
 }
 
 void GPUCanvasContext::Stop() {
-  UnconfigureInternal();
+  DetachSwapBuffers();
   stopped_ = true;
 }
 
@@ -363,7 +370,8 @@
       /*gpu_compositing=*/true, transferable_resource.format);
 
   const SkImageInfo sk_image_info = SkImageInfo::Make(
-      size_.width(), size_.height(), sk_color_type, kPremul_SkAlphaType);
+      texture_descriptor_.size.width, texture_descriptor_.size.height,
+      sk_color_type, kPremul_SkAlphaType);
 
   return MakeGarbageCollected<ImageBitmap>(
       AcceleratedStaticBitmapImage::CreateFromCanvasMailbox(
@@ -412,17 +420,23 @@
     }
   }
 
+  // As soon as the validation for extensions for usage and formats passes, the
+  // canvas is "configured" and calls to getNextTexture() will return GPUTexture
+  // objects (valid or invalid) and not throw.
+  configured_ = true;
+  texture_descriptor_.format = AsDawnEnum(descriptor->format());
+  texture_descriptor_.usage =
+      AsDawnFlags<WGPUTextureUsage>(descriptor->usage());
+
   // This needs to happen early so that if any validation fails the swapbuffers
-  // stays unconfigured.
-  UnconfigureInternal();
+  // are not created and getCurrentTexture() will return an error GPUTexture.
+  DetachSwapBuffers();
 
   // Store the configured device separately, even if the configuration fails, so
   // that errors can be generated in the appropriate error scope.
   device_ = descriptor->device();
 
-  WGPUTextureUsage usage = AsDawnFlags<WGPUTextureUsage>(descriptor->usage());
-  WGPUTextureFormat format = AsDawnEnum(descriptor->format());
-  switch (format) {
+  switch (texture_descriptor_.format) {
     case WGPUTextureFormat_BGRA8Unorm:
       // TODO(crbug.com/1298618): support RGBA8Unorm on MAC.
 #if !BUILDFLAG(IS_MAC)
@@ -474,9 +488,10 @@
     return;
   }
 
-  swap_buffers_ = base::AdoptRef(
-      new WebGPUSwapBufferProvider(this, device_->GetDawnControlClient(),
-                                   device_->GetHandle(), usage, format));
+  swap_buffers_ = base::AdoptRef(new WebGPUSwapBufferProvider(
+      this, device_->GetDawnControlClient(), device_->GetHandle(),
+      static_cast<WGPUTextureUsage>(texture_descriptor_.usage),
+      texture_descriptor_.format));
   swap_buffers_->SetFilterQuality(filter_quality_);
 
   // Note: SetContentsOpaque is only an optimization hint. It doesn't
@@ -484,8 +499,10 @@
   switch (alpha_mode_) {
     case V8GPUCanvasAlphaMode::Enum::kOpaque: {
       CcLayer()->SetContentsOpaque(true);
-      if (!alpha_clearer_ || !alpha_clearer_->IsCompatible(device_, format)) {
-        alpha_clearer_ = std::make_unique<TextureAlphaClearer>(device_, format);
+      if (!alpha_clearer_ ||
+          !alpha_clearer_->IsCompatible(device_, texture_descriptor_.format)) {
+        alpha_clearer_ = std::make_unique<TextureAlphaClearer>(
+            device_, texture_descriptor_.format);
       }
       break;
     }
@@ -523,12 +540,15 @@
     ResizeSwapbuffers(configured_size_);
   } else {
     configured_size_.SetSize(0, 0);
-    ResizeSwapbuffers(Host()->Size());
+
+    gfx::Size size = Host()->Size();
+    ResizeSwapbuffers(size);
   }
 }
 
 void GPUCanvasContext::ResizeSwapbuffers(gfx::Size size) {
-  size_ = size;
+  texture_descriptor_.size = {static_cast<uint32_t>(size.width()),
+                              static_cast<uint32_t>(size.height()), 1};
 
   // The spec indicates that when the canvas is resized the current texture is
   // discarded and a new one allocated in it's place immediately.
@@ -547,7 +567,7 @@
     return;
   }
 
-  UnconfigureInternal();
+  DetachSwapBuffers();
 
   // When developers call unconfigure from the page, one of the reasons for
   // doing so is to expressly release the GPUCanvasContext's device reference.
@@ -555,9 +575,10 @@
   // also needs to be released.
   alpha_clearer_ = nullptr;
   device_ = nullptr;
+  configured_ = false;
 }
 
-void GPUCanvasContext::UnconfigureInternal() {
+void GPUCanvasContext::DetachSwapBuffers() {
   if (swap_buffers_) {
     // Tell any previous swapbuffers that it will no longer be used and can
     // destroy all its resources (and produce errors when used).
@@ -579,15 +600,17 @@
 
 GPUTexture* GPUCanvasContext::getCurrentTexture(
     ExceptionState& exception_state) {
-  if (!device_) {
+  if (!configured_) {
     exception_state.ThrowDOMException(DOMExceptionCode::kOperationError,
                                       "context is not configured");
     return nullptr;
   }
+  DCHECK(device_);
+
   if (!swap_buffers_) {
     device_->InjectError(WGPUErrorType_Validation,
                          "context configuration is invalid.");
-    return GPUTexture::CreateError(device_);
+    return GPUTexture::CreateError(device_, &texture_descriptor_);
   }
 
   // Calling getCurrentTexture returns a texture that is valid until the
@@ -614,12 +637,14 @@
 
   texture_ = nullptr;
 
-  WGPUTexture dawn_client_texture = swap_buffers_->GetNewTexture(
-      size_, alpha_mode_ == V8GPUCanvasAlphaMode::Enum::kOpaque
-                 ? kOpaque_SkAlphaType
-                 : kPremul_SkAlphaType);
+  SkAlphaType alpha_type = alpha_mode_ == V8GPUCanvasAlphaMode::Enum::kOpaque
+                               ? kOpaque_SkAlphaType
+                               : kPremul_SkAlphaType;
+  WGPUTexture dawn_client_texture =
+      swap_buffers_->GetNewTexture(texture_descriptor_, alpha_type);
+
   if (!dawn_client_texture) {
-    texture_ = GPUTexture::CreateError(device_);
+    texture_ = GPUTexture::CreateError(device_, &texture_descriptor_);
     return texture_;
   }
   texture_ = MakeGarbageCollected<GPUTexture>(device_, dawn_client_texture);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
index 490e97b5..c182d96 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
@@ -114,7 +114,7 @@
   void OnTextureTransferred() override;
 
  private:
-  void UnconfigureInternal();
+  void DetachSwapBuffers();
   GPUTexture* ReplaceCurrentTexture();
   void ResizeSwapbuffers(gfx::Size size);
   void InitializeAlphaModePipeline(WGPUTextureFormat format);
@@ -140,13 +140,16 @@
   V8GPUCanvasAlphaMode::Enum alpha_mode_;
   std::unique_ptr<TextureAlphaClearer> alpha_clearer_;
   scoped_refptr<WebGPUSwapBufferProvider> swap_buffers_;
-
-  gfx::Size size_;
-
   bool stopped_ = false;
 
   // TODO(crbug.com/1326473): Remove after deprecation period.
   gfx::Size configured_size_;
+
+  // Matches [[configuration]] != null in the WebGPU specification.
+  bool configured_ = false;
+  // Matches [[texture_descriptor]] in the WebGPU specification except that it
+  // never becomes null.
+  WGPUTextureDescriptor texture_descriptor_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
index 01ed792a..7a85dea 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -89,10 +89,6 @@
   return dawn_desc;
 }
 
-void popErrorDiscardCallback(WGPUErrorType, const char*, void*) {
-  // This callback is used to silently consume expected error messages
-}
-
 }  // anonymous namespace
 
 // static
@@ -127,22 +123,13 @@
 }
 
 // static
-GPUTexture* GPUTexture::CreateError(GPUDevice* device) {
+GPUTexture* GPUTexture::CreateError(GPUDevice* device,
+                                    const WGPUTextureDescriptor* desc) {
   DCHECK(device);
-
-  // Force the creation of an invalid texture and consume the errors that it
-  // causes. It would be nice if Dawn provided a more direct way of creating
-  // an error texture to simplify this.
-  WGPUTextureDescriptor dawn_desc = {};
-  device->GetProcs().devicePushErrorScope(device->GetHandle(),
-                                          WGPUErrorFilter_Validation);
-  GPUTexture* texture = MakeGarbageCollected<GPUTexture>(
+  DCHECK(desc);
+  return MakeGarbageCollected<GPUTexture>(
       device,
-      device->GetProcs().deviceCreateTexture(device->GetHandle(), &dawn_desc));
-  device->GetProcs().devicePopErrorScope(device->GetHandle(),
-                                         &popErrorDiscardCallback, nullptr);
-
-  return texture;
+      device->GetProcs().deviceCreateErrorTexture(device->GetHandle(), desc));
 }
 
 // static
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.h b/third_party/blink/renderer/modules/webgpu/gpu_texture.h
index da089ac3..7b49530 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.h
@@ -25,7 +25,8 @@
   static GPUTexture* Create(GPUDevice* device,
                             const GPUTextureDescriptor* webgpu_desc,
                             ExceptionState& exception_state);
-  static GPUTexture* CreateError(GPUDevice* device);
+  static GPUTexture* CreateError(GPUDevice* device,
+                                 const WGPUTextureDescriptor* desc);
   static GPUTexture* FromCanvas(GPUDevice* device,
                                 HTMLCanvasElement* canvas,
                                 WGPUTextureUsage usage,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
index dacb264d..40785fd 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
@@ -39,7 +39,9 @@
     WGPUTextureFormat format)
     : dawn_control_client_(dawn_control_client),
       client_(client),
-      device_(device) {
+      device_(device),
+      format_(WGPUFormatToViz(format)),
+      usage_(usage) {
   // Create a layer that will be used by the canvas and will ask for a
   // SharedImage each frame.
   layer_ = cc::TextureLayer::CreateForMailbox(this);
@@ -55,14 +57,6 @@
   layer_->SetPremultipliedAlpha(true);
 
   dawn_control_client_->GetProcs().deviceReference(device_);
-
-  // Initialize the texture descriptor. Only the size will change after this.
-  texture_desc_ = {};
-  texture_desc_.dimension = WGPUTextureDimension_2D;
-  texture_desc_.mipLevelCount = 1;
-  texture_desc_.sampleCount = 1;
-  texture_desc_.usage = usage;
-  texture_desc_.format = format;
 }
 
 WebGPUSwapBufferProvider::~WebGPUSwapBufferProvider() {
@@ -72,7 +66,7 @@
 }
 
 viz::ResourceFormat WebGPUSwapBufferProvider::Format() const {
-  return WGPUFormatToViz(texture_desc_.format);
+  return format_;
 }
 
 const gfx::Size& WebGPUSwapBufferProvider::Size() const {
@@ -221,14 +215,25 @@
   unused_swap_buffers_.push_back(std::move(swap_buffer));
 }
 
-WGPUTexture WebGPUSwapBufferProvider::GetNewTexture(const gfx::Size& size,
-                                                    SkAlphaType alpha_mode) {
+WGPUTexture WebGPUSwapBufferProvider::GetNewTexture(
+    const WGPUTextureDescriptor& desc,
+    SkAlphaType alpha_mode) {
+  DCHECK_EQ(desc.nextInChain, nullptr);
+  DCHECK_EQ(desc.usage, usage_);
+  DCHECK_EQ(WGPUFormatToViz(desc.format), format_);
+  DCHECK_EQ(desc.dimension, WGPUTextureDimension_2D);
+  DCHECK_EQ(desc.size.depthOrArrayLayers, 1u);
+  DCHECK_EQ(desc.mipLevelCount, 1u);
+  DCHECK_EQ(desc.sampleCount, 1u);
+  DCHECK_EQ(desc.viewFormatCount, 0u);
+
   DCHECK(!wire_texture_id_);
   auto context_provider = GetContextProviderWeakPtr();
   if (!context_provider) {
     return nullptr;
   }
 
+  gfx::Size size(desc.size.width, desc.size.height);
   if (size.IsEmpty()) {
     return nullptr;
   }
@@ -249,11 +254,8 @@
   // Associate the mailbox to a dawn_wire client DawnTexture object. Pass in a
   // complete descriptor of the texture so that reflection on GPUTexture from
   // canvases gives the correct result.
-  texture_desc_.size = {static_cast<uint32_t>(size.width()),
-                        static_cast<uint32_t>(size.height()), 1};
-
   gpu::webgpu::ReservedTexture reservation =
-      webgpu->ReserveTexture(device_, &texture_desc_);
+      webgpu->ReserveTexture(device_, &desc);
   DCHECK(reservation.texture);
   wire_device_id_ = reservation.deviceId;
   wire_device_generation_ = reservation.deviceGeneration;
@@ -262,8 +264,7 @@
 
   webgpu->AssociateMailbox(
       wire_device_id_, wire_device_generation_, wire_texture_id_,
-      wire_texture_generation_, texture_desc_.usage,
-      gpu::webgpu::WEBGPU_MAILBOX_DISCARD,
+      wire_texture_generation_, usage_, gpu::webgpu::WEBGPU_MAILBOX_DISCARD,
       reinterpret_cast<GLbyte*>(&current_swap_buffer_->mailbox));
 
   // When the page request a texture it means we'll need to present it on the
@@ -281,9 +282,8 @@
 
   return WebGPUMailboxTextureAndSize(
       WebGPUMailboxTexture::FromExistingMailbox(
-          dawn_control_client_, device_,
-          static_cast<WGPUTextureUsage>(texture_desc_.usage),
-          last_swap_buffer_->mailbox, last_swap_buffer_->access_finished_token,
+          dawn_control_client_, device_, usage_, last_swap_buffer_->mailbox,
+          last_swap_buffer_->access_finished_token,
           gpu::webgpu::WEBGPU_MAILBOX_NONE),
       last_swap_buffer_->size);
 }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.h
index 2556c01..c48a6f6 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.h
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.h
@@ -49,7 +49,8 @@
   void SetFilterQuality(cc::PaintFlags::FilterQuality);
   void Neuter();
   void DiscardCurrentSwapBuffer();
-  WGPUTexture GetNewTexture(const gfx::Size& size, SkAlphaType alpha_type);
+  WGPUTexture GetNewTexture(const WGPUTextureDescriptor& desc,
+                            SkAlphaType alpha_type);
 
   // Copy swapchain's texture to a video frame.
   // This happens at the end of an animation frame. Dawn's access to the
@@ -149,7 +150,6 @@
   scoped_refptr<DawnControlClientHolder> dawn_control_client_;
   Client* client_;
   WGPUDevice device_;
-  WGPUTextureDescriptor texture_desc_;
   scoped_refptr<cc::TextureLayer> layer_;
   bool neutered_ = false;
 
@@ -159,6 +159,8 @@
 
   WTF::Vector<std::unique_ptr<SwapBuffer>> unused_swap_buffers_;
   std::unique_ptr<SwapBuffer> last_swap_buffer_;
+  viz::ResourceFormat format_;
+  WGPUTextureUsage usage_;
 
   uint32_t wire_device_id_ = 0;
   uint32_t wire_device_generation_ = 0;
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider_test.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider_test.cc
index de417139..b557ad291 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider_test.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider_test.cc
@@ -104,19 +104,32 @@
                                  usage,
                                  format),
         alive_(alive),
-        client_(client) {}
+        client_(client) {
+    texture_desc_.nextInChain = nullptr;
+    texture_desc_.usage = usage;
+    texture_desc_.format = format;
+    texture_desc_.size = {0, 0, 1};
+    texture_desc_.mipLevelCount = 1;
+    texture_desc_.sampleCount = 1;
+    texture_desc_.dimension = WGPUTextureDimension_2D;
+    texture_desc_.viewFormatCount = 0;
+    texture_desc_.viewFormats = nullptr;
+  }
   ~WebGPUSwapBufferProviderForTests() override { *alive_ = false; }
 
   WGPUTexture GetNewTexture(const gfx::Size& size) {
     // The alpha type is an optimization hint so just pass in opaque here.
-    client_->texture =
-        WebGPUSwapBufferProvider::GetNewTexture(size, kOpaque_SkAlphaType);
+    texture_desc_.size.width = size.width();
+    texture_desc_.size.height = size.height();
+    client_->texture = WebGPUSwapBufferProvider::GetNewTexture(
+        texture_desc_, kOpaque_SkAlphaType);
     return client_->texture;
   }
 
  private:
   bool* alive_;
   FakeProviderClient* client_;
+  WGPUTextureDescriptor texture_desc_;
 };
 
 }  // anonymous namespace
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.cc b/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.cc
index d10707cd..c28b2ae 100644
--- a/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.cc
+++ b/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.cc
@@ -13,7 +13,9 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
+#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
+#include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
@@ -170,6 +172,14 @@
   return this_properties->HasSameNonReconfigurableSettings(*others_properties);
 }
 
+void MediaStreamAudioSource::KeepDeviceAliveForTransfer(
+    base::UnguessableToken session_id,
+    base::UnguessableToken transfer_id,
+    KeepDeviceAliveForTransferCallback keep_alive_cb) {
+  GetMediaStreamDispatcherHost()->KeepDeviceAliveForTransfer(
+      session_id, transfer_id, std::move(keep_alive_cb));
+}
+
 void MediaStreamAudioSource::DoChangeSource(
     const MediaStreamDevice& new_device) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
@@ -228,6 +238,15 @@
   is_stopped_ = true;
 }
 
+mojom::blink::MediaStreamDispatcherHost*
+MediaStreamAudioSource::GetMediaStreamDispatcherHost() {
+  if (!host_) {
+    Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
+        host_.BindNewPipeAndPassReceiver());
+  }
+  return host_.get();
+}
+
 void MediaStreamAudioSource::StopAudioDeliveryTo(MediaStreamAudioTrack* track) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
   const bool did_remove_last_track = deliverer_.RemoveConsumer(track);
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h b/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h
index 946ae12..d8bf99f 100644
--- a/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h
+++ b/third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h
@@ -12,6 +12,8 @@
 #include "base/memory/weak_ptr.h"
 #include "media/base/audio_capturer_source.h"
 #include "media/base/limits.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_deliverer.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h"
@@ -129,6 +131,11 @@
   bool HasSameNonReconfigurableSettings(
       MediaStreamAudioSource* other_source) const;
 
+  void KeepDeviceAliveForTransfer(
+      base::UnguessableToken session_id,
+      base::UnguessableToken transfer_id,
+      KeepDeviceAliveForTransferCallback keep_alive_cb) override;
+
   // Returns the audio processing properties associated to this source if any,
   // or nullopt otherwise.
   virtual absl::optional<blink::AudioProcessingProperties>
@@ -217,6 +224,8 @@
   void StopSourceOnErrorOnTaskRunner(
       media::AudioCapturerSource::ErrorCode code);
 
+  mojom::blink::MediaStreamDispatcherHost* GetMediaStreamDispatcherHost();
+
   // True if the source of audio is a local device. False if the source is
   // remote (e.g., streamed-in from a server).
   const bool is_local_source_;
@@ -230,6 +239,8 @@
   // Manages tracks connected to this source and the audio format and data flow.
   MediaStreamAudioDeliverer<MediaStreamAudioTrack> deliverer_;
 
+  mojo::Remote<mojom::blink::MediaStreamDispatcherHost> host_;
+
   // Code set if this source was closed due to an error.
   absl::optional<media::AudioCapturerSource::ErrorCode> error_code_;
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 30fe02fae..504445f 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2287,7 +2287,7 @@
     // https://crbug.com/1314739
     {
       name: "TouchActionEffectiveAtPointerDown",
-      status: "experimental",
+      status: "stable",
     },
     // This feature allows touch dragging and a context menu to occur
     // simultaneously, with the assumption that the menu is non-modal.  Without
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
index b02211c..891eb45 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
+++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -3,6 +3,9 @@
 # No need to run Virtual test suite plz-dedicated-worker here
 virtual/plz-dedicated-worker/* [ Skip ]
 
+# Isolated-sandboxed-iframe require site isolation to be effective.
+virtual/isolate-sandboxed-iframes/* [ Skip ]
+
 # The following tests fail with UserActivationSameOriginVisibility plus UAv2.
 crbug.com/922725 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure ]
 crbug.com/922725 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index c37d37d..03fe88e5 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1305,6 +1305,12 @@
     "args": ["--enable-features=ThreadedPreloadScanner,PrecompileInlineScripts"]
   },
   {
+    "prefix": "isolate-sandboxed-iframes",
+    "platforms": ["Linux", "Mac", "Win"],
+    "bases": [ "external/wpt/html/infrastructure/urls/terminology-0/" ],
+    "args": [ "--enable-features=IsolateSandboxedIframes" ]
+  },
+  {
     "prefix": "coop-restrict-properties",
     "platforms": ["Linux", "Mac", "Win"],
     "bases": [ "external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties" ],
diff --git a/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window.js b/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window.js
new file mode 100644
index 0000000..b8fad36
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/common/get-host-info.sub.js
+
+// Load about:srcdoc in a sandboxed iframe. Check the document.baseURI is
+// correct.
+const runTest = (description, iframe_sandbox) => {
+  promise_test(async test => {
+    const iframe = document.createElement("iframe");
+    iframe.sandbox = iframe_sandbox;
+    iframe.srcdoc = `
+      <script>
+        parent.postMessage(document.baseURI, '*');
+      </scr`+`ipt>
+    `;
+    const child_base_uri = new Promise(r => onmessage = e => r(e.data));
+    document.body.appendChild(iframe);
+    // [spec]: https://html.spec.whatwg.org/C/#fallback-base-url
+    // Step 1: If document is an iframe srcdoc document, then return the
+    //         document base URL of document's browsing context's container
+    //         document.
+    assert_equals(await child_base_uri, document.baseURI);
+  }, description);
+}
+
+onload = () => {
+  runTest("allow-same-origin", "allow-scripts allow-same-origin");
+  runTest("disallow-same-origin", "allow-scripts");
+}
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored.js b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored.js
new file mode 100644
index 0000000..25db7c8f
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored.js
@@ -0,0 +1,23 @@
+// Copyright 2022 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.
+
+(async function(testRunner) {
+  const {page, dp} = await testRunner.startBlank(
+      `Test that an attributionsrc request that is not eligible for sources or triggers triggers issues when it tries to register them.`);
+
+  await dp.Audits.enable();
+  await page.navigate(
+      'https://devtools.test:8443/inspector-protocol/attribution-reporting/resources/impression.html');
+  await page.loadHTML(`<body>`);
+
+  const issue1 = dp.Audits.onceIssueAdded();
+  const issue2 = dp.Audits.onceIssueAdded();
+  await dp.Runtime.evaluate({
+    expression:
+        `fetch('/inspector-protocol/attribution-reporting/resources/register-source-and-trigger.php',{headers:{'Attribution-Reporting-Eligible':''}})`,
+  });
+  testRunner.log((await issue1).params.issue, 'Issue 1 reported: ', ['request']);
+  testRunner.log((await issue2).params.issue, 'Issue 2 reported: ', ['request']);
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-ignored.js b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-ignored.js
new file mode 100644
index 0000000..ee79eef
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-ignored.js
@@ -0,0 +1,22 @@
+// Copyright 2022 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.
+
+(async function(testRunner) {
+  const {page, dp} = await testRunner.startBlank(
+      `Test that an attributionsrc request that is only eligible for triggers triggers an issue when it tries to register a source.`);
+
+  await dp.Audits.enable();
+  await page.navigate(
+      'https://devtools.test:8443/inspector-protocol/attribution-reporting/resources/impression.html');
+  await page.loadHTML(`<body>`);
+
+  const issuePromise = dp.Audits.onceIssueAdded();
+  await dp.Runtime.evaluate({
+    expression:
+        `fetch('/inspector-protocol/attribution-reporting/resources/register-source-and-trigger.php',{headers:{'Attribution-Reporting-Eligible':'trigger'}})`,
+  });
+  const issue = await issuePromise;
+  testRunner.log(issue.params.issue, 'Issue reported: ', ['request']);
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/trigger-ignored.js b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/trigger-ignored.js
new file mode 100644
index 0000000..92d7f8f
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/trigger-ignored.js
@@ -0,0 +1,22 @@
+// Copyright 2022 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.
+
+(async function(testRunner) {
+  const {page, dp} = await testRunner.startBlank(
+      `Test that an attributionsrc request that is only eligible for sources triggers an issue when it tries to register a trigger.`);
+
+  await dp.Audits.enable();
+  await page.navigate(
+      'https://devtools.test:8443/inspector-protocol/attribution-reporting/resources/impression.html');
+  await page.loadHTML(`<body>`);
+
+  const issuePromise = dp.Audits.onceIssueAdded();
+  await dp.Runtime.evaluate({
+    expression:
+        `fetch('/inspector-protocol/attribution-reporting/resources/register-source-and-trigger.php',{headers:{'Attribution-Reporting-Eligible':'event-source'}})`,
+  });
+  const issue = await issuePromise;
+  testRunner.log(issue.params.issue, 'Issue reported: ', ['request']);
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored-expected.txt
new file mode 100644
index 0000000..5818ae8e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-and-trigger-ignored-expected.txt
@@ -0,0 +1,22 @@
+Test that an attributionsrc request that is not eligible for sources or triggers triggers issues when it tries to register them.
+Issue 1 reported: {
+    code : AttributionReportingIssue
+    details : {
+        attributionReportingIssueDetails : {
+            invalidParameter : {"source_event_id":"0","destination":"https://a.example"}
+            request : <object>
+            violationType : SourceIgnored
+        }
+    }
+}
+Issue 2 reported: {
+    code : AttributionReportingIssue
+    details : {
+        attributionReportingIssueDetails : {
+            invalidParameter : {}
+            request : <object>
+            violationType : TriggerIgnored
+        }
+    }
+}
+
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-ignored-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-ignored-expected.txt
new file mode 100644
index 0000000..916caf2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/source-ignored-expected.txt
@@ -0,0 +1,12 @@
+Test that an attributionsrc request that is only eligible for triggers triggers an issue when it tries to register a source.
+Issue reported: {
+    code : AttributionReportingIssue
+    details : {
+        attributionReportingIssueDetails : {
+            invalidParameter : {"source_event_id":"0","destination":"https://a.example"}
+            request : <object>
+            violationType : SourceIgnored
+        }
+    }
+}
+
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/trigger-ignored-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/trigger-ignored-expected.txt
new file mode 100644
index 0000000..ee62c6e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/trigger-ignored-expected.txt
@@ -0,0 +1,12 @@
+Test that an attributionsrc request that is only eligible for sources triggers an issue when it tries to register a trigger.
+Issue reported: {
+    code : AttributionReportingIssue
+    details : {
+        attributionReportingIssueDetails : {
+            invalidParameter : {}
+            request : <object>
+            violationType : TriggerIgnored
+        }
+    }
+}
+
diff --git a/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https_1-2-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https_1-2-expected.txt
index c5210689..d77492a 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https_1-2-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https_1-2-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with window_open assert_equals: Iframe has dom access to the popup? expected "false" but got "true"
-PASS COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with anchor
-PASS COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with form
+FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with window_open assert_equals: Popup has an opener? expected "true" but got "false"
+FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with anchor assert_equals: Popup has an opener? expected "true" but got "false"
+FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same origin iframe, same origin popup with form assert_equals: Popup has an opener? expected "true" but got "false"
 FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same site iframe, same origin popup with window_open assert_equals: Popup has an opener? expected "true" but got "false"
 FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same site iframe, same origin popup with anchor assert_equals: Popup has an opener? expected "true" but got "false"
 FAIL COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with same site iframe, same origin popup with form assert_equals: Popup has an opener? expected "true" but got "false"
diff --git a/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https-expected.txt
new file mode 100644
index 0000000..bc9bbdb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+PASS Verify that named targeting does not work across isolation boundaries.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https-expected.txt
index 465d7be..d370a09 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https-expected.txt
@@ -3,6 +3,6 @@
 FAIL Same-origin popup with coop unsafe-none assert_false: Popup is closed from opener? expected false got true
 PASS Same-origin popup with coop same-origin
 PASS Same-origin popup with coop same-origin-allow-popups
-FAIL Same-origin popup with coop restrict-properties assert_false: Main page has dom access to the popup? expected false got true
+FAIL Same-origin popup with coop restrict-properties assert_false: Popup is closed from opener? expected false got true
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/generic/virtual/isolate-sandboxed-iframes/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/isolate-sandboxed-iframes/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window-expected.txt
new file mode 100644
index 0000000..6015aa34
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/virtual/isolate-sandboxed-iframes/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS allow-same-origin
+FAIL disallow-same-origin assert_equals: expected "https://web-platform.test:8444/html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window.html" but got "about:srcdoc"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/isolate-sandboxed-iframes/README.md b/third_party/blink/web_tests/virtual/isolate-sandboxed-iframes/README.md
new file mode 100644
index 0000000..f3d3108
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/isolate-sandboxed-iframes/README.md
@@ -0,0 +1,4 @@
+Virtual test suite with `--enable-features=IsolateSandboxedIframes`
+Owner: wjmaclean@chromium.org
+
+Allow process isolation of iframes with the 'sandbox' attribute set.
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js
index 7091906..3571120 100644
--- a/third_party/closure_compiler/externs/file_manager_private.js
+++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -756,6 +756,21 @@
  */
 chrome.fileManagerPrivate.DlpMetadata;
 
+/** @enum {string} */
+chrome.fileManagerPrivate.DlpLevel = {
+  BLOCK: 'block',
+  ALLOW: 'allow',
+};
+
+/**
+ * @typedef {{
+ *   level: chrome.fileManagerPrivate.DlpLevel,
+ *   urls: !Array<string>,
+ *   components: !Array<chrome.fileManagerPrivate.VolumeType>,
+ * }}
+ */
+chrome.fileManagerPrivate.DlpRestrictionDetails;
+
 /**
  * Logout the current user for navigating to the re-authentication screen for
  * the Google account.
@@ -981,11 +996,16 @@
 chrome.fileManagerPrivate.getDlpMetadata = function(entries, callback) {};
 
 /**
- * Shows a modal containing Data Leak Prevention (DLP) Restriction Details.
+ * Retrieves Data Leak Prevention (DLP) restriction details.
  * @param {string} sourceUrl Source URL of the Entry for which the details
  *     should be shown.
+ * @param {function(!Array<chrome.fileManagerPrivate.DlpRestrictionDetails>)}
+ * callback Callback with the list of
+ * chrome.fileManagerPrivate.DlpRestrictionDetails containing summarized
+ * restriction information about the entry.
  */
-chrome.fileManagerPrivate.showDlpRestrictionDetails = function(sourceUrl) {};
+chrome.fileManagerPrivate.getDlpRestrictionDetails = function(
+    sourceUrl, callback) {};
 
 /**
  * Starts to copy an entry. If the source is a directory, the copy is done
diff --git a/tools/captured_sites/control.py b/tools/captured_sites/control.py
index c104cff5..23e261b 100755
--- a/tools/captured_sites/control.py
+++ b/tools/captured_sites/control.py
@@ -375,7 +375,8 @@
     command_args.append('--autofill-server-type=%s ' % full_cache_type)
 
   if options.command_file:
-    command_args.append('--command_file=%s' % options.command_file)
+    command_args.append('--command_file=%s' %
+                        os.path.expanduser(options.command_file))
 
   if options.store_log:
     if not os.path.isdir(_LOG_DATA_DIR_PATH):
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 38d5087..48c0672 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -313,6 +313,9 @@
   <int value="2" label="Inline Text Boxes"/>
   <int value="3" label="Screen Reader"/>
   <int value="4" label="HTML"/>
+  <int value="5" label="HTML Metadata"/>
+  <int value="6" label="Label images"/>
+  <int value="7" label="PDF"/>
 </enum>
 
 <enum name="AccessibilityTreeUnserializeError">
@@ -35239,7 +35242,7 @@
   <int value="1691" label="AUTOTESTPRIVATE_GETDESKCOUNT"/>
   <int value="1692" label="METRICSPRIVATE_RECORDSPARSEVALUEWITHPERSISTENTHASH"/>
   <int value="1693" label="METRICSPRIVATE_RECORDSPARSEVALUEWITHHASHMETRICNAME"/>
-  <int value="1694" label="FILEMANAGERPRIVATE_SHOWDLPRESTRICTIONDETAILS"/>
+  <int value="1694" label="FILEMANAGERPRIVATE_GETDLPRESTRICTIONDETAILS"/>
   <int value="1695" label="ACCESSIBILITY_PRIVATE_SILENCESPOKENFEEDBACK"/>
   <int value="1696" label="AUTOTESTPRIVATE_SETALLOWEDPREF"/>
   <int value="1697" label="PASSWORDSPRIVATE_REQUESTCREDENTIALDETAILS"/>
@@ -50038,6 +50041,19 @@
   <int value="3" label="Incognito switch and forced"/>
 </enum>
 
+<enum name="IncognitoInterstitialActionType">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Open in Chrome Incognito"/>
+  <int value="2" label="Open in Chrome (in a normal tab)"/>
+  <int value="3" label="Cancel"/>
+</enum>
+
+<enum name="IncognitoInterstitialSettingsActionType">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Enabled"/>
+  <int value="2" label="Disabled"/>
+</enum>
+
 <enum name="IncognitoMessageEvent">
   <int value="0" label="Download message shown"/>
   <int value="1" label="Download message accepted"/>
@@ -57142,6 +57158,7 @@
       label="BluetoothAggressiveAppearanceFilter:disabled"/>
   <int value="-1166715563" label="ChromeOSAssistant:disabled"/>
   <int value="-1165112418" label="PwaUpdateDialogForName:enabled"/>
+  <int value="-1164940780" label="AutofillParseIBANFields:disabled"/>
   <int value="-1164858657" label="CrostiniUsbAllowUnsupported:disabled"/>
   <int value="-1164578922" label="BookmarksRefresh:enabled"/>
   <int value="-1163777157" label="ContextualSearchSimplifiedServer:disabled"/>
@@ -57198,8 +57215,6 @@
   <int value="-1134307340" label="stop-loading-in-background:enabled"/>
   <int value="-1132704128" label="AndroidPaymentAppsFilter:disabled"/>
   <int value="-1131726331" label="BackGestureRefactorAndroid:disabled"/>
-  <int value="-1130756844"
-      label="EnableBiometricAuthenticationInSettings:disabled"/>
   <int value="-1128981647" label="EnableOAuthIpp:enabled"/>
   <int value="-1128912963" label="MediaControlsExpandGesture:disabled"/>
   <int value="-1128221789"
@@ -57907,7 +57922,6 @@
   <int value="-693881124"
       label="AutofillEnableSupportForMoreStructureInNames:disabled"/>
   <int value="-690660906" label="ProductivityLauncherAnimation:disabled"/>
-  <int value="-688419609" label="AutofillParseIbanFields:disabled"/>
   <int value="-688003116" label="FocusFollowsCursor:enabled"/>
   <int value="-687302378" label="BluetoothFixA2dpPacketSize:enabled"/>
   <int value="-686788480" label="OsSettingsAppNotificationsPage:enabled"/>
@@ -58289,6 +58303,7 @@
   <int value="-448929520" label="TranslateMessageUI:enabled"/>
   <int value="-447986568" label="WebNotesDynamicTemplates:disabled"/>
   <int value="-447148659" label="ContextMenuTranslateWithGoogleLens:enabled"/>
+  <int value="-447104608" label="BiometricAuthenticationInSettings:enabled"/>
   <int value="-446879089" label="BluetoothSessionizedMetrics:enabled"/>
   <int value="-446560063" label="finch-seed-min-update-period"/>
   <int value="-446220201" label="EnableIncognitoShortcutOnDesktop:enabled"/>
@@ -60619,8 +60634,6 @@
   <int value="1057709415" label="DeprecateAltBasedSixPack:disabled"/>
   <int value="1057887829" label="AutofillScanThemeDialog:disabled"/>
   <int value="1059007599" label="enable-gpu-appcontainer"/>
-  <int value="1059157909"
-      label="EnableBiometricAuthenticationInSettings:enabled"/>
   <int value="1059283439"
       label="OmniboxClobberTriggersContextualWebZeroSuggest:disabled"/>
   <int value="1059698271" label="EnableZeroStateSuggestions:disabled"/>
@@ -60907,6 +60920,7 @@
   <int value="1234601252" label="ForceUseAPDownloadProtection:enabled"/>
   <int value="1235800887" label="V8Ignition:enabled"/>
   <int value="1235940786" label="ChromeHomePersistentIph:enabled"/>
+  <int value="1236772382" label="BiometricAuthenticationInSettings:disabled"/>
   <int value="1237297772" label="no-pings"/>
   <int value="1237659269"
       label="OmniboxHistoryQuickProviderAllowButDoNotScoreMidwordTerms:enabled"/>
@@ -61143,6 +61157,7 @@
   <int value="1383197819" label="IncognitoScreenshot:enabled"/>
   <int value="1383526461" label="QuickAnswersRichUi:enabled"/>
   <int value="1383591631" label="enable-gesture-typing"/>
+  <int value="1384102751" label="AutofillParseIBANFields:enabled"/>
   <int value="1384614036" label="disable-unified-media-pipeline"/>
   <int value="1385833812" label="WinrtGeolocationImplementation:disabled"/>
   <int value="1386300777"
@@ -62242,7 +62257,6 @@
   <int value="2100547979" label="AdaptiveCharging:enabled"/>
   <int value="2101124624" label="WebUIDownloadShelf:disabled"/>
   <int value="2101151142" label="disable-direct-write"/>
-  <int value="2103706493" label="AutofillParseIbanFields:enabled"/>
   <int value="2104340988" label="CrostiniUsername:disabled"/>
   <int value="2104439359"
       label="OmniboxDefaultTypedNavigationsToHttps:enabled"/>
@@ -74878,14 +74892,6 @@
   <int value="3" label="Password rejected in modal dialog (obsolete)"/>
 </enum>
 
-<enum name="PasswordImportFromCSVResult">
-  <int value="0" label="Password import succeeded"/>
-  <int value="1" label="Password import failed due to IO error"/>
-  <int value="2" label="Password import failed due to malformed CSV"/>
-  <int value="3" label="Password import failed due to missing content"/>
-  <int value="4" label="Boundary value"/>
-</enum>
-
 <enum name="PasswordLeakDetectionDialogDismissalReason">
   <int value="0" label="No direct user interaction"/>
   <int value="1" label="Clicked Close"/>
@@ -88531,14 +88537,6 @@
   <int value="38" label="Sync off settings row"/>
 </enum>
 
-<enum name="SigninAccountEquality">
-  <int value="0" label="Both Equal"/>
-  <int value="1" label="Both Different"/>
-  <int value="2" label="Only Same Email"/>
-  <int value="3" label="Only Same Id"/>
-  <int value="4" label="Email Fallback"/>
-</enum>
-
 <enum name="SigninAccountReconcilorState">
   <int value="0" label="OK">
     The account reconcilor has finished running and is up-to-date.
@@ -88723,13 +88721,6 @@
   <int value="3" label="Credentials missing"/>
 </enum>
 
-<enum name="SigninInvestigatedScenario">
-  <int value="0" label="First-time sign in"/>
-  <int value="1" label="Upgrade high risk (deprecated 07-2019)"/>
-  <int value="2" label="Same account"/>
-  <int value="3" label="Different account"/>
-</enum>
-
 <enum name="SigninIOSDeviceRestoreSentinelError">
   <int value="0" label="No error"/>
   <int value="1" label="Failed to create sentinel file"/>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 0d477227..b49c288 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -814,6 +814,26 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.IncognitoInterstitial"
+    enum="IncognitoInterstitialActionType" expires_after="2022-11-08">
+  <owner>qpubert@google.com</owner>
+  <owner>djean@chromium.org</owner>
+  <summary>
+    Logged when the Incognito Interstitial is dismissed, with a value which
+    depends on what user action led to the dismissal.
+  </summary>
+</histogram>
+
+<histogram name="IOS.IncognitoInterstitial.Settings"
+    enum="IncognitoInterstitialSettingsActionType" expires_after="2022-11-08">
+  <owner>qpubert@google.com</owner>
+  <owner>djean@chromium.org</owner>
+  <summary>
+    Logged when the &quot;Ask to Open Links from Other Apps in Incognito&quot;
+    setting is enabled or disabled by the user.
+  </summary>
+</histogram>
+
 <histogram name="IOS.IPH.DefaultSite.Presented" enum="BooleanHit"
     expires_after="2023-02-28">
   <owner>gambard@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 95e2dfb..07e1978 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1622,16 +1622,6 @@
   </summary>
 </histogram>
 
-<histogram name="PasswordManager.ImportPasswordFromCSVResult"
-    enum="PasswordImportFromCSVResult" expires_after="2023-01-01">
-  <owner>vasilii@chromium.org</owner>
-  <owner>src/components/password_manager/OWNERS</owner>
-  <summary>
-    The response code of successful or failed password import attempt from a CSV
-    file. Recorded when the user imports passwords within the password settings.
-  </summary>
-</histogram>
-
 <histogram name="PasswordManager.iOS.InfoBar.PasswordSave" enum="Boolean"
     expires_after="2022-10-16">
   <owner>djean@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index e06210f5..334baa1 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -104,18 +104,6 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.AccountEquality" enum="SigninAccountEquality"
-    expires_after="2022-09-06">
-  <owner>droger@chromium.org</owner>
-  <owner>skym@chromium.org</owner>
-  <summary>
-    There are two separate ways to test for account equality, using the account
-    id or the email. Historically the email was always used, but going forward
-    email will be modifiable. Now when we check account equality we use both
-    approaches and emit this metric to capture if they agreed or not.
-  </summary>
-</histogram>
-
 <histogram name="Signin.AccountFetcher.AccountAvatarFetchTime" units="ms"
     expires_after="2022-12-25">
   <owner>triploblastic@chromium.org</owner>
@@ -525,17 +513,6 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.InvestigatedScenario" enum="SigninInvestigatedScenario"
-    expires_after="2022-12-12">
-  <owner>treib@chromium.org</owner>
-  <owner>mmoskvitin@google.com</owner>
-  <summary>
-    Recorded when Sync is turned on in a profile. Records whether this is the
-    first time Sync is turned on in this profile or, if not, whether Sync was
-    previously turned on for the same or for a different account.
-  </summary>
-</histogram>
-
 <histogram name="Signin.IOSDeviceRestoreIdentityCountAfter" units="identities"
     expires_after="2023-04-01">
   <owner>jlebel@chromium.org</owner>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index dbd3ae8..303fbe5 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -32,7 +32,7 @@
 blink_perf.webgl_fast_call,"kbr@chromium.org, enga@chromium.org, mslekova@chromium.org, junov@chromium.org, webgl-team@google.com",Blink>WebGL,https://bit.ly/blink-perf-benchmarks,
 blink_perf.webgpu,"enga@chromium.org, cwallez@chromium.org, webgpu-developers@google.com",Blink>WebGPU,https://bit.ly/blink-perf-benchmarks,
 blink_perf.webgpu_fast_call,"enga@chromium.org, cwallez@chromium.org, mslekova@chromium.org, junov@chromium.org, webgpu-developers@google.com",Blink>WebGPU,https://bit.ly/blink-perf-benchmarks,
-chrome_sizes,"heiserya@chromium.org, johnchen@chromium.org",Build,https://chromium.googlesource.com/chromium/src/+/HEAD/tools/binary_size/README.md#resource_sizes_py,
+chrome_sizes,johnchen@chromium.org,Build,https://chromium.googlesource.com/chromium/src/+/HEAD/tools/binary_size/README.md#resource_sizes_py,
 components_perftests,csharrison@chromium.org,,,
 dawn_perf_tests,"enga@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU>Dawn,https://dawn.googlesource.com/dawn/+/HEAD/src/tests/perf_tests/README.md,
 desktop_ui,"yuhengh@chromium.org, tluk@chromium.org, romanarora@chromium.org",UI>Browser,https://chromium.googlesource.com/chromium/src/+/main/docs/speed/benchmark/harnesses/desktop_ui.md,smoke_test
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 6d787ed..c7d35e3 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -1494,7 +1494,7 @@
 OTHER_BENCHMARKS.update({
     'chrome_sizes':
     BenchmarkMetadata(
-        emails='heiserya@chromium.org, johnchen@chromium.org',
+        emails='johnchen@chromium.org',
         component='Build',
         documentation_url=(
             'https://chromium.googlesource.com/chromium/'
diff --git a/ui/accessibility/ax_mode.h b/ui/accessibility/ax_mode.h
index 56306c7..895fa7b9 100644
--- a/ui/accessibility/ax_mode.h
+++ b/ui/accessibility/ax_mode.h
@@ -71,7 +71,8 @@
 
   // Update this to include the last supported mode flag. If you add
   // another, be sure to update the stream insertion operator for
-  // logging and debugging.
+  // logging and debugging, as well as AccessibilityModeFlagEnum (and
+  // related metrics callsites, see: |ModeFlagHistogramValue|).
   static constexpr uint32_t kLastModeFlag = 1 << 7;
 
   constexpr AXMode() : flags_(0) {}
@@ -107,6 +108,9 @@
     UMA_AX_MODE_INLINE_TEXT_BOXES = 2,
     UMA_AX_MODE_SCREEN_READER = 3,
     UMA_AX_MODE_HTML = 4,
+    UMA_AX_MODE_HTML_METADATA = 5,
+    UMA_AX_MODE_LABEL_IMAGES = 6,
+    UMA_AX_MODE_PDF = 7,
 
     // This must always be the last enum. It's okay for its value to
     // increase, but none of the other enum values may change.
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
index 01dbebb..77ff4b48 100644
--- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
+++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -72,6 +72,31 @@
             mVerticalScrollDirectionChangeListeners = new ObserverList<>();
 
     /**
+     * Handles cursor updates for stylus writing.
+     */
+    public interface StylusWritingCursorHandler {
+        /**
+         * @param currentView the current view to set the cursor.
+         * @return true if cursor update was handled.
+         */
+        boolean didHandleCursorUpdate(View currentView);
+    }
+
+    private StylusWritingCursorHandler mStylusWritingCursorHandler;
+
+    // Whether the current hovered element's action is stylus writable or not.
+    private boolean mHoverActionStylusWritable;
+
+    /**
+     * Sets a handler to handle the stylus writing cursor updates.
+     *
+     * @param handler the handler object.
+     */
+    public void setStylusWritingCursorHandler(StylusWritingCursorHandler handler) {
+        mStylusWritingCursorHandler = handler;
+    }
+
+    /**
      * Create and return a basic implementation of {@link ViewAndroidDelegate}.
      * @param containerView {@link ViewGroup} to be used as a container view.
      * @return a new instance of {@link ViewAndroidDelegate}.
@@ -253,6 +278,12 @@
     public void onCursorChanged(int cursorType) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return;
 
+        // Allow stylus writing handler to override the cursor.
+        if (mHoverActionStylusWritable && mStylusWritingCursorHandler != null
+                && mStylusWritingCursorHandler.didHandleCursorUpdate(getContainerViewGroup())) {
+            return;
+        }
+
         int pointerIconType = PointerIcon.TYPE_ARROW;
         switch (cursorType) {
             case CursorType.NONE:
@@ -379,6 +410,11 @@
         ApiHelperForN.setPointerIcon(containerView, icon);
     }
 
+    @CalledByNative
+    private void setHoverActionStylusWritable(boolean stylusWritable) {
+        mHoverActionStylusWritable = stylusWritable;
+    }
+
     /**
      * Called whenever the background color of the page changes as notified by Blink.
      * @param color The new ARGB color of the page background.
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc
index 88f52f45..987194e 100644
--- a/ui/android/view_android.cc
+++ b/ui/android/view_android.cc
@@ -442,6 +442,15 @@
   }
 }
 
+void ViewAndroid::SetHoverActionStylusWritable(bool stylus_writable) {
+  ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
+  if (delegate.is_null())
+    return;
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_ViewAndroidDelegate_setHoverActionStylusWritable(env, delegate,
+                                                        stylus_writable);
+}
+
 void ViewAndroid::OnBackgroundColorChanged(unsigned int color) {
   ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
   if (delegate.is_null())
diff --git a/ui/android/view_android.h b/ui/android/view_android.h
index d9983159..3df8a03 100644
--- a/ui/android/view_android.h
+++ b/ui/android/view_android.h
@@ -169,6 +169,7 @@
       const gfx::Size& size,
       absl::optional<base::TimeDelta> deadline_override = absl::nullopt);
   void OnCursorChanged(const Cursor& cursor);
+  void SetHoverActionStylusWritable(bool stylus_writable);
   void OnBackgroundColorChanged(unsigned int color);
   void OnTopControlsChanged(float top_controls_offset,
                             float top_content_offset,
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
index c53b85e..b4d6631d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Zibil qutusunu boşaldın</translation>
 <translation id="5163869187418756376">Paylaşma alınmadı. Bağlantını yoxlayın və yenidən cəhd edin.</translation>
 <translation id="516592729076796170">US Programmer Dvorak</translation>
+<translation id="5172749059808361023">Məhdudiyyət detalları</translation>
 <translation id="5177526793333269655">Eskiz görünüşü</translation>
 <translation id="5194713942430106590">Sütunu azalan sıra ilə çeşidləmək üçün klikləyin.</translation>
 <translation id="5211614973734216083">Farer</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
index 411b7f4..7f72700 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -285,10 +285,12 @@
 <translation id="3479552764303398839">এখনই নয়</translation>
 <translation id="3486821258960016770">মঙ্গোলিয়ান</translation>
 <translation id="3495304270784461826"><ph name="COUNT" />টি ত্রুটি৷</translation>
+<translation id="3495810061346586977">এই ফাইলটি গোপনীয় এবং অ্যাডমিনিস্ট্রেটর নীতির মাধ্যমে প্রযোজ্য বিধিনিষেধ পালন করেই এটি শেয়ার করা হয়। <ph name="BEGIN_LINK_HELP" />আরও জানুন<ph name="END_LINK_HELP" /></translation>
 <translation id="3509680540198371098"><ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, সিগন্যাল: <ph name="SIGNAL_STRENGTH" />%, বিবরণ</translation>
 <translation id="3522708245912499433">পর্তুগিজ</translation>
 <translation id="3524311639100184459">সতর্কতা: এই ফাইলগুলি অস্থায়ী এবং ডিস্কের জায়গা খালি করতে হয়ত অটোমেটিক মুছে ফেলা হবে।  <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">ফোল্ডার</translation>
+<translation id="3548125359243647069">একটি ভুল পিন অনেকবার লেখা হয়েছে।</translation>
 <translation id="3549797760399244642">drive.google.com এ যান...</translation>
 <translation id="3553048479571901246"><ph name="APP_NAME" /> ব্যবহার করে ফাইল খুলতে, সেগুলি প্রথমে Windows ফাইল ফোল্ডারে কপি করে রাখুন।</translation>
 <translation id="3556731189587832921">ইংরেজি (মার্কিন যুক্তরাষ্ট্র) ভাষায় ইন্টারন্যাশনাল পিসি কীবোর্ড</translation>
@@ -614,6 +616,7 @@
 <translation id="6267547857941397424"><ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="PHONE_NAME" /> সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, ফোনের ব্যাটারি <ph name="BATTERY_STATUS" />%, কানেক্ট করুন</translation>
 <translation id="6269630227984243955">মালয়</translation>
 <translation id="6287852322318138013">এই ফাইলটি খোলার জন্য একটি অ্যাপ্লিকেশান বেছে নিন</translation>
+<translation id="6295542640242147836">সিম কার্ড লক করা</translation>
 <translation id="6296410173147755564">ভুল PUK দিয়েছেন</translation>
 <translation id="6312403991423642364">অজানা নেটওয়ার্ক ত্রুটি</translation>
 <translation id="6317608858038767920">কাস্টম নেমসার্ভার <ph name="INPUT_INDEX" /></translation>
@@ -723,6 +726,7 @@
 <translation id="7189874332498648577"><ph name="NUMBER_OF_GB" /> জিবি</translation>
 <translation id="7191454237977785534">ফাইল এই রূপে সেভ করুন</translation>
 <translation id="7229570126336867161">EVDO এর প্রয়োজন</translation>
+<translation id="7230898482850090046">আপনার অ্যাডমিনিস্ট্রেটর "সিম কার্ড লক করা" সেটিং বন্ধ করার অনুরোধ জানিয়েছেন</translation>
 <translation id="7238097264433196391">ড্রাইভের নাম</translation>
 <translation id="7238643356913091553"><ph name="NETWORK_NAME" />, বিবরণ</translation>
 <translation id="7246947237293279874">এফটিপি প্রক্সি</translation>
@@ -755,6 +759,7 @@
 <translation id="7505167922889582512">লুকানো ফাইল দেখুন</translation>
 <translation id="7514365320538308">ডাউনলোড করুন</translation>
 <translation id="751507702149411736">বেলারুশীয়</translation>
+<translation id="7521790570754130607">মোবাইল ডেটা ব্যবহার করতে পিন লাগবে</translation>
 <translation id="7532029025027028521">ফার্সি লিপ্যন্তর</translation>
 <translation id="7544830582642184299">Linux অ্যাপকে আপনার Google Drive-এ ফাইল অ্যাক্সেস করার অনুমতি দিন। পরিবর্তনগুলি আপনার অন্যান্য ডিভাইসের সাথে সিঙ্ক হয়ে যাবে।</translation>
 <translation id="7547009467130558110">স্নিকার</translation>
@@ -779,6 +784,7 @@
 <translation id="76959938259365003">ট্র্যাশ খালি করা যায়নি।</translation>
 <translation id="770015031906360009">গ্রীক</translation>
 <translation id="7705251383879779343"><ph name="FILE_NAME" /> কপি করা হয়েছে।</translation>
+<translation id="7708271999969613024">এই নেটওয়ার্ক ব্যবহার করতে, আপনার পরিষেবা প্রদানকারীর থেকে পাওয়া ৮-সংখ্যার 'পার্সোনাল আনব্লকিং কী' (PUK) লিখতে হবে।</translation>
 <translation id="7711920809702896782">ইমেজর তথ্য</translation>
 <translation id="7724603315864178912">কাটুন</translation>
 <translation id="7730494089396812859">ক্লাউড ব্যাক-আপের বিশদ বিবরণ দেখায়</translation>
@@ -874,6 +880,7 @@
 <translation id="8437209419043462667">মার্কিন যুক্তরাষ্ট্রীয়</translation>
 <translation id="8452135315243592079">সিম কার্ড পাওয়া যাচ্ছে না</translation>
 <translation id="8456681095658380701">ভুল নাম</translation>
+<translation id="8457767749626250697">আপনার সিম কার্ড লক করা আছে</translation>
 <translation id="8459404855768962328">এই আইটেম কপি করলে, এটি শেয়ার করা ফোল্ডার '<ph name="DESTINATION_NAME" />' দেখতে পাওয়া প্রতিটি ব্যক্তির সাথে শেয়ার হয়ে যাবে।</translation>
 <translation id="8461467696380332069">কোনও ফাইলে রাইট-ক্লিক করুন এবং শেল্ফে আপনার ফাইল দ্রুত অ্যাক্সেস করার জন্য "শেল্ফে পিন করুন" বিকল্পটি বেছে নিন।</translation>
 <translation id="8461914792118322307">প্রক্সি</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
index 9ca1192..cd9c0f3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -486,7 +486,7 @@
 <translation id="5159560892333415631">Isprazni Otpad</translation>
 <translation id="5163869187418756376">Dijeljenje nije uspjelo. Provjerite vezu i pokušajte ponovo kasnije.</translation>
 <translation id="516592729076796170">SAD programer Dvorak</translation>
-<translation id="5172749059808361023">Pojedinosti ograničenja</translation>
+<translation id="5172749059808361023">Detalji o ograničenju</translation>
 <translation id="5177526793333269655">Prikaz minijatura</translation>
 <translation id="5194713942430106590">Kliknite da poredate kolonu uzlaznim poretkom.</translation>
 <translation id="5211614973734216083">farski</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
index 7acea2b..d3829674 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Gwagio'r Bin Sbwriel</translation>
 <translation id="5163869187418756376">Wedi methu â rhannu. Gwiriwch eich cysylltiad a rhowch gynnig arall arni'n nes ymlaen.</translation>
 <translation id="516592729076796170">Dvorak Rhaglennwr UDA</translation>
+<translation id="5172749059808361023">Manylion cyfyngiad</translation>
 <translation id="5177526793333269655">Gwedd fân-lun</translation>
 <translation id="5194713942430106590">Cliciwch i drefnu'r golofn mewn trefn esgynnol.</translation>
 <translation id="5211614973734216083">Ffaroes</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
index f95be88..44b920ed 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Hustu zaborrontzia</translation>
 <translation id="5163869187418756376">Ezin izan da partekatu. Egiaztatu konektatuta zaudela eta saiatu berriro geroago.</translation>
 <translation id="516592729076796170">AEBko programatzaileen Dvorak teklatua</translation>
+<translation id="5172749059808361023">Murrizketen xehetasunak</translation>
 <translation id="5177526793333269655">Irudi txikien ikuspegia</translation>
 <translation id="5194713942430106590">Egin klik zutabea goranzko ordenan ezartzeko.</translation>
 <translation id="5211614973734216083">Faroetarra</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
index 3f734e8..0795112 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">خالی کردن حذف‌شده‌ها</translation>
 <translation id="5163869187418756376">اشتراک‌گذاری انجام نشد. اتصال خود را بررسی کرده، بعداً دوباره امتحان کنید.</translation>
 <translation id="516592729076796170">دووراک آمریکایی برنامه‌نویس‌ها</translation>
+<translation id="5172749059808361023">جزئیات محدودیت</translation>
 <translation id="5177526793333269655">نمای تصویر کوچک</translation>
 <translation id="5194713942430106590">کلیک کنید تا ستون به‌صورت صعودی مرتب شود.</translation>
 <translation id="5211614973734216083">فاروئی</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
index b89ecc6b..cf1391d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Tyhjennä roskakori</translation>
 <translation id="5163869187418756376">Jakaminen epäonnistui. Tarkista internetyhteytesi ja yritä myöhemmin uudelleen.</translation>
 <translation id="516592729076796170">US, Dvorak ohjelmoijille</translation>
+<translation id="5172749059808361023">Rajoitustiedot</translation>
 <translation id="5177526793333269655">Pikkukuvanäkymä</translation>
 <translation id="5194713942430106590">Klikkaa, jos haluat lajitella nousevaan järjestykseen.</translation>
 <translation id="5211614973734216083">fääri</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
index 57fd421..17d528c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Kosongkan Sampah</translation>
 <translation id="5163869187418756376">Gagal berbagi. Periksa sambungan Anda dan coba lagi nanti.</translation>
 <translation id="516592729076796170">Programmer Dvorak AS</translation>
+<translation id="5172749059808361023">Detail pembatasan</translation>
 <translation id="5177526793333269655">Tampilan thumbnail</translation>
 <translation id="5194713942430106590">Klik untuk mengurutkan kolom dari atas ke bawah.</translation>
 <translation id="5211614973734216083">Faroe</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
index f3064e4..4c773d1 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Tæma ruslið</translation>
 <translation id="5163869187418756376">Mistókst að deila. Athugaðu nettenginguna og reyndu aftur síðar.</translation>
 <translation id="516592729076796170">Bandarískt Dvorak-lyklaborð fyrir forritara</translation>
+<translation id="5172749059808361023">Upplýsingar um takmörkun</translation>
 <translation id="5177526793333269655">Smámyndayfirlit</translation>
 <translation id="5194713942430106590">Smelltu til að raða dálkinum í hækkandi röð.</translation>
 <translation id="5211614973734216083">Færeyska</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
index 56f74b3..6b00fd9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Svuota cestino</translation>
 <translation id="5163869187418756376">Condivisione non riuscita. Controlla la connessione e riprova più tardi.</translation>
 <translation id="516592729076796170">US Programmer Dvorak</translation>
+<translation id="5172749059808361023">Dettagli limitazioni</translation>
 <translation id="5177526793333269655">Visualizzazione Miniature</translation>
 <translation id="5194713942430106590">Fai clic per ordinare la colonna in ordine decrescente.</translation>
 <translation id="5211614973734216083">Faroese</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
index 9c84630..7c63c98d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -285,10 +285,12 @@
 <translation id="3479552764303398839">ახლა არა</translation>
 <translation id="3486821258960016770">მონღოლური</translation>
 <translation id="3495304270784461826"><ph name="COUNT" /> შეცდომა.</translation>
+<translation id="3495810061346586977">ეს ფაილი კონფიდენციალურია და ექვემდებარე ადმინისტრატორის მიერ დადგენილი წესებით განსაზღვრულ შეზღუდვებს. <ph name="BEGIN_LINK_HELP" />შეიტყვეთ მეტი<ph name="END_LINK_HELP" /></translation>
 <translation id="3509680540198371098">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, დეტალები</translation>
 <translation id="3522708245912499433">პორტუგალიური</translation>
 <translation id="3524311639100184459">გაფრთხილება: ეს ფაილები დროებითია და შეიძლება ავტომატურად წაიშალოს დისკზე ადგილის გასათავისუფლებლად.  <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">საქაღალდე</translation>
+<translation id="3548125359243647069">არასწორი PIN-კოდი ზედმეტად ბევრჯერ შეიყვანეთ.</translation>
 <translation id="3549797760399244642">drive.google.com-ზე გადასვლა…</translation>
 <translation id="3553048479571901246">ფაილების <ph name="APP_NAME" />-ით გასახსნელად, პირველ რიგში, დააკოპირეთ ისინი Windows-ის ფაილების საქაღალდეში.</translation>
 <translation id="3556731189587832921">ინგლისური (აშშ) საერთაშორისო PC კლავიატურით</translation>
@@ -614,6 +616,7 @@
 <translation id="6267547857941397424">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="PHONE_NAME" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, ტელეფონის ბატარეა: <ph name="BATTERY_STATUS" />%, დაკავშირება</translation>
 <translation id="6269630227984243955">მალაიური</translation>
 <translation id="6287852322318138013">აირჩიეთ პროგრამა ამ ფაილის გასახსნელად</translation>
+<translation id="6295542640242147836">SIM ბარათის ჩაკეტვა</translation>
 <translation id="6296410173147755564">PUK-კოდი არასწორია</translation>
 <translation id="6312403991423642364">ქსელის უცნობი შეცდომა</translation>
 <translation id="6317608858038767920">სახელების მორგებული სერვერი <ph name="INPUT_INDEX" /></translation>
@@ -723,6 +726,7 @@
 <translation id="7189874332498648577"><ph name="NUMBER_OF_GB" /> გბაიტი</translation>
 <translation id="7191454237977785534">ფაილის შენახვა, როგორც</translation>
 <translation id="7229570126336867161">საჭიროა EVDO</translation>
+<translation id="7230898482850090046">თქვენმა ადმინისტრატორმა მოითხოვა „SIM ბარათის ჩაკეტვის“ პარამეტრის გამორთვა</translation>
 <translation id="7238097264433196391">დისკის სახელი</translation>
 <translation id="7238643356913091553"><ph name="NETWORK_NAME" />, დეტალები</translation>
 <translation id="7246947237293279874">FTP პროქსი-სერვერი</translation>
@@ -755,6 +759,7 @@
 <translation id="7505167922889582512">დამალული ფაილების ჩვენება</translation>
 <translation id="7514365320538308">ჩამოტვირთვა</translation>
 <translation id="751507702149411736">ბელორუსული</translation>
+<translation id="7521790570754130607">მობილური ინტერნეტის გამოსაყენებლად საჭიროა PIN-კოდის გამოყენება</translation>
 <translation id="7532029025027028521">სპარსული ტრანსლიტერაცია</translation>
 <translation id="7544830582642184299">მიეცით Linux აპებს თქვენს Google Drive-ში არსებულ ფაილებზე წვდომის ნებართვა. ცვლილებები სინქრონიზებული იქნება თქვენს სხვა მოწყობილობებთან.</translation>
 <translation id="7547009467130558110">ბოტასი</translation>
@@ -779,6 +784,7 @@
 <translation id="76959938259365003">წაშლილები ვერ გასუფთავდა.</translation>
 <translation id="770015031906360009">ბერძნული</translation>
 <translation id="7705251383879779343"><ph name="FILE_NAME" /> დაკოპირდა.</translation>
+<translation id="7708271999969613024">ამ ქსელის გამოსაყენებლად უნდა შეიყვანოთ განბლოკვის პერსონალური 8-ციფრიანი გასაღები (PUK), რომელიც თქვენმა ოპერატორმა მოგაწოდათ.</translation>
 <translation id="7711920809702896782">სურათის ინფორმაცია</translation>
 <translation id="7724603315864178912">ამოჭრა</translation>
 <translation id="7730494089396812859">ღრუბელოვანი სივრცის სარეზერვო მეხსიერების დეტალების ჩვენება</translation>
@@ -874,6 +880,7 @@
 <translation id="8437209419043462667">US</translation>
 <translation id="8452135315243592079">აკლია SIM ბარათი</translation>
 <translation id="8456681095658380701">არასწორი სახელი</translation>
+<translation id="8457767749626250697">თქვენი SIM-ბარათი ჩაკეტილია</translation>
 <translation id="8459404855768962328">ამ ერთეულის კოპირების შემთხვევაში ის გაზიარდება ყველასთან, ვისაც შეუძლია საზიარო საქაღალდის „<ph name="DESTINATION_NAME" />“ ნახვა.</translation>
 <translation id="8461467696380332069">თაროდან თქვენს ფაილებზე სწრაფი წვდომა რომ იქონიოთ, მარჯვენა ღილაკით დააწკაპუნეთ ფაილზე და აირჩიეთ „თაროზე ჩამაგრება“.</translation>
 <translation id="8461914792118322307">პროქსი</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
index 1186a616..321b6dfe 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Себетті босату</translation>
 <translation id="5163869187418756376">Бөлісу сәтсіз аяқталды. Байланысты тексеріңіз және кейінірек қайталап көріңіз.</translation>
 <translation id="516592729076796170">АҚШ Бағдарламашы Дворак</translation>
+<translation id="5172749059808361023">Шектеу мәліметтері</translation>
 <translation id="5177526793333269655">Нобай көрінісі</translation>
 <translation id="5194713942430106590">Бағанды өсу ретімен сұрыптау үшін басыңыз.</translation>
 <translation id="5211614973734216083">Фарер</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index 1b232e4..6651740 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">휴지통 비우기</translation>
 <translation id="5163869187418756376">공유하지 못했습니다. 인터넷 연결을 확인하고 나중에 다시 시도해 주세요.</translation>
 <translation id="516592729076796170">미국 프로그래머 드보락</translation>
+<translation id="5172749059808361023">제한사항 세부정보</translation>
 <translation id="5177526793333269655">미리보기 이미지 보기</translation>
 <translation id="5194713942430106590">열을 오름차순으로 정렬하려면 클릭하세요.</translation>
 <translation id="5211614973734216083">페로어</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
index fd00db2..1097dc7 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Таштандыны бошотуу</translation>
 <translation id="5163869187418756376">Бөлүшүлбөй калды. Туташууңузду текшерип туруп, бир аздан кийин кайталап көрүңүз.</translation>
 <translation id="516592729076796170">АКШ Программачы Dvorak</translation>
+<translation id="5172749059808361023">Чектөө жөнүндө маалымат</translation>
 <translation id="5177526793333269655">Бармакбасым көрүнүшү</translation>
 <translation id="5194713942430106590">Тилкени чоңойгон ыраатта иреттөө үчүн чыкылдатыңыз.</translation>
 <translation id="5211614973734216083">Фарерче</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
index 9ad48b9..a040c18 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -289,6 +289,7 @@
 <translation id="3522708245912499433">Португал</translation>
 <translation id="3524311639100184459">Анхааруулга: Эдгээр файл нь түр зуурын файлууд бөгөөд дискийн зайг чөлөөлөхийн тулд автоматаар устгаж болно.  <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Хавтас</translation>
+<translation id="3548125359243647069">ПИН-г хэт олон удаа буруу оруулсан байна.</translation>
 <translation id="3549797760399244642">drive.google.com руу очно уу...</translation>
 <translation id="3553048479571901246">Файлуудыг <ph name="APP_NAME" />-р нээхийн тулд эхлээд тэдгээрийг Windows-н файлын фолдерт хуулна уу.</translation>
 <translation id="3556731189587832921">Олон улсын компьютерын гартай англи (АНУ)</translation>
@@ -612,6 +613,7 @@
 <translation id="6267547857941397424">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="PHONE_NAME" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />%, утасны батарей <ph name="BATTERY_STATUS" />%, холбогдох</translation>
 <translation id="6269630227984243955">Малай</translation>
 <translation id="6287852322318138013">Аппликейшнээ сонгоод файлаа нээ</translation>
+<translation id="6295542640242147836">SIM-г түгжих</translation>
 <translation id="6296410173147755564">PUK буруу байна</translation>
 <translation id="6312403991423642364">Сүлжээний алдаа мэдэгдэхгүй байна</translation>
 <translation id="6317608858038767920">Захиалгат нэрийн сервер <ph name="INPUT_INDEX" /></translation>
@@ -721,6 +723,7 @@
 <translation id="7189874332498648577"><ph name="NUMBER_OF_GB" /> ГБ</translation>
 <translation id="7191454237977785534">Файлыг ...хэлбэрээр хадгалах</translation>
 <translation id="7229570126336867161">EVDO хэрэгтэй байна</translation>
+<translation id="7230898482850090046">Таны администратор танаас "SIM-г түгжих" тохиргоог унтраахыг хүссэн</translation>
 <translation id="7238097264433196391">Драйвын нэр</translation>
 <translation id="7238643356913091553"><ph name="NETWORK_NAME" />, дэлгэрэнгүй мэдээлэл</translation>
 <translation id="7246947237293279874">FTP прокси</translation>
@@ -753,6 +756,7 @@
 <translation id="7505167922889582512">Далд файлуудыг харуулах</translation>
 <translation id="7514365320538308">Татаж авах</translation>
 <translation id="751507702149411736">Беларус</translation>
+<translation id="7521790570754130607">Мобайл дата ашиглахын тулд ПИН шаардлагатай</translation>
 <translation id="7532029025027028521">Перс галиг</translation>
 <translation id="7544830582642184299">Linux-н аппуудад Google Драйвынхаа файлуудад хандах зөвшөөрөл өгнө үү. Өөрчлөлтүүдийг таны бусад төхөөрөмжид синк хийнэ.</translation>
 <translation id="7547009467130558110">Пүүз</translation>
@@ -777,6 +781,7 @@
 <translation id="76959938259365003">Хогийн савыг хоосолж чадсангүй.</translation>
 <translation id="770015031906360009">Грек</translation>
 <translation id="7705251383879779343"><ph name="FILE_NAME" />-г хуулсан.</translation>
+<translation id="7708271999969613024">Энэ сүлжээг ашиглахын тулд та оператор компаниас олгосон 8 оронтой Блокоос гаргах хувийн түлхүүр (PUK)-г оруулах шаардлагатай.</translation>
 <translation id="7711920809702896782">Зургийн мэдээлэл</translation>
 <translation id="7724603315864178912">Хайчлах</translation>
 <translation id="7730494089396812859">Cloud-н дэлгэрэнгүй мэдээллийг харуулах</translation>
@@ -872,6 +877,7 @@
 <translation id="8437209419043462667">АНУ</translation>
 <translation id="8452135315243592079">SIM карт олдсонгүй</translation>
 <translation id="8456681095658380701">Хүчин төгөлдөр бус нэр</translation>
+<translation id="8457767749626250697">Таны SIM-г түгжсэн</translation>
 <translation id="8459404855768962328">Энэ зүйлийг хуулснаар үүнийг '<ph name="DESTINATION_NAME" />' хуваалцсан фолдерыг харах боломжтой бүх хүнтэй хуваалцана.</translation>
 <translation id="8461467696380332069">Тавиур дахь файлууддаа шуурхай хандахын тулд файл дээр хулганын баруун талыг товшиж, "Тавиурт бэхлэх"-ийг сонгоно уу.</translation>
 <translation id="8461914792118322307">Прокси</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index e59e79d..7792a7e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -285,6 +285,7 @@
 <translation id="3479552764303398839">Nu acum</translation>
 <translation id="3486821258960016770">Mongolă</translation>
 <translation id="3495304270784461826"><ph name="COUNT" /> erori.</translation>
+<translation id="3495810061346586977">Fișierul este confidențial și se supune restricțiilor impuse de politica implementată de administrator. <ph name="BEGIN_LINK_HELP" />Află mai multe<ph name="END_LINK_HELP" /></translation>
 <translation id="3509680540198371098">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, detalii</translation>
 <translation id="3522708245912499433">Portugheză</translation>
 <translation id="3524311639100184459">Atenție: aceste fișiere sunt temporare și pot fi șterse automat pentru a elibera spațiu pe disc.  <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
index c94619f..7e2c31d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -285,6 +285,7 @@
 <translation id="3479552764303398839">Teraz nie</translation>
 <translation id="3486821258960016770">Mongolská klávesnica</translation>
 <translation id="3495304270784461826">Počet chýb: <ph name="COUNT" />.</translation>
+<translation id="3495810061346586977">Tento súbor je dôverný a na základe pravidiel správcu sa naň vzťahujú obmedzenia. <ph name="BEGIN_LINK_HELP" />Ďalšie informácie<ph name="END_LINK_HELP" /></translation>
 <translation id="3509680540198371098"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation>
 <translation id="3522708245912499433">Portugalčina</translation>
 <translation id="3524311639100184459">Upozornenie: Tieto súbory sú dočasné a môžu byť automaticky odstránené na uvoľnenie priestoru na disku.  <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
index a7999faf..b19fd018 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Futa Kila Kitu Kwenye Tupio</translation>
 <translation id="5163869187418756376">Kushiriki kumeshindwa. Angalia muunganisho wako na ujaribu tena baadaye.</translation>
 <translation id="516592729076796170">Kibodi ya Programmer Dvorak, Marekani</translation>
+<translation id="5172749059808361023">Maelezo ya faili iliyozuiwa</translation>
 <translation id="5177526793333269655">Mwonekano wa vijipicha</translation>
 <translation id="5194713942430106590">Bofya ili upange safu wima katika mpangilio wa kupanda.</translation>
 <translation id="5211614973734216083">Kifaroe</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
index 925ff89..c87cccd 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">ట్రాష్‌ను ఖాళీ చేయి</translation>
 <translation id="5163869187418756376">షేర్ చేయడం విఫలమైంది. మీ కనెక్షన్‌ను చెక్ చేసి, తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="516592729076796170">US ప్రోగ్రామర్ డ్వోరక్</translation>
+<translation id="5172749059808361023">నియంత్రణ వివరాలు</translation>
 <translation id="5177526793333269655">సూక్ష్మచిత్ర వీక్షణ</translation>
 <translation id="5194713942430106590">నిలువు వరుసను ఆరోహణ క్రమంలో వర్గీకరించడానికి క్లిక్ చేయండి.</translation>
 <translation id="5211614973734216083">ఫారోస్</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index b885ee1..3739348f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -289,6 +289,7 @@
 <translation id="3522708245912499433">โปรตุเกส</translation>
 <translation id="3524311639100184459">ข้อควรระวัง: ไฟล์เหล่านี้ใช้ชั่วคราวและอาจถูกลบโดยอัตโนมัติเพื่อเพิ่มพื้นที่ว่างในดิสก์  <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">โฟลเดอร์</translation>
+<translation id="3548125359243647069">ป้อน PIN ไม่ถูกต้องหลายครั้งเกินไป</translation>
 <translation id="3549797760399244642">ไปยัง drive.google.com...</translation>
 <translation id="3553048479571901246">หากต้องการเปิดไฟล์ด้วย <ph name="APP_NAME" /> ให้คัดลอกไปที่โฟลเดอร์ไฟล์ของ Windows ก่อน</translation>
 <translation id="3556731189587832921">อังกฤษ (สหรัฐฯ) ด้วยแป้นพิมพ์พีซีแบบสากล</translation>
@@ -615,6 +616,7 @@
 <translation id="6267547857941397424">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, แบตเตอรี่โทรศัพท์ <ph name="BATTERY_STATUS" />%, เชื่อมต่อ</translation>
 <translation id="6269630227984243955">มาเลย์</translation>
 <translation id="6287852322318138013">เลือกแอปที่จะเปิดไฟล์นี้</translation>
+<translation id="6295542640242147836">ล็อกซิม</translation>
 <translation id="6296410173147755564">PUK ไม่ถูกต้อง</translation>
 <translation id="6312403991423642364">ข้อผิดพลาดเครือข่ายที่ไม่รู้จัก</translation>
 <translation id="6317608858038767920"><ph name="INPUT_INDEX" /> ของ Nameserver ที่กำหนดเอง</translation>
@@ -724,6 +726,7 @@
 <translation id="7189874332498648577"><ph name="NUMBER_OF_GB" /> GB</translation>
 <translation id="7191454237977785534">บันทึกแฟ้มเป็น</translation>
 <translation id="7229570126336867161">ต้องใช้ EVDO</translation>
+<translation id="7230898482850090046">ผู้ดูแลระบบขอให้คุณปิดการตั้งค่า "ล็อกซิม"</translation>
 <translation id="7238097264433196391">ชื่อไดรฟ์</translation>
 <translation id="7238643356913091553"><ph name="NETWORK_NAME" />, รายละเอียด</translation>
 <translation id="7246947237293279874">พร็อกซี FTP</translation>
@@ -756,6 +759,7 @@
 <translation id="7505167922889582512">แสดงไฟล์ที่ซ่อนไว้</translation>
 <translation id="7514365320538308">ดาวน์โหลด</translation>
 <translation id="751507702149411736">เบลารุส</translation>
+<translation id="7521790570754130607">ต้องมี PIN เพื่อใช้อินเทอร์เน็ตมือถือ</translation>
 <translation id="7532029025027028521">เปอร์เซีย (การทับศัพท์)</translation>
 <translation id="7544830582642184299">ให้สิทธิ์แอป Linux เข้าถึงไฟล์ใน Google ไดรฟ์ การเปลี่ยนแปลงจะซิงค์กับอุปกรณ์อื่นๆ ของคุณ</translation>
 <translation id="7547009467130558110">รองเท้าผ้าใบ</translation>
@@ -780,6 +784,7 @@
 <translation id="76959938259365003">ล้างข้อมูลในถังขยะไม่สำเร็จ</translation>
 <translation id="770015031906360009">กรีก</translation>
 <translation id="7705251383879779343">คัดลอก <ph name="FILE_NAME" /> แล้ว</translation>
+<translation id="7708271999969613024">หากต้องการใช้เครือข่ายนี้ คุณต้องป้อนคีย์การเลิกบล็อกส่วนตัว (PUK) 8 หลักจากผู้ให้บริการ</translation>
 <translation id="7711920809702896782">ข้อมูลรูปภาพ</translation>
 <translation id="7724603315864178912">ตัด</translation>
 <translation id="7730494089396812859">แสดงรายละเอียดของข้อมูลสำรองในระบบคลาวด์</translation>
@@ -875,6 +880,7 @@
 <translation id="8437209419043462667">สหรัฐอเมริกา</translation>
 <translation id="8452135315243592079">ไม่มีซิมการ์ด</translation>
 <translation id="8456681095658380701">ชื่อไม่ถูกต้อง</translation>
+<translation id="8457767749626250697">ซิมล็อกอยู่</translation>
 <translation id="8459404855768962328">การคัดลอกรายการนี้จะเป็นการแชร์กับทุกคนที่ดูโฟลเดอร์ที่แชร์ "<ph name="DESTINATION_NAME" />" ได้</translation>
 <translation id="8461467696380332069">คลิกขวาที่ไฟล์แล้วเลือก "ปักหมุดที่ชั้นวาง" เพื่อให้เข้าถึงไฟล์ในชั้นวางได้อย่างรวดเร็ว</translation>
 <translation id="8461914792118322307">พร็อกซี</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
index 99352cae..b57228a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Çöp Kutusunu Boşalt</translation>
 <translation id="5163869187418756376">Paylaşılamadı. Bağlantınızı kontrol edin ve daha sonra tekrar deneyin.</translation>
 <translation id="516592729076796170">ABD Programcı Dvorak</translation>
+<translation id="5172749059808361023">Kısıtlama ayrıntıları</translation>
 <translation id="5177526793333269655">Küçük resim görünümü</translation>
 <translation id="5194713942430106590">Sütunu artan düzende sıralamak için tıklayın.</translation>
 <translation id="5211614973734216083">Faroe dili</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
index 151b96aa..44613a46 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -485,6 +485,7 @@
 <translation id="5159560892333415631">Очистити кошик</translation>
 <translation id="5163869187418756376">Помилка надання доступу. Перевірте з’єднання та повторіть спробу пізніше.</translation>
 <translation id="516592729076796170">Розкладка Дворака для програмістів (США)</translation>
+<translation id="5172749059808361023">Відомості щодо обмеження</translation>
 <translation id="5177526793333269655">Перегляд ескізів</translation>
 <translation id="5194713942430106590">Натисніть, щоб відсортувати стовпці в порядку зростання.</translation>
 <translation id="5211614973734216083">Фарерська</translation>
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index 2c281dc..5d968d1 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -2028,14 +2028,8 @@
         if (!metadata || metadata.length !== 1) {
           return;
         }
-        const sourceUrl = metadata[0].sourceUrl;
-        if (sourceUrl) {
-          try {
-            chrome.fileManagerPrivate.showDlpRestrictionDetails(sourceUrl);
-          } catch (error) {
-            console.warn('Error showing DlpRestrictionDetails ', error);
-          }
-        }
+        // TODO(crbug.com/1346254): Get the details and show the modal with the
+        // returned information.
       }
 
       /** @override */
diff --git a/ui/gl/EGL/eglextchromium.h b/ui/gl/EGL/eglextchromium.h
deleted file mode 100644
index 1fbdc16..0000000
--- a/ui/gl/EGL/eglextchromium.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2013 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.
-
-// This file contains Chromium-specific EGL extensions declarations.
-
-#ifndef UI_GL_EGL_EGLEXTCHROMIUM_H_
-#define UI_GL_EGL_EGLEXTCHROMIUM_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <EGL/eglplatform.h>
-
-/* EGLSyncControlCHROMIUM requires 64-bit uint support */
-#if KHRONOS_SUPPORT_INT64
-#ifndef EGL_CHROMIUM_sync_control
-#define EGL_CHROMIUM_sync_control 1
-typedef khronos_uint64_t EGLuint64CHROMIUM;
-#ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(
-    EGLDisplay dpy, EGLSurface surface, EGLuint64CHROMIUM *ust,
-    EGLuint64CHROMIUM *msc, EGLuint64CHROMIUM *sbc);
-#endif /* EGL_EGLEXT_PROTOTYPES */
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCVALUESCHROMIUMPROC)
-    (EGLDisplay dpy, EGLSurface surface, EGLuint64CHROMIUM *ust,
-     EGLuint64CHROMIUM *msc, EGLuint64CHROMIUM *sbc);
-#endif /* EGL_CHROMIUM_sync_control */
-
-#ifndef EGL_ANGLE_sync_control_rate
-#define EGL_ANGLE_sync_control_rate 1
-#ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE(EGLDisplay dpy,
-                                                 EGLSurface surface,
-                                                 EGLint* numerator,
-                                                 EGLint* denominator);
-#endif /* EGL_EGLEXT_PROTOTYPES */
-typedef EGLBoolean(EGLAPIENTRYP PFNEGLGETMSCRATEANGLEPROC)(EGLDisplay dpy,
-                                                           EGLSurface surface,
-                                                           EGLint* numerator,
-                                                           EGLint* denominator);
-#endif /* EGL_ANGLE_sync_control_rate */
-#endif /* KHRONOS_SUPPORT_INT64 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#define  // UI_GL_EGL_EGLEXTCHROMIUM_H_
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 898e471..1203312c 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -3024,8 +3024,6 @@
   ],
   [EGL_FUNCTIONS, 'egl', [
       'EGL/eglext.h',
-      # Files below are Chromium-specific and shipped with Chromium sources.
-      'EGL/eglextchromium.h',
     ],
     [
       'EGL_ANGLE_d3d_share_handle_client_buffer',